Compare commits
168 Commits
Author | SHA1 | Date | |
---|---|---|---|
7fe8dad1f6 | |||
858766ea3e | |||
81fe9afbb7 | |||
65c615f256 | |||
9c5c699fe7 | |||
dcede1703a | |||
5d33ab019d | |||
f7ec452ea0 | |||
20260e8933 | |||
d7704934e8 | |||
f1eafb0a6e | |||
27d6a8281a | |||
c5128aa497 | |||
a59394646c | |||
6851169dbe | |||
36b3486194 | |||
5d8ccd1d6d | |||
c713fe9bf4 | |||
f682e5e694 | |||
d2d776fd01 | |||
641a5e9673 | |||
93d90a2bde | |||
a54504f31c | |||
03111368e0 | |||
a973b2aec6 | |||
a7adf0e6c6 | |||
c10761128e | |||
9965f169b2 | |||
8bf755c15c | |||
d0b2a7db62 | |||
780192da3b | |||
07c1f08d18 | |||
25ac847266 | |||
63c8342b86 | |||
ea2bd7ba10 | |||
cec2d1e8af | |||
1b289b688b | |||
0cf91580cb | |||
392ebc8d07 | |||
9068aab12b | |||
85327a4e69 | |||
021260b3a4 | |||
4def93d7c5 | |||
9aca0c19fc | |||
3fcbdbdd82 | |||
4b7b6eebca | |||
2da0cf1178 | |||
141cb24e3d | |||
35483487af | |||
ec3a805326 | |||
780d8bcf8d | |||
f9a12cac64 | |||
03c2df3277 | |||
a7e98ccb3d | |||
1014d2f361 | |||
89f20a64d5 | |||
fae36a74af | |||
7e57c59b6f | |||
3141e12f4c | |||
4ebe9f595a | |||
50f0e85884 | |||
e28b5d48d4 | |||
562e96e09e | |||
6c5088f811 | |||
d5ccb7ad02 | |||
ade5176d21 | |||
d2f6d51c19 | |||
92b60a251d | |||
de9f2d7e67 | |||
4de5e3bd11 | |||
86a33e8f65 | |||
89010b6a8a | |||
48d4668a7a | |||
a2755dc4d2 | |||
52e67c6bfc | |||
5a6f23a7d0 | |||
d1b36f2022 | |||
284579181b | |||
20fcb05538 | |||
e1a2074ef5 | |||
fa3e33dab9 | |||
300a98b858 | |||
5986671bcb | |||
efd5c46143 | |||
62c1a1da35 | |||
ebbc7c983d | |||
173fc4bf7b | |||
47f1eadd27 | |||
8c06277a92 | |||
395f482f11 | |||
bbd21a84d6 | |||
fcf680e9bd | |||
8ac848c812 | |||
dd591af224 | |||
e5a7a81198 | |||
7a5228a5d0 | |||
fe5c8e520a | |||
96d354a8a8 | |||
02480b1c54 | |||
4fd321cccf | |||
4641c9456f | |||
498b5ec095 | |||
912be2ddfd | |||
6d7f8c5841 | |||
a782f4731a | |||
6e067bffd5 | |||
4a4007ba41 | |||
c9db08a2c6 | |||
5ec303b95c | |||
3d0523a298 | |||
3469ad6f8d | |||
d791738d84 | |||
355c341d36 | |||
1adb4a2bac | |||
03c0339e9a | |||
1649811015 | |||
14f16f9b2c | |||
66d3c6c7e8 | |||
7f27432222 | |||
870b26a85a | |||
aa6cb58dca | |||
6398a42dad | |||
cfc3eae77c | |||
438b745d32 | |||
21473f5b9b | |||
c85b6f9507 | |||
019b00209e | |||
6c11dbcdf4 | |||
91197c5cec | |||
9e5d9787c7 | |||
1c11a4823b | |||
d457c3e8d0 | |||
2ae21efb7b | |||
30211aa006 | |||
485a42758c | |||
0da5a5a349 | |||
efca68672a | |||
41ce2f66fa | |||
9393fc166e | |||
cfb4382941 | |||
aaca24ff5b | |||
0ce9be1a2b | |||
a88eb7fe02 | |||
06e4f7fb5c | |||
1b36485208 | |||
3b54cefa95 | |||
52857c9541 | |||
d10c2a20bd | |||
e2482cdf91 | |||
c045d87e4c | |||
34e23934b0 | |||
354196e01e | |||
bb2e8d0aef | |||
90f4e895d4 | |||
58c554caa6 | |||
6c688a7e59 | |||
71244065bb | |||
bbb1bc3dd7 | |||
806d0e2cff | |||
e0c4af1cae | |||
475821564e | |||
9d65dd605b | |||
67eec44411 | |||
280b555f86 | |||
2fcd32de0d | |||
78694e86a2 | |||
aeaa3d7bc1 | |||
af8ce3fccf |
2
.gitignore
vendored
@ -15,7 +15,7 @@ clients/win10/app/bld
|
|||||||
clients/win10/*.opendb
|
clients/win10/*.opendb
|
||||||
clients/**/bin/**
|
clients/**/bin/**
|
||||||
clients/**/obj/**
|
clients/**/obj/**
|
||||||
clients/electron/projects
|
electron-out
|
||||||
hexcache
|
hexcache
|
||||||
|
|
||||||
*.user
|
*.user
|
||||||
|
@ -7,6 +7,10 @@ PXT ([Microsoft Programming Experience Toolkit](https://github.com/Microsoft/pxt
|
|||||||
|
|
||||||
[](https://travis-ci.org/Microsoft/pxt-microbit)
|
[](https://travis-ci.org/Microsoft/pxt-microbit)
|
||||||
|
|
||||||
|
## Issue tracking
|
||||||
|
|
||||||
|
All issue tracking for this repo happens at https://github.com/Microsoft/pxt, see you there!
|
||||||
|
|
||||||
## Local server
|
## Local server
|
||||||
|
|
||||||
The local server allows to run the editor and the documentation from your computer.
|
The local server allows to run the editor and the documentation from your computer.
|
||||||
|
2
clients/electron/.gitignore
vendored
@ -1,2 +0,0 @@
|
|||||||
node_modules
|
|
||||||
projects
|
|
@ -1,5 +0,0 @@
|
|||||||
# PXT micro:bit Electron app
|
|
||||||
|
|
||||||
A very basic wrapper around the web app. To install, copy the contents of this
|
|
||||||
directory to somewhere outside the main `pxt-microbit` repository. Then run `npm
|
|
||||||
install && npm start`.
|
|
@ -1,15 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>code the micro:bit</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<webview id="webview" style="position:absolute; left:0; top:0; right:0; bottom:0"/>
|
|
||||||
<script>
|
|
||||||
const webview = document.getElementById("webview")
|
|
||||||
const url = `http://localhost:3232/${window.location.hash}`
|
|
||||||
webview.src = url
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,39 +0,0 @@
|
|||||||
const {app, BrowserWindow, Menu} = require('electron')
|
|
||||||
const pxt = require('pxt-core')
|
|
||||||
const path = require('path')
|
|
||||||
|
|
||||||
let win
|
|
||||||
|
|
||||||
const cliPath = path.join(process.cwd(), "node_modules/pxt-microbit")
|
|
||||||
|
|
||||||
function startServerAndCreateWindow() {
|
|
||||||
pxt.mainCli(cliPath, ["serve", "-no-browser"])
|
|
||||||
createWindow()
|
|
||||||
}
|
|
||||||
|
|
||||||
function createWindow () {
|
|
||||||
win = new BrowserWindow({
|
|
||||||
width: 800,
|
|
||||||
height: 600,
|
|
||||||
title: "code the micro:bit"
|
|
||||||
})
|
|
||||||
Menu.setApplicationMenu(null)
|
|
||||||
win.loadURL(`file://${__dirname}/index.html#local_token=${pxt.globalConfig.localToken}`)
|
|
||||||
win.on('closed', () => {
|
|
||||||
win = null
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
app.on('ready', startServerAndCreateWindow)
|
|
||||||
|
|
||||||
app.on('window-all-closed', () => {
|
|
||||||
if (process.platform !== 'darwin') {
|
|
||||||
app.quit()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
app.on('activate', () => {
|
|
||||||
if (win === null) {
|
|
||||||
createWindow()
|
|
||||||
}
|
|
||||||
})
|
|
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"name" : "code-the-microbit",
|
|
||||||
"version" : "1.0.0",
|
|
||||||
"description": "Blocks / Javascript editor",
|
|
||||||
"author": "Microsoft",
|
|
||||||
"main" : "main.js",
|
|
||||||
"scripts": {
|
|
||||||
"start": "node_modules/.bin/electron ."
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"electron": "*",
|
|
||||||
"pxt-microbit": "*"
|
|
||||||
}
|
|
||||||
}
|
|
60
cmds/cmds.ts
@ -1,60 +0,0 @@
|
|||||||
/// <reference path="../node_modules/pxt-core/typings/node/node.d.ts"/>
|
|
||||||
/// <reference path="../node_modules/pxt-core/built/pxtlib.d.ts" />
|
|
||||||
|
|
||||||
import * as fs from "fs";
|
|
||||||
import * as path from "path";
|
|
||||||
import * as child_process from "child_process";
|
|
||||||
|
|
||||||
let writeFileAsync: any = Promise.promisify(fs.writeFile)
|
|
||||||
let execAsync: (cmd: string, options?: { cwd?: string }) => Promise<Buffer> = Promise.promisify(child_process.exec)
|
|
||||||
let readDirAsync = Promise.promisify(fs.readdir)
|
|
||||||
|
|
||||||
|
|
||||||
export function deployCoreAsync(res: ts.pxtc.CompileResult) {
|
|
||||||
return getBitDrivesAsync()
|
|
||||||
.then(drives => {
|
|
||||||
if (drives.length == 0) {
|
|
||||||
console.log("cannot find any drives to deploy to");
|
|
||||||
return Promise.resolve(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log(`copy ${ts.pxtc.BINARY_HEX} to ` + drives.join(", "));
|
|
||||||
|
|
||||||
let writeHexFile = (filename: string) => {
|
|
||||||
return writeFileAsync(filename + ts.pxtc.BINARY_HEX, res.outfiles[ts.pxtc.BINARY_HEX])
|
|
||||||
.then(() => console.log("wrote hex file to " + filename));
|
|
||||||
};
|
|
||||||
|
|
||||||
return Promise.map(drives, d => writeHexFile(d))
|
|
||||||
.then(() => drives.length);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function getBitDrivesAsync(): Promise<string[]> {
|
|
||||||
if (process.platform == "win32") {
|
|
||||||
const rx = new RegExp("^([A-Z]:).* " + pxt.appTarget.compile.deployDrives)
|
|
||||||
return execAsync("wmic PATH Win32_LogicalDisk get DeviceID, VolumeName, FileSystem")
|
|
||||||
.then(buf => {
|
|
||||||
let res: string[] = []
|
|
||||||
buf.toString("utf8").split(/\n/).forEach(ln => {
|
|
||||||
let m = rx.exec(ln)
|
|
||||||
if (m) {
|
|
||||||
res.push(m[1] + "/")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
return res
|
|
||||||
})
|
|
||||||
}
|
|
||||||
else if (process.platform == "darwin") {
|
|
||||||
const rx = new RegExp(pxt.appTarget.compile.deployDrives)
|
|
||||||
return readDirAsync("/Volumes")
|
|
||||||
.then(lst => lst.filter(s => rx.test(s)).map(s => "/Volumes/" + s + "/"))
|
|
||||||
} else if (process.platform == "linux") {
|
|
||||||
const rx = new RegExp(pxt.appTarget.compile.deployDrives)
|
|
||||||
const user = process.env["USER"]
|
|
||||||
return readDirAsync(`/media/${user}`)
|
|
||||||
.then(lst => lst.filter(s => rx.test(s)).map(s => `/media/${user}/${s}/`))
|
|
||||||
} else {
|
|
||||||
return Promise.resolve([])
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +1,6 @@
|
|||||||
|
/// <reference path="../node_modules/pxt-core/typings/globals/node/index.d.ts"/>
|
||||||
|
/// <reference path="../node_modules/pxt-core/built/pxtlib.d.ts" />
|
||||||
|
|
||||||
import * as path from "path";
|
import * as path from "path";
|
||||||
export let pxtCore = require("pxt-core");
|
export let pxtCore = require("pxt-core");
|
||||||
// require.resolve() gives path to [pxt dir]/built/pxt.js, so move up twice to get pxt root dir
|
// require.resolve() gives path to [pxt dir]/built/pxt.js, so move up twice to get pxt root dir
|
||||||
|
@ -11,4 +11,4 @@ Math.random(5);
|
|||||||
|
|
||||||
## See Also
|
## See Also
|
||||||
|
|
||||||
[logic](/blocks/logic), [loops](/blocks/loops), [math](/blocks/math), [variables](/blocks/variables)
|
[logic](/blocks/logic), [loops](/blocks/loops), [math](/blocks/math), [variables](/blocks/variables), [on-start](/blocks/on-start)
|
@ -86,12 +86,14 @@ if (led.point(1,1) && led.point(2,2)) {
|
|||||||
When you compare two Numbers, you get a Boolean value, such as the comparison `x < 5` in the code below:
|
When you compare two Numbers, you get a Boolean value, such as the comparison `x < 5` in the code below:
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
|
input.onButtonPressed(Button.A, () => {
|
||||||
let x = Math.random(5)
|
let x = Math.random(5)
|
||||||
if(x < 5) {
|
if(x < 5) {
|
||||||
basic.showString("low");
|
basic.showString("low");
|
||||||
} else {
|
} else {
|
||||||
basic.showString("high");
|
basic.showString("high");
|
||||||
}
|
}
|
||||||
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
See the documentation on [Numbers](/reference/types/number) for more information on comparing two Numbers. You can also [compare strings](/reference/types/string-functions) using the `equals` function.
|
See the documentation on [Numbers](/reference/types/number) for more information on comparing two Numbers. You can also [compare strings](/reference/types/string-functions) using the `equals` function.
|
||||||
|
@ -14,14 +14,16 @@ Click on the dark blue gear icon (see above) to add an *else* or *if* to the cur
|
|||||||
|
|
||||||
### Example: adjusting screen brightness
|
### Example: adjusting screen brightness
|
||||||
|
|
||||||
|
If the [light level](/reference/input/light-level) is `< 100`, this code sets the brightness to `255` when the button A is pressed:
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
|
input.onButtonPressed(Button.A, () => {
|
||||||
if(input.lightLevel()<100){
|
if(input.lightLevel()<100){
|
||||||
led.setBrightness(255);
|
led.setBrightness(255);
|
||||||
}
|
}
|
||||||
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
If the [light level](/reference/input/light-level) is `< 100`, this code sets the brightness to `255`:
|
|
||||||
|
|
||||||
### See also
|
### See also
|
||||||
|
|
||||||
[while loop](/blocks/loops/while), [for](/blocks/loops/for), [boolean](/blocks/logic/boolean)
|
[while loop](/blocks/loops/while), [for](/blocks/loops/for), [boolean](/blocks/logic/boolean)
|
||||||
|
@ -4,14 +4,21 @@
|
|||||||
|
|
||||||
Run part of the program the number of times you say.
|
Run part of the program the number of times you say.
|
||||||
|
|
||||||
|
```block
|
||||||
|
for(let i = 0; i <= 4; ++i) {
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### Example: Count to 4
|
### Example: Count to 4
|
||||||
|
|
||||||
This program will show the numbers 0, 1, 2, 3, and 4 one after another on the LED screen.
|
This program will show the numbers 0, 1, 2, 3, and 4 one after another on the LED screen.
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
|
input.onButtonPressed(Button.A, () => {
|
||||||
for(let i = 0; i < 5; ++i) {
|
for(let i = 0; i < 5; ++i) {
|
||||||
basic.showNumber(i)
|
basic.showNumber(i)
|
||||||
}
|
}
|
||||||
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
### See also
|
### See also
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
Repeat code while a [Boolean](/blocks/logic/boolean) `condition` is true.
|
Repeat code while a [Boolean](/blocks/logic/boolean) `condition` is true.
|
||||||
|
|
||||||
```blocks
|
```block
|
||||||
while(true) {
|
while(true) {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@ -16,11 +16,13 @@ The condition is tested before any code runs. Which means that if the condition
|
|||||||
The following example uses a while loop to make a diagonal line on the LED screen (points `0, 0`, `1, 1`, `2, 2`, `3, 3`, `4, 4`).
|
The following example uses a while loop to make a diagonal line on the LED screen (points `0, 0`, `1, 1`, `2, 2`, `3, 3`, `4, 4`).
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
|
input.onButtonPressed(Button.A, () => {
|
||||||
let index = 4;
|
let index = 4;
|
||||||
while(index >= 0) {
|
while(index >= 0) {
|
||||||
led.plot(index, index);
|
led.plot(index, index);
|
||||||
index--;
|
index--;
|
||||||
}
|
}
|
||||||
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
### See also
|
### See also
|
||||||
|
22
docs/blocks/on-start.md
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# On Start
|
||||||
|
|
||||||
|
An event that runs when the program starts.
|
||||||
|
|
||||||
|
The ``on start`` is a special event that runs when the program starts, before any other event.
|
||||||
|
Use this event to initialize your program.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
In this example, ``on start`` sets a dimmer brightness on the screen and the button handler shows a string.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
input.onButtonPressed(Button.A, () => {
|
||||||
|
basic.showString("Hello!")
|
||||||
|
})
|
||||||
|
led.setBrightness(50)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## What about JavaScript?
|
||||||
|
|
||||||
|
``on-start`` only exists in the block editor. In JavaScript, all code executes sequentially from the first line.
|
@ -33,7 +33,7 @@ basic.forever(() => {
|
|||||||
|
|
||||||
When this program runs, you will see a smiley face, then a blank
|
When this program runs, you will see a smiley face, then a blank
|
||||||
screen, then a smiley again -- it never stops! (That's because of the
|
screen, then a smiley again -- it never stops! (That's because of the
|
||||||
``forever`` block.)
|
`[basic.forever(() => {})]` block.)
|
||||||
|
|
||||||
Click **Download** to move your program to the @boardname@!
|
Click **Download** to move your program to the @boardname@!
|
||||||
Make sure to follow the instructions.
|
Make sure to follow the instructions.
|
||||||
|
@ -17,7 +17,7 @@ input.onButtonPressed(Button.A, () => {
|
|||||||
|
|
||||||
#### ~hint
|
#### ~hint
|
||||||
|
|
||||||
The ``showString`` block can show letters, numbers, and punctuation
|
The `[basic.showString("HI")]` block can show letters, numbers, and punctuation
|
||||||
on the @boardname@ screen.
|
on the @boardname@ screen.
|
||||||
|
|
||||||
#### ~
|
#### ~
|
||||||
@ -33,7 +33,7 @@ input.onButtonPressed(Button.B, () => {
|
|||||||
#### ~hint
|
#### ~hint
|
||||||
|
|
||||||
You can find the letter `B` by clicking the letter `A` on the
|
You can find the letter `B` by clicking the letter `A` on the
|
||||||
``onButtonPressed`` block.
|
`[input.onButtonPressed(Button.A, () => {})]` block.
|
||||||
|
|
||||||
#### ~
|
#### ~
|
||||||
|
|
||||||
|
@ -23,8 +23,8 @@ input.onButtonPressed(Button.B, () => {
|
|||||||
```
|
```
|
||||||
### ~hint
|
### ~hint
|
||||||
|
|
||||||
The ``pick random true or false`` block randomly tells the ``if``
|
The `[Math.randomBoolean()]` block randomly tells the ``if``
|
||||||
block `true` or `false`. If the ``pick`` block picked `true`, the
|
block `true` or `false`. If value picked is `true`, the
|
||||||
``if`` block shows the letter `H`. Otherwise, it shows the letter `T`.
|
``if`` block shows the letter `H`. Otherwise, it shows the letter `T`.
|
||||||
|
|
||||||
That's it!
|
That's it!
|
||||||
|
@ -9,7 +9,7 @@ There are 25 bright LEDs on the @boardname@ screen. Let's use them to create som
|
|||||||
### Happy unhappy face
|
### Happy unhappy face
|
||||||
|
|
||||||
Draw an unhappy face instead of the blank screen. Click on the dots
|
Draw an unhappy face instead of the blank screen. Click on the dots
|
||||||
in the second ``show leds`` block until it matches the blocks below.
|
in the second `[basic.showLeds("")]` block until it matches the blocks below.
|
||||||
Now you have an **animation** (cartoon) that shows a happy face,
|
Now you have an **animation** (cartoon) that shows a happy face,
|
||||||
then an unhappy one, then a happy one again, forever (or until
|
then an unhappy one, then a happy one again, forever (or until
|
||||||
you turn off your @boardname@)!
|
you turn off your @boardname@)!
|
||||||
@ -36,7 +36,7 @@ Click **Download** to move your program to the @boardname@!
|
|||||||
|
|
||||||
### Your turn!
|
### Your turn!
|
||||||
|
|
||||||
Pile up more ``show leds`` blocks to create an animation! Create an
|
Pile up more `[basic.showLeds("")]` blocks to create an animation! Create an
|
||||||
animation with at least 5 pictures. What does this animation show?
|
animation with at least 5 pictures. What does this animation show?
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
@ -87,12 +87,6 @@ basic.forever(() => {
|
|||||||
```
|
```
|
||||||
Click **Download** to move your program to the @boardname@!
|
Click **Download** to move your program to the @boardname@!
|
||||||
|
|
||||||
#### ~hint
|
|
||||||
|
|
||||||
You can find the ``show leds`` block in the **Basic** part of the editor.
|
|
||||||
|
|
||||||
#### ~
|
|
||||||
|
|
||||||
### ~button /getting-started/buttons
|
### ~button /getting-started/buttons
|
||||||
NEXT: BUTTONS
|
NEXT: BUTTONS
|
||||||
### ~
|
### ~
|
@ -1,3 +1,3 @@
|
|||||||
{
|
{
|
||||||
"appref": "v0.6.13"
|
"appref": "v0.6.36"
|
||||||
}
|
}
|
||||||
|
@ -66,6 +66,10 @@ Fun games to build with your @boardname@.
|
|||||||
|
|
||||||
```codecard
|
```codecard
|
||||||
[{
|
[{
|
||||||
|
"name": "Inchworm",
|
||||||
|
"url":"/projects/inchworm",
|
||||||
|
"imageUrl":"/static/mb/projects/inchworm.jpg"
|
||||||
|
}, {
|
||||||
"name": "Timing gates",
|
"name": "Timing gates",
|
||||||
"url":"/projects/timing-gates",
|
"url":"/projects/timing-gates",
|
||||||
"imageUrl":"/static/mb/projects/timing-gates.jpg"
|
"imageUrl":"/static/mb/projects/timing-gates.jpg"
|
||||||
|
@ -10,12 +10,10 @@ Welcome! This guided tutorial will show you how to program a script that display
|
|||||||
|
|
||||||
### ~
|
### ~
|
||||||
|
|
||||||
|
|
||||||
## Step 1
|
## Step 1
|
||||||
|
|
||||||
Create a loop that will continuously update the reading of the compass.
|
Create a loop that will continuously update the reading of the compass.
|
||||||
|
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
basic.forever(() => {
|
basic.forever(() => {
|
||||||
|
|
||||||
|
@ -2,8 +2,7 @@
|
|||||||
|
|
||||||
### ~avatar avatar
|
### ~avatar avatar
|
||||||
|
|
||||||
Use the LEDs to display a flashing heart, and then create
|
Use the LEDs to display a flashing heart!
|
||||||
an animation of a broken heart. :(
|
|
||||||
|
|
||||||
### ~
|
### ~
|
||||||
|
|
||||||
@ -38,7 +37,7 @@ basic.clearScreen();
|
|||||||
|
|
||||||
## Step 3
|
## Step 3
|
||||||
|
|
||||||
Put a [forever loop](/reference/basic/forever) around it.
|
Put a [forever loop](/reference/basic/forever) around it to repeat the animation.
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
basic.forever(() => {
|
basic.forever(() => {
|
||||||
@ -73,32 +72,37 @@ basic.pause(500);
|
|||||||
})
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
## Step 5
|
## Send your heartbeats over radio!
|
||||||
|
|
||||||
Add a second image of a broken heart.
|
Do you have a second @boardname@ at hand? You could use radio and send your heartbeats to other
|
||||||
|
@boardname@ and show a heart when you receive one.
|
||||||
|
|
||||||
|
* move the code in the **forever** inside
|
||||||
|
a [on data packet received](/reference/radio/on-data-packet-received) handler.
|
||||||
|
The handler will run whenever a message is received from another @boardname@.
|
||||||
|
* use [send number](/reference/radio/send-number) and [pause](/reference/basic/pause)
|
||||||
|
to broadcast a packet of data every second.
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
basic.forever(() => {
|
basic.forever(() => {
|
||||||
|
radio.sendNumber(0)
|
||||||
|
basic.pause(1000)
|
||||||
|
})
|
||||||
|
radio.onDataPacketReceived(({receivedNumber}) => {
|
||||||
basic.showLeds(`
|
basic.showLeds(`
|
||||||
. # . # .
|
. # . # .
|
||||||
# # # # #
|
# # # # #
|
||||||
# # # # #
|
# # # # #
|
||||||
. # # # .
|
. # # # .
|
||||||
. . # . .`
|
. . # . .`);
|
||||||
);
|
basic.pause(500)
|
||||||
basic.pause(500);
|
basic.clearScreen()
|
||||||
basic.clearScreen();
|
basic.pause(500)
|
||||||
basic.pause(500);
|
|
||||||
basic.showLeds(`
|
|
||||||
. # . # .
|
|
||||||
# . # # #
|
|
||||||
# . . . #
|
|
||||||
. # # # .
|
|
||||||
. . # . .`
|
|
||||||
);
|
|
||||||
basic.pause(500);
|
|
||||||
basic.clearScreen();
|
|
||||||
basic.pause(500);
|
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Download the .hex file onto both @boardname@ and try it out!
|
||||||
|
|
||||||
|
```package
|
||||||
|
radio
|
||||||
|
```
|
@ -10,7 +10,9 @@ Let's start by adding a variable where you can store data. Then rename the varia
|
|||||||
|
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
|
input.onButtonPressed(Button.A, () => {
|
||||||
let light = input.lightLevel();
|
let light = input.lightLevel();
|
||||||
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
We want to play music on button pressed in order to register an event handler that will execute whenever when you run a script and click on button pressed on the simulator. We must start by opening the Input drawer and adding `on button pressed` A. Then add a block `rest` to plays nothing for a `1/16` beat. Modify your code so that your code looks like this.
|
We want to play music on button pressed in order to register an event handler that will execute whenever when you run a script and click on button pressed on the simulator. We must start by opening the Input drawer and adding `on button pressed` A. Then add a block `rest` to plays nothing for a `1/16` beat. Modify your code so that your code looks like this.
|
||||||
|
40
docs/projects/inchworm.md
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
|
||||||
|
# Inchworm
|
||||||
|
|
||||||
|
### @description A inchworm like robot built with the micro:bit
|
||||||
|
|
||||||
|
### ~avatar avatar
|
||||||
|
|
||||||
|
Make a funny inchworm robot!
|
||||||
|
|
||||||
|
### ~
|
||||||
|
|
||||||
|
https://youtu.be/BiZLjugXMbM
|
||||||
|
|
||||||
|
## Duration
|
||||||
|
|
||||||
|
3 Activities, approx 30-45 min each based on familiarity with the coding concepts
|
||||||
|
|
||||||
|
## Materials
|
||||||
|
|
||||||
|
* Cardboard pieces (recycle!)
|
||||||
|
* Glue gun or Tape (masking, duct tape, and/or packing tape)
|
||||||
|
* Scissors that can cut cardboard
|
||||||
|
* 1 @boardname@, battery holder and 2 AAA batteries
|
||||||
|
* 3 Crocodile clips
|
||||||
|
* 1 micro servo 9g SG90
|
||||||
|
* 1 paper clip
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Activities
|
||||||
|
|
||||||
|
* [Servo](/projects/inchworm/servo)
|
||||||
|
* [Chassis](/projects/inchworm/chassis)
|
||||||
|
* [Code](/projects/inchworm/code)
|
||||||
|
|
||||||
|
### ~button /projects/inchworm/servo
|
||||||
|
|
||||||
|
Let's get started!
|
||||||
|
|
||||||
|
### ~
|
88
docs/projects/inchworm/chassis.md
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
# Chassis
|
||||||
|
### @description Building the cardboard inchworm
|
||||||
|
|
||||||
|
### ~avatar avatar
|
||||||
|
|
||||||
|
Turn a piece of cardboard into an inchworm!
|
||||||
|
|
||||||
|
### ~
|
||||||
|
|
||||||
|
## Duration: ~45 minutes
|
||||||
|
|
||||||
|
## Materials
|
||||||
|
* Cardboard
|
||||||
|
* Scissors or cutters
|
||||||
|
* glue gun or tape
|
||||||
|
* 1 paper clip
|
||||||
|
|
||||||
|
## Step 1: cardboard
|
||||||
|
|
||||||
|
Cutout a cardboard rectangle. You can use the @boardname@ as a ruler to figure out the size.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Step 2: center fold
|
||||||
|
|
||||||
|
Fold the cardboard in half over the short edge.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Step 3: legs
|
||||||
|
|
||||||
|
Fold each end so they rest flat on the ground.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Step 4: front teeth
|
||||||
|
|
||||||
|
Fold each corners on one end of the cardbard. This will be the front of the inchworm which is supposed to grip the ground.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Step 5: back teeth
|
||||||
|
|
||||||
|
Using a scissor or a cutter (watch the fingers!), cut out various strips in the other edge. Fold one after the other.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Step 6: mounting the board
|
||||||
|
|
||||||
|
Using tape or a glue gun, mount the @boardname@ on one side and the microservo on the cardobard.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Step 7: mounting the servo
|
||||||
|
|
||||||
|
Attach the servo on the **edge** of the other cardboard side.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Step 8: Cable clean up (optional)
|
||||||
|
|
||||||
|
Use tape to route the cables nicely on the inchworm.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Step 9: attaching paper clip to servo
|
||||||
|
|
||||||
|
Unfold a paper clip and attach it to the servo arm.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Step 10: attaching paper clip to cardboard
|
||||||
|
|
||||||
|
Slide the folder paper clip into the cardboard, and use tape to secure it.
|
||||||
|
You might need to toy around with the size of the clip so that the servo rotation opens the inchworm sufficiently.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## Step 11: it's ready!
|
||||||
|
|
||||||
|
Your inchworm is ready!
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### ~button /projects/inchworm/code
|
||||||
|
NEXT: Code
|
||||||
|
### ~
|
48
docs/projects/inchworm/code.md
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
# Code
|
||||||
|
### @description code to make the inchworm alive
|
||||||
|
|
||||||
|
### ~avatar avatar
|
||||||
|
|
||||||
|
Add code to make the inchworm move.
|
||||||
|
|
||||||
|
### ~
|
||||||
|
|
||||||
|
## Duration: ~30 minutes
|
||||||
|
|
||||||
|
## Step 1: walk forever
|
||||||
|
|
||||||
|
In order for the inchworm to move, the @boardname@ needs to command the servo to go between ``0`` and ``180`` degrees
|
||||||
|
at a certain pace. In the code below, the user pressed button ``A`` to launch the inchworm.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
input.onButtonPressed(Button.A, () => {
|
||||||
|
pins.servoWritePin(AnalogPin.P0, 0)
|
||||||
|
basic.pause(500)
|
||||||
|
pins.servoWritePin(AnalogPin.P0, 180)
|
||||||
|
basic.pause(500)
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### ~ hint
|
||||||
|
|
||||||
|
You may have noticed that the inchworm can be rather slow or simply won't move. Try to improve the design of your legs, teeth
|
||||||
|
so that the inchworm goes as fast as possible. Trying it on carpet also great helps avoiding skidding.
|
||||||
|
|
||||||
|
### ~
|
||||||
|
|
||||||
|
## Step 2: radio controlled inchworm
|
||||||
|
|
||||||
|
You will need 2 @boardname@ for this part. By using the radio, we can make the inchworm controlled by another @boardname@.
|
||||||
|
Download the code below to the @boardname@ on the inchworm and another "controller" @boardname@. Whenere A is pressed, the inchworm will move once.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
radio.onDataPacketReceived(({receivedNumber}) => {
|
||||||
|
pins.servoWritePin(AnalogPin.P0, 0)
|
||||||
|
basic.pause(500)
|
||||||
|
pins.servoWritePin(AnalogPin.P0, 180)
|
||||||
|
basic.pause(500)
|
||||||
|
})
|
||||||
|
input.onButtonPressed(Button.A, () => {
|
||||||
|
radio.sendNumber(0)
|
||||||
|
})
|
||||||
|
```
|
130
docs/projects/inchworm/servo.md
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
# Preparing the servo
|
||||||
|
### @description Connecting the servo to crocodile clips
|
||||||
|
|
||||||
|
### ~avatar avatar
|
||||||
|
|
||||||
|
Equip the microservo with crocodile clips.
|
||||||
|
|
||||||
|
### ~
|
||||||
|
|
||||||
|
## Duration: ~30 minutes
|
||||||
|
|
||||||
|
## Materials
|
||||||
|
* Cutting pliers or wire cutter
|
||||||
|
* Tape (masking, duct tape, and/or packing tape)
|
||||||
|
* 3 crocodile clips, yellow, red and black.
|
||||||
|
* 1 micro servo 9g (SG90)
|
||||||
|
|
||||||
|
## Using a microservo with the @boardname@
|
||||||
|
|
||||||
|
The @boardname@ provides just enough current to operate the SG90 microservo.
|
||||||
|
The servo requires 3 connections: GND, 3V and a logic pin.
|
||||||
|
In this tutorial, we will equip the servo with crocodile clips to make it easier to use.
|
||||||
|
However, you could also use a shield or female to crocodile clips to acheive the same effect.
|
||||||
|
|
||||||
|
If you are running a class or activity, you should consider preparing all servos before hand.
|
||||||
|
|
||||||
|
### ~ hint
|
||||||
|
|
||||||
|
Kitronik wrote an excellent in-depth guide about using servos with the @boardname@.
|
||||||
|
Check it out at https://www.kitronik.co.uk/blog/using-bbc-microbit-control-servo/ .
|
||||||
|
|
||||||
|
### ~
|
||||||
|
|
||||||
|
## Step 1: cutout the connector
|
||||||
|
|
||||||
|
Using the cutting pliers, cut out the dark plastic connector.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Step 2: strip out cables
|
||||||
|
|
||||||
|
Using the plier or a wire stripper, strip the plastic from the cables.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Step 3: threading the servo cablers
|
||||||
|
|
||||||
|
Thread the servo cables.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Step 4: crocobile clip claps
|
||||||
|
|
||||||
|
Cut a crocodile cable in two and strip out the casing.
|
||||||
|
If possible try to use the same cable colors as the servo!
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Step 5: thread cables together
|
||||||
|
|
||||||
|
Place the cables next to each other
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
... and thread them together.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### ~ hint
|
||||||
|
|
||||||
|
It is very **important** to ensure that there is a good connection between the 2 cables.
|
||||||
|
If the connection is weak, the microservo will not receive enough current and it will not work.
|
||||||
|
If you have access to a soldering iron, we strongly recommend to solver this connection.
|
||||||
|
|
||||||
|
### ~
|
||||||
|
|
||||||
|
## Step 4: protect the connection
|
||||||
|
|
||||||
|
Protect the connection with electrical or duct tape.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Step 5: repeat for all cables
|
||||||
|
|
||||||
|
Repeat the same process until all cables are connected.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Step 6: testing!
|
||||||
|
|
||||||
|
It's time to test that your connection are all proper and that the servo will function **when the @boardname@ is powered by battery**.
|
||||||
|
|
||||||
|
* Connect the microservo to the @boardname@. Black cable on ``GND``, red cable on ``3V`` and remaining cable on ``P0``.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### ~ hint
|
||||||
|
|
||||||
|
When attaching the crocodile clips to the pins, don't hesitate to grab the side of the board with the jaws.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
### ~
|
||||||
|
|
||||||
|
* Download the following code to your @boardname@
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
let a = 0
|
||||||
|
basic.forever(() => {
|
||||||
|
a = input.acceleration(Dimension.X)
|
||||||
|
pins.servoWritePin(AnalogPin.P0, pins.map(
|
||||||
|
a,
|
||||||
|
-512,
|
||||||
|
512,
|
||||||
|
0,
|
||||||
|
180
|
||||||
|
))
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
* When powered by USB, make sure that the servo moves when you tilt the board.
|
||||||
|
* When powered by batteries **only**, make sure that the servo moves when you tilt the board.
|
||||||
|
|
||||||
|
If your servo seems to sutter and stay stuck at a particular position, it means that it is not receiving enough power.
|
||||||
|
This is probably due to a weak connection or low battery level. Check each connection and check your batteries.
|
||||||
|
|
||||||
|
|
||||||
|
### ~button /projects/inchworm/chassis
|
||||||
|
NEXT: Chassis
|
||||||
|
### ~
|
@ -37,7 +37,7 @@ input.onButtonPressed(Button.B, () => {
|
|||||||
|
|
||||||
We will use the @boardname@'s compass to detect the magnet. Compass's tell us what direction we are pointing by detecting the Earth's magnetic field but they can also detect any other magnet nearby. We will use that to check if our magnet is next to the @boardname@ by using the [magnetic force](/reference/input/magnetic-force) block found in the input menu's 'more' section. As we only want to measure the strength we change the drop down to select 'strength':
|
We will use the @boardname@'s compass to detect the magnet. Compass's tell us what direction we are pointing by detecting the Earth's magnetic field but they can also detect any other magnet nearby. We will use that to check if our magnet is next to the @boardname@ by using the [magnetic force](/reference/input/magnetic-force) block found in the input menu's 'more' section. As we only want to measure the strength we change the drop down to select 'strength':
|
||||||
|
|
||||||
```blocks
|
```block
|
||||||
input.magneticForce(Dimension.Strength)
|
input.magneticForce(Dimension.Strength)
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -50,16 +50,19 @@ If you have ever played with magnets you know they have two ends, often called a
|
|||||||
So in the code below we will check if the absolute value of our magnetic field strength reading is more than 100 and save the result of that check in a new variable called 'isSwitched':
|
So in the code below we will check if the absolute value of our magnetic field strength reading is more than 100 and save the result of that check in a new variable called 'isSwitched':
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
let isSwitched = Math.abs(input.magneticForce(Dimension.Strength)) > 100
|
let force = Math.abs(input.magneticForce(Dimension.Strength));
|
||||||
|
let isSwitched = force > 100
|
||||||
```
|
```
|
||||||
## Step 4: running our 'magnet nearby' check all the time
|
## Step 4: running our 'magnet nearby' check all the time
|
||||||
|
|
||||||
At the moment our code to detect the magnet being nearby will only run once so we need to put it into a [forever](/reference/basic/forever) block so that it keeps getting run again and again checking for the magnet to come near to the @boardname@. We should also make sure 'isSwitched' is false when our program starts.
|
At the moment our code to detect the magnet being nearby will only run once so we need to put it into a [forever](/reference/basic/forever) block so that it keeps getting run again and again checking for the magnet to come near to the @boardname@. We should also make sure 'isSwitched' is false when our program starts.
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
|
let force = 0;
|
||||||
let isSwitched = false;
|
let isSwitched = false;
|
||||||
basic.forever(() => {
|
basic.forever(() => {
|
||||||
let isSwitched = Math.abs(input.magneticForce(Dimension.Strength)) > 100
|
force = Math.abs(input.magneticForce(Dimension.Strength));
|
||||||
|
isSwitched = force > 100
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -68,10 +71,11 @@ basic.forever(() => {
|
|||||||
Now we can check the value of our variable 'isSwitched' whenever we want and we will know that the magnet is nearby if it's value is 'true'. Let's use that to change how the buttons work and complete the code for our trick. We will add an 'if, else' block to each button's code and check if we should swap over what each button displays because 'isSwitched' is equal to true:
|
Now we can check the value of our variable 'isSwitched' whenever we want and we will know that the magnet is nearby if it's value is 'true'. Let's use that to change how the buttons work and complete the code for our trick. We will add an 'if, else' block to each button's code and check if we should swap over what each button displays because 'isSwitched' is equal to true:
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
|
let force = 0;
|
||||||
let isSwitched = false;
|
let isSwitched = false;
|
||||||
basic.forever(() => {
|
basic.forever(() => {
|
||||||
isSwitched = Math.abs(input.magneticForce(Dimension.Strength)) > 100
|
force = Math.abs(input.magneticForce(Dimension.Strength));
|
||||||
|
isSwitched = force > 100
|
||||||
})
|
})
|
||||||
|
|
||||||
input.onButtonPressed(Button.A, () => {
|
input.onButtonPressed(Button.A, () => {
|
||||||
|
@ -12,8 +12,8 @@ Use [show leds](/reference/basic/show-leds) to make a smiley face:
|
|||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
basic.showLeds(`
|
basic.showLeds(`
|
||||||
. # . # .
|
# # . # #
|
||||||
. # . # .
|
# # . # #
|
||||||
. . . . .
|
. . . . .
|
||||||
# . . . #
|
# . . . #
|
||||||
. # # # .`
|
. # # # .`
|
||||||
@ -22,56 +22,93 @@ basic.showLeds(`
|
|||||||
|
|
||||||
## Step 2
|
## Step 2
|
||||||
|
|
||||||
Add an input block for when [button A is pressed](/reference/input/button-is-pressed), and put a
|
Add an input block for when [button A is pressed](/reference/input/button-is-pressed),
|
||||||
frowny face inside it:
|
and **move** the smiley face inside it:
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
|
input.onButtonPressed(Button.A, () => {
|
||||||
basic.showLeds(`
|
basic.showLeds(`
|
||||||
. # . # .
|
# # . # #
|
||||||
. # . # .
|
# # . # #
|
||||||
. . . . .
|
. . . . .
|
||||||
# . . . #
|
# . . . #
|
||||||
. # # # .`
|
. # # # .`
|
||||||
);
|
);
|
||||||
input.onButtonPressed(Button.A, () => {
|
|
||||||
basic.showLeds(`
|
|
||||||
. # . # .
|
|
||||||
. # . # .
|
|
||||||
. . . . .
|
|
||||||
. # # # .
|
|
||||||
# . . . #`
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Try pressing button A!
|
||||||
|
|
||||||
## Step 3
|
## Step 3
|
||||||
|
|
||||||
Now add blocks so that when [button B is pressed](/reference/input/button-is-pressed), a smiley appears:
|
Now add blocks so that when [button B is pressed](/reference/input/on-button-pressed),
|
||||||
|
a frowney appears:
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
|
input.onButtonPressed(Button.A, () => {
|
||||||
basic.showLeds(`
|
basic.showLeds(`
|
||||||
. # . # .
|
# # . # #
|
||||||
. # . # .
|
# # . # #
|
||||||
. . . . .
|
. . . . .
|
||||||
# . . . #
|
# . . . #
|
||||||
. # # # .`
|
. # # # .`
|
||||||
);
|
);
|
||||||
input.onButtonPressed(Button.A, () => {
|
|
||||||
basic.showLeds(`
|
|
||||||
. # . # .
|
|
||||||
. # . # .
|
|
||||||
. . . . .
|
|
||||||
. # # # .
|
|
||||||
# . . . #`
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
input.onButtonPressed(Button.B, () => {
|
input.onButtonPressed(Button.B, () => {
|
||||||
basic.showLeds(`
|
basic.showLeds(`
|
||||||
. # . # .
|
# # . # #
|
||||||
. # . # .
|
# # . # #
|
||||||
. . . . .
|
. . . . .
|
||||||
# . . . #
|
. # # # .
|
||||||
. # # # .`
|
# . . . #`
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Try pressing ``A`` or ``B``!
|
||||||
|
|
||||||
|
## Send your smileys over radio
|
||||||
|
|
||||||
|
Do you have a second @boardname@ at hand? You could use radio and send your smileys or frownies to other
|
||||||
|
@boardname@.
|
||||||
|
|
||||||
|
Since radio can send numbers, we decide that ``0`` is the code for displaying a smiley
|
||||||
|
and ``1`` is the code for a frowney.
|
||||||
|
|
||||||
|
Change your code as follows:
|
||||||
|
* [radio send number](/reference/radio/send-number) sends a number
|
||||||
|
to any other @boardname@ in range
|
||||||
|
* [radio on data packet received](/reference/radio/on-data-packet-received) runs code
|
||||||
|
when data is received over radio
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
input.onButtonPressed(Button.A, () => {
|
||||||
|
radio.sendNumber(0)
|
||||||
|
})
|
||||||
|
input.onButtonPressed(Button.B, () => {
|
||||||
|
radio.sendNumber(1)
|
||||||
|
})
|
||||||
|
radio.onDataPacketReceived(({receivedNumber}) => {
|
||||||
|
if (receivedNumber == 0) {
|
||||||
|
basic.showLeds(`
|
||||||
|
# # . # #
|
||||||
|
# # . # #
|
||||||
|
. . . . .
|
||||||
|
# . . . #
|
||||||
|
. # # # .
|
||||||
|
`)
|
||||||
|
} else {
|
||||||
|
basic.showLeds(`
|
||||||
|
# # . # #
|
||||||
|
# # . # #
|
||||||
|
. . . . .
|
||||||
|
. # # # .
|
||||||
|
# . . . #
|
||||||
|
`)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
```package
|
||||||
|
radio
|
||||||
|
```
|
||||||
|
@ -18,15 +18,15 @@ and updates the screen with the direction.
|
|||||||
basic.forever(() => {
|
basic.forever(() => {
|
||||||
let heading = input.compassHeading()
|
let heading = input.compassHeading()
|
||||||
if (heading < 45) {
|
if (heading < 45) {
|
||||||
basic.showString("N", 100)
|
basic.showString("N")
|
||||||
} else if (heading < 135) {
|
} else if (heading < 135) {
|
||||||
basic.showString("E", 100)
|
basic.showString("E")
|
||||||
}
|
}
|
||||||
else if (heading < 225) {
|
else if (heading < 225) {
|
||||||
basic.showString("S", 100)
|
basic.showString("S")
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
basic.showString("W", 100)
|
basic.showString("W")
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
@ -40,7 +40,7 @@ You can use a program like this to count things with your @boardname@.
|
|||||||
```blocks
|
```blocks
|
||||||
let num = 0
|
let num = 0
|
||||||
basic.forever(() => {
|
basic.forever(() => {
|
||||||
basic.showNumber(num, 150)
|
basic.showNumber(num)
|
||||||
})
|
})
|
||||||
input.onButtonPressed(Button.A, () => {
|
input.onButtonPressed(Button.A, () => {
|
||||||
num = num + 1
|
num = num + 1
|
||||||
@ -56,10 +56,10 @@ Try this on your @boardname@:
|
|||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
basic.forever(() => {
|
basic.forever(() => {
|
||||||
basic.showNumber(6789, 150)
|
basic.showNumber(6789)
|
||||||
})
|
})
|
||||||
input.onButtonPressed(Button.A, () => {
|
input.onButtonPressed(Button.A, () => {
|
||||||
basic.showNumber(2, 150)
|
basic.showNumber(2)
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ bluetooth.startMagnetometerService();
|
|||||||
bluetooth.startTemperatureService();
|
bluetooth.startTemperatureService();
|
||||||
bluetooth.onBluetoothConnected(() => {});
|
bluetooth.onBluetoothConnected(() => {});
|
||||||
bluetooth.onBluetoothDisconnected(() => {});
|
bluetooth.onBluetoothDisconnected(() => {});
|
||||||
|
bluetooth.setTransmitPower(7);
|
||||||
```
|
```
|
||||||
|
|
||||||
## UART
|
## UART
|
||||||
@ -34,7 +35,8 @@ bluetooth.uartWriteValue("", 0);
|
|||||||
## Eddystone
|
## Eddystone
|
||||||
|
|
||||||
```cards
|
```cards
|
||||||
bluetooth.advertiseUrl("https://pxt.microbit.org/", 7);
|
bluetooth.advertiseUid(42, 1, 7, true);
|
||||||
|
bluetooth.advertiseUrl("https://pxt.microbit.org/", 7, true);
|
||||||
bluetooth.stopAdvertising();
|
bluetooth.stopAdvertising();
|
||||||
```
|
```
|
||||||
|
|
||||||
|
37
docs/reference/bluetooth/advertise-uid-buffer.md
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# Avertise UID Buffer
|
||||||
|
|
||||||
|
Advertises a UID via the Eddystone protocol over Bluetooth.
|
||||||
|
|
||||||
|
## ~hint
|
||||||
|
|
||||||
|
### Eddystone
|
||||||
|
|
||||||
|
Bluetooth beacons are used to indicate proximity to a place or object of interest.
|
||||||
|
Beacons use Bluetooth advertising to broadcast a small amount of data,
|
||||||
|
which can be received and acted upon by anyone in range with a suitable device and software, typically a smartphone and application.
|
||||||
|
|
||||||
|
There are various beacon message formats, which define the way Bluetooth advertising packets are used as containers for beacon data.
|
||||||
|
iBeacon is Apple's beacon message format. Eddystone comes from Google.
|
||||||
|
|
||||||
|
Read more at https://lancaster-university.github.io/microbit-docs/ble/eddystone/ .
|
||||||
|
|
||||||
|
## ~
|
||||||
|
|
||||||
|
```sig
|
||||||
|
bluetooth.advertiseUidBuffer(pins.createBuffer(16), 7, true);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
* ``buffer`` - a 16 bytes buffer containing the namespace (first 10 bytes) and instance (last 6 bytes).
|
||||||
|
* ``power`` - a [number](/reference/types/number) representing the power level between 0 (short) and 7 (maximum range).
|
||||||
|
* ``connectable`` - a [boolean](/reference/type/boolean) indicating whether or not the micro:bit should accept connections.
|
||||||
|
|
||||||
|
|
||||||
|
## See Also
|
||||||
|
|
||||||
|
[stop-advertising](/reference/bluetooth/stop-advertising), [advertise-uid](/reference/bluetooth/advertise-uid)
|
||||||
|
|
||||||
|
```package
|
||||||
|
bluetooth
|
||||||
|
```
|
46
docs/reference/bluetooth/advertise-uid.md
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# Avertise UID
|
||||||
|
|
||||||
|
Advertises a UID via the Eddystone protocol over Bluetooth.
|
||||||
|
|
||||||
|
## ~hint
|
||||||
|
|
||||||
|
### Eddystone
|
||||||
|
|
||||||
|
Bluetooth beacons are used to indicate proximity to a place or object of interest.
|
||||||
|
Beacons use Bluetooth advertising to broadcast a small amount of data,
|
||||||
|
which can be received and acted upon by anyone in range with a suitable device and software, typically a smartphone and application.
|
||||||
|
|
||||||
|
There are various beacon message formats, which define the way Bluetooth advertising packets are used as containers for beacon data.
|
||||||
|
iBeacon is Apple's beacon message format. Eddystone comes from Google.
|
||||||
|
|
||||||
|
Read more at https://lancaster-university.github.io/microbit-docs/ble/eddystone/ .
|
||||||
|
|
||||||
|
## ~
|
||||||
|
|
||||||
|
```sig
|
||||||
|
bluetooth.advertiseUid(42, 1, 7, true);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
* ``namespace`` last 4 bytes of the namespace uid (6 to 9)
|
||||||
|
* ``instance`` last 4 bytes of the instance (2 to 5)
|
||||||
|
* ``power`` - a [number](/reference/types/number) representing the power level between 0 (short) and 7 (maximum range).
|
||||||
|
* ``connectable`` - a [boolean](/reference/type/boolean) indicating whether or not the micro:bit should accept connections.
|
||||||
|
|
||||||
|
## Encoding
|
||||||
|
|
||||||
|
The bytes of ``namespace`` and ``instance`` are encoded to generate the 10 bytes UID namespace and 6 bytes UID instance.
|
||||||
|
|
||||||
|
```
|
||||||
|
UID namespace: [0, ..., namespace]
|
||||||
|
UID instance: [0, ..., instance]
|
||||||
|
```
|
||||||
|
|
||||||
|
## See Also
|
||||||
|
|
||||||
|
[stop-advertising](/reference/bluetooth/stop-advertising), [advertise-uid-buffer](/reference/bluetooth/advertise-uid-buffer)
|
||||||
|
|
||||||
|
```package
|
||||||
|
bluetooth
|
||||||
|
```
|
@ -18,23 +18,24 @@ Read more at https://lancaster-university.github.io/microbit-docs/ble/eddystone/
|
|||||||
## ~
|
## ~
|
||||||
|
|
||||||
```sig
|
```sig
|
||||||
bluetooth.advertiseUrl("https://pxt.microbit.org/", 7);
|
bluetooth.advertiseUrl("https://pxt.microbit.org/", 7, true);
|
||||||
```
|
```
|
||||||
|
|
||||||
### Parameters
|
### Parameters
|
||||||
|
|
||||||
* ``url`` - a [string](/reference/types/string) containing the URL to broadcast, at most 18 characters long
|
* ``url`` - a [string](/reference/types/string) containing the URL to broadcast, at most 17 characters long, excluding the protocol (eg: ``https://``) which gets encoded as 1 byte.
|
||||||
* ``power`` - a [number](/reference/types/number) representing the power level between 0 (short) and 7 (maximum range).
|
* ``power`` - a [number](/reference/types/number) representing the power level between 0 (short) and 7 (maximum range).
|
||||||
|
* ``connectable`` - a [boolean](/reference/type/boolean) indicating whether or not the micro:bit should accept connections.
|
||||||
|
|
||||||
### Example: Broadcast a secret code
|
### Example: Broadcast a secret code
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
bluetooth.advertiseUrl("https://pxt.io?secret=42", 7);
|
bluetooth.advertiseUrl("https://pxt.io?secret=42", 7, true);
|
||||||
```
|
```
|
||||||
|
|
||||||
## See Also
|
## See Also
|
||||||
|
|
||||||
[stop-advertising](/reference/bluetooth/stop-advertising)
|
[stop-advertising](/reference/bluetooth/stop-advertising), [advertise-uid](/reference/bluetooth/advertise-uid)
|
||||||
|
|
||||||
```package
|
```package
|
||||||
bluetooth
|
bluetooth
|
||||||
|
26
docs/reference/bluetooth/set-transmit-power.md
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# Bluetooth Set Transmit Power
|
||||||
|
|
||||||
|
### ~hint
|
||||||
|

|
||||||
|
|
||||||
|
For another device like a smartphone to use any of the Bluetooth "services" which the @boardname@ has, it must first be [paired with the @boardname@](/reference/bluetooth/bluetooth-pairing). Once paired, the other device may connect to the @boardname@ and exchange data relating to many of the @boardname@'s features.
|
||||||
|
|
||||||
|
### ~
|
||||||
|
|
||||||
|
Change the output power level of the transmitter to the given value.
|
||||||
|
|
||||||
|
```sig
|
||||||
|
bluetooth.setTransmitPower(7);
|
||||||
|
```
|
||||||
|
|
||||||
|
### Parameters
|
||||||
|
|
||||||
|
* `power`: a [number](/reference/types/number) in the range ``0..7``, where ``0`` is the lowest power and ``7`` is the highest.
|
||||||
|
|
||||||
|
### See also
|
||||||
|
|
||||||
|
[About Bluetooth](/reference/bluetooth/about-bluetooth), [@boardname@ Bluetooth profile overview ](http://lancaster-university.github.io/microbit-docs/ble/profile/), [@boardname@ Bluetooth profile reference](http://lancaster-university.github.io/microbit-docs/resources/bluetooth/microbit-profile-V1.9-Level-2.pdf), [Bluetooth on @boardname@ resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html), [Bluetooth SIG](https://www.bluetooth.com)
|
||||||
|
|
||||||
|
```package
|
||||||
|
bluetooth
|
||||||
|
```
|
28
docs/reference/serial/read-until.md
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# Serial Read Until
|
||||||
|
|
||||||
|
Read a text from the serial port until a delimiter is found.
|
||||||
|
|
||||||
|
```sig
|
||||||
|
serial.readUntil(",");
|
||||||
|
```
|
||||||
|
|
||||||
|
### Returns
|
||||||
|
|
||||||
|
* a [string](/reference/types/string) containing input from the serial port, such as a response typed by a user
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
The following example reads strings separated by commands (``,``).
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
basic.forever(() => {
|
||||||
|
let answer = serial.readUntil(",");
|
||||||
|
serial.writeLine(answer);
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### See also
|
||||||
|
|
||||||
|
[serial](/device/serial),
|
||||||
|
[serial write line](/reference/serial/write-line),
|
||||||
|
[serial write value](/reference/serial/write-value)
|
BIN
docs/static/Microsoft-logo_rgb_c-white.png
vendored
Normal file
After Width: | Height: | Size: 12 KiB |
BIN
docs/static/mb/projects/inchworm.jpg
vendored
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
docs/static/mb/projects/inchworm/chassis1.jpg
vendored
Normal file
After Width: | Height: | Size: 83 KiB |
BIN
docs/static/mb/projects/inchworm/chassis2.jpg
vendored
Normal file
After Width: | Height: | Size: 75 KiB |
BIN
docs/static/mb/projects/inchworm/chassis3.jpg
vendored
Normal file
After Width: | Height: | Size: 82 KiB |
BIN
docs/static/mb/projects/inchworm/chassis4.jpg
vendored
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
docs/static/mb/projects/inchworm/chassis5.jpg
vendored
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
docs/static/mb/projects/inchworm/chassis6.jpg
vendored
Normal file
After Width: | Height: | Size: 70 KiB |
BIN
docs/static/mb/projects/inchworm/chassis7.jpg
vendored
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
docs/static/mb/projects/inchworm/chassis8.jpg
vendored
Normal file
After Width: | Height: | Size: 56 KiB |
BIN
docs/static/mb/projects/inchworm/circuit1.jpg
vendored
Normal file
After Width: | Height: | Size: 52 KiB |
BIN
docs/static/mb/projects/inchworm/circuit2.jpg
vendored
Normal file
After Width: | Height: | Size: 42 KiB |
BIN
docs/static/mb/projects/inchworm/clip1.jpg
vendored
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
docs/static/mb/projects/inchworm/clip2.jpg
vendored
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
docs/static/mb/projects/inchworm/clip3.jpg
vendored
Normal file
After Width: | Height: | Size: 60 KiB |
BIN
docs/static/mb/projects/inchworm/materials.jpg
vendored
Normal file
After Width: | Height: | Size: 91 KiB |
BIN
docs/static/mb/projects/inchworm/ready.jpg
vendored
Normal file
After Width: | Height: | Size: 84 KiB |
BIN
docs/static/mb/projects/inchworm/servo1.jpg
vendored
Normal file
After Width: | Height: | Size: 40 KiB |
BIN
docs/static/mb/projects/inchworm/servo2.JPG
vendored
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
docs/static/mb/projects/inchworm/servo3.jpg
vendored
Normal file
After Width: | Height: | Size: 54 KiB |
BIN
docs/static/mb/projects/inchworm/servo4.jpg
vendored
Normal file
After Width: | Height: | Size: 37 KiB |
BIN
docs/static/mb/projects/inchworm/servo5.jpg
vendored
Normal file
After Width: | Height: | Size: 36 KiB |
BIN
docs/static/mb/projects/inchworm/servo6.jpg
vendored
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
docs/static/mb/projects/inchworm/servo7.jpg
vendored
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
docs/static/mb/projects/inchworm/servo8.jpg
vendored
Normal file
After Width: | Height: | Size: 93 KiB |
53
docs/tutorials/getting-started.md
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
# Getting started
|
||||||
|
|
||||||
|
### Step 1
|
||||||
|
|
||||||
|
Use the **Basic** drawer in the editor
|
||||||
|
to drag out and arrange three blocks to create this program:
|
||||||
|
|
||||||
|
```block
|
||||||
|
basic.showString("Hello world")
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2
|
||||||
|
|
||||||
|
Use the **Basic** drawer in the editor
|
||||||
|
to drag out and arrange three blocks to create this program:
|
||||||
|
|
||||||
|
### Step 3
|
||||||
|
|
||||||
|
Use the **Basic** drawer in the editor
|
||||||
|
to drag out and arrange three blocks to create this program:
|
||||||
|
|
||||||
|
```block
|
||||||
|
basic.forever(() => {
|
||||||
|
basic.showNumber(0)
|
||||||
|
})
|
||||||
|
```
|
||||||
|
### Step 4
|
||||||
|
|
||||||
|
Use the **Basic** drawer in the editor
|
||||||
|
to drag out and arrange three blocks to create this program:
|
||||||
|
|
||||||
|
```block
|
||||||
|
input.onButtonPressed(Button.B, () => {
|
||||||
|
basic.showLeds(`
|
||||||
|
. . . . .
|
||||||
|
. . . . .
|
||||||
|
. . . . .
|
||||||
|
. . . . .
|
||||||
|
. . . . .
|
||||||
|
`)
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 5
|
||||||
|
|
||||||
|
Use the **Basic** drawer in the editor
|
||||||
|
to drag out and arrange three blocks to create this program:
|
||||||
|
|
||||||
|
```block
|
||||||
|
input.onButtonPressed(Button.A, () => {
|
||||||
|
basic.showString("Hello!")
|
||||||
|
})
|
||||||
|
```
|
@ -38,7 +38,7 @@ That's it!
|
|||||||
|
|
||||||
### Installation Instructions
|
### Installation Instructions
|
||||||
|
|
||||||
* Download the [Microsoft.Uploader.Microbit.zip](https://pxt.microbit.org/microbit-uploader.zip) file to your local computer.
|
* Download the [Microsoft.Uploader.Microbit.zip](https://www.touchdevelop.com/microbituploader.zip) file to your local computer.
|
||||||
* Unzip the .zip file to your desktop.
|
* Unzip the .zip file to your desktop.
|
||||||
* Launch the Microsoft.Uploader.exe file before working on your @boardname@.
|
* Launch the Microsoft.Uploader.exe file before working on your @boardname@.
|
||||||
|
|
||||||
|
14
electron/product.json
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"applicationName": "pxt-microbit-oss",
|
||||||
|
"dataFolderName": ".pxt-microbit-oss",
|
||||||
|
"darwinBundleIdentifier": "com.microsoft.pxtmicrobitoss",
|
||||||
|
"nameShort": "PXT microbit - OSS",
|
||||||
|
"nameLong": "PXT micro:bit - OSS",
|
||||||
|
"targetId": "pxt-microbit",
|
||||||
|
"win32AppId": "{{92db071a-6f58-4938-8c97-13c873f4da13}",
|
||||||
|
"win32AppUserModelId": "Microsoft.PXTmicrobitOss",
|
||||||
|
"win32DirName": "Microsoft PXT microbit - OSS",
|
||||||
|
"win32MutexName": "pxtmicrobitoss",
|
||||||
|
"win32NameVersion": "Microsoft PXT microbit-OSS",
|
||||||
|
"win32RegValueName": "PXTmicrobitOss"
|
||||||
|
}
|
9
electron/release.json
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
{
|
||||||
|
"versions": {
|
||||||
|
"0": {
|
||||||
|
"latest": "v0.6.45",
|
||||||
|
"banned": [],
|
||||||
|
"prompt": "v0.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,62 +1,3 @@
|
|||||||
<xml xmlns="http://www.w3.org/1999/xhtml">
|
<xml xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<block type="device_forever">
|
<block type="pxt-on-start"></block>
|
||||||
<statement name="HANDLER">
|
|
||||||
<block type="device_show_leds">
|
|
||||||
<field name="LED00">FALSE</field>
|
|
||||||
<field name="LED10">FALSE</field>
|
|
||||||
<field name="LED20">FALSE</field>
|
|
||||||
<field name="LED30">FALSE</field>
|
|
||||||
<field name="LED40">FALSE</field>
|
|
||||||
<field name="LED01">FALSE</field>
|
|
||||||
<field name="LED11">TRUE</field>
|
|
||||||
<field name="LED21">FALSE</field>
|
|
||||||
<field name="LED31">TRUE</field>
|
|
||||||
<field name="LED41">FALSE</field>
|
|
||||||
<field name="LED02">FALSE</field>
|
|
||||||
<field name="LED12">FALSE</field>
|
|
||||||
<field name="LED22">FALSE</field>
|
|
||||||
<field name="LED32">FALSE</field>
|
|
||||||
<field name="LED42">FALSE</field>
|
|
||||||
<field name="LED03">TRUE</field>
|
|
||||||
<field name="LED13">FALSE</field>
|
|
||||||
<field name="LED23">FALSE</field>
|
|
||||||
<field name="LED33">FALSE</field>
|
|
||||||
<field name="LED43">TRUE</field>
|
|
||||||
<field name="LED04">FALSE</field>
|
|
||||||
<field name="LED14">TRUE</field>
|
|
||||||
<field name="LED24">TRUE</field>
|
|
||||||
<field name="LED34">TRUE</field>
|
|
||||||
<field name="LED44">FALSE</field>
|
|
||||||
<next>
|
|
||||||
<block type="device_show_leds">
|
|
||||||
<field name="LED00">FALSE</field>
|
|
||||||
<field name="LED10">FALSE</field>
|
|
||||||
<field name="LED20">FALSE</field>
|
|
||||||
<field name="LED30">FALSE</field>
|
|
||||||
<field name="LED40">FALSE</field>
|
|
||||||
<field name="LED01">FALSE</field>
|
|
||||||
<field name="LED11">FALSE</field>
|
|
||||||
<field name="LED21">FALSE</field>
|
|
||||||
<field name="LED31">FALSE</field>
|
|
||||||
<field name="LED41">FALSE</field>
|
|
||||||
<field name="LED02">FALSE</field>
|
|
||||||
<field name="LED12">FALSE</field>
|
|
||||||
<field name="LED22">FALSE</field>
|
|
||||||
<field name="LED32">FALSE</field>
|
|
||||||
<field name="LED42">FALSE</field>
|
|
||||||
<field name="LED03">FALSE</field>
|
|
||||||
<field name="LED13">FALSE</field>
|
|
||||||
<field name="LED23">FALSE</field>
|
|
||||||
<field name="LED33">FALSE</field>
|
|
||||||
<field name="LED43">FALSE</field>
|
|
||||||
<field name="LED04">FALSE</field>
|
|
||||||
<field name="LED14">FALSE</field>
|
|
||||||
<field name="LED24">FALSE</field>
|
|
||||||
<field name="LED34">FALSE</field>
|
|
||||||
<field name="LED44">FALSE</field>
|
|
||||||
</block>
|
|
||||||
</next>
|
|
||||||
</block>
|
|
||||||
</statement>
|
|
||||||
</block>
|
|
||||||
</xml>
|
</xml>
|
@ -1,16 +1 @@
|
|||||||
basic.forever(() => {
|
|
||||||
basic.showLeds(`
|
|
||||||
. # . # .
|
|
||||||
# . # . #
|
|
||||||
# . . . #
|
|
||||||
. # . # .
|
|
||||||
. . # . .
|
|
||||||
`)
|
|
||||||
basic.showLeds(`
|
|
||||||
. . . . .
|
|
||||||
. . . . .
|
|
||||||
. . . . .
|
|
||||||
. . . . .
|
|
||||||
. . . . .
|
|
||||||
`)
|
|
||||||
})
|
|
||||||
|
@ -1,12 +1,24 @@
|
|||||||
{
|
{
|
||||||
"bluetooth": "Support for additional Bluetooth services.",
|
"bluetooth": "Support for additional Bluetooth services.\n\nSupport for additional Bluetooth services.",
|
||||||
|
"bluetooth.advertiseUid": "Advertise an Eddystone UID",
|
||||||
|
"bluetooth.advertiseUidBuffer": "Advertise an Eddystone UID",
|
||||||
|
"bluetooth.advertiseUidBuffer|param|connectable": "true to keep bluetooth connectable for other services, false otherwise.",
|
||||||
|
"bluetooth.advertiseUidBuffer|param|nsAndInstance": "16 bytes buffer of namespace (bytes 0-9) and instance (bytes 10-15)",
|
||||||
|
"bluetooth.advertiseUidBuffer|param|power": "power level between 0 and 7, eg: 7",
|
||||||
|
"bluetooth.advertiseUid|param|connectable": "true to keep bluetooth connectable for other services, false otherwise.",
|
||||||
|
"bluetooth.advertiseUid|param|instance": "4 last bytes of the instance uid",
|
||||||
|
"bluetooth.advertiseUid|param|ns": "4 last bytes of the namespace uid",
|
||||||
|
"bluetooth.advertiseUid|param|power": "power level between 0 and 7, eg: 7",
|
||||||
"bluetooth.advertiseUrl": "Advertise an Eddystone URL",
|
"bluetooth.advertiseUrl": "Advertise an Eddystone URL",
|
||||||
"bluetooth.advertiseUrl|param|power": "power level between 0 and 7, e.g.: 7",
|
"bluetooth.advertiseUrl|param|connectable": "true to keep bluetooth connectable for other services, false otherwise.",
|
||||||
"bluetooth.advertiseUrl|param|url": "the url to transmit. Must be no longer than the supported eddystone url length",
|
"bluetooth.advertiseUrl|param|power": "power level between 0 and 7, eg: 7",
|
||||||
|
"bluetooth.advertiseUrl|param|url": "the url to transmit. Must be no longer than the supported eddystone url length, eg: \"https://pxt.io/\"",
|
||||||
"bluetooth.onBluetoothConnected": "Register code to run when the micro:bit is connected to over Bluetooth",
|
"bluetooth.onBluetoothConnected": "Register code to run when the micro:bit is connected to over Bluetooth",
|
||||||
"bluetooth.onBluetoothConnected|param|body": "Code to run when a Bluetooth connection is established",
|
"bluetooth.onBluetoothConnected|param|body": "Code to run when a Bluetooth connection is established",
|
||||||
"bluetooth.onBluetoothDisconnected": "Register code to run when a bluetooth connection to the micro:bit is lost",
|
"bluetooth.onBluetoothDisconnected": "Register code to run when a bluetooth connection to the micro:bit is lost",
|
||||||
"bluetooth.onBluetoothDisconnected|param|body": "Code to run when a Bluetooth connection is lost",
|
"bluetooth.onBluetoothDisconnected|param|body": "Code to run when a Bluetooth connection is lost",
|
||||||
|
"bluetooth.setTransmitPower": "Sets the bluetooth transmit power between 0 (minimal) and 7 (maximum).",
|
||||||
|
"bluetooth.setTransmitPower|param|power": "power level between 0 (minimal) and 7 (maximum), eg: 7.",
|
||||||
"bluetooth.startAccelerometerService": "Starts the Bluetooth accelerometer service",
|
"bluetooth.startAccelerometerService": "Starts the Bluetooth accelerometer service",
|
||||||
"bluetooth.startButtonService": "Starts the Bluetooth button service",
|
"bluetooth.startButtonService": "Starts the Bluetooth button service",
|
||||||
"bluetooth.startIOPinService": "Starts the Bluetooth IO pin service.",
|
"bluetooth.startIOPinService": "Starts the Bluetooth IO pin service.",
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
{
|
{
|
||||||
"bluetooth.advertiseUrl|block": "bluetooth advertise url %url|with power %power",
|
"bluetooth.advertiseUid|block": "bluetooth advertise UID|namespace (bytes 6-9)%ns|instance (bytes 2-6)%instance|with power %power|connectable %connectable",
|
||||||
|
"bluetooth.advertiseUrl|block": "bluetooth advertise url %url|with power %power|connectable %connectable",
|
||||||
"bluetooth.onBluetoothConnected|block": "on bluetooth connected",
|
"bluetooth.onBluetoothConnected|block": "on bluetooth connected",
|
||||||
"bluetooth.onBluetoothDisconnected|block": "on bluetooth disconnected",
|
"bluetooth.onBluetoothDisconnected|block": "on bluetooth disconnected",
|
||||||
|
"bluetooth.setTransmitPower|block": "bluetooth set transmit power %power",
|
||||||
"bluetooth.startAccelerometerService|block": "bluetooth accelerometer service",
|
"bluetooth.startAccelerometerService|block": "bluetooth accelerometer service",
|
||||||
"bluetooth.startButtonService|block": "bluetooth button service",
|
"bluetooth.startButtonService|block": "bluetooth button service",
|
||||||
"bluetooth.startIOPinService|block": "bluetooth io pin service",
|
"bluetooth.startIOPinService|block": "bluetooth io pin service",
|
||||||
|
@ -7,7 +7,7 @@ using namespace pxt;
|
|||||||
/**
|
/**
|
||||||
* Support for additional Bluetooth services.
|
* Support for additional Bluetooth services.
|
||||||
*/
|
*/
|
||||||
//% color=#0082FB weight=20
|
//% color=#0082FB weight=20 icon="\uf294"
|
||||||
namespace bluetooth {
|
namespace bluetooth {
|
||||||
MicroBitUARTService *uart = NULL;
|
MicroBitUARTService *uart = NULL;
|
||||||
|
|
||||||
@ -121,18 +121,48 @@ namespace bluetooth {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const int8_t CALIBRATED_POWERS[] = {-49, -37, -33, -28, -25, -20, -15, -10};
|
const int8_t CALIBRATED_POWERS[] = {-49, -37, -33, -28, -25, -20, -15, -10};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Advertise an Eddystone URL
|
* Advertise an Eddystone URL
|
||||||
* @param url the url to transmit. Must be no longer than the supported eddystone url length
|
* @param url the url to transmit. Must be no longer than the supported eddystone url length, eg: "https://pxt.io/"
|
||||||
* @param power power level between 0 and 7, e.g.: 7
|
* @param power power level between 0 and 7, eg: 7
|
||||||
|
* @param connectable true to keep bluetooth connectable for other services, false otherwise.
|
||||||
*/
|
*/
|
||||||
//% blockId=eddystone_advertise_url block="bluetooth advertise url %url|with power %power"
|
//% blockId=eddystone_advertise_url block="bluetooth advertise url %url|with power %power|connectable %connectable"
|
||||||
//% parts=bluetooth weight=11 blockGap=8
|
//% parts=bluetooth weight=11 blockGap=8
|
||||||
//% help=bluetooth/advertise-url
|
//% help=bluetooth/advertise-url blockExternalInputs=1
|
||||||
void advertiseUrl(StringData* url, int power) {
|
void advertiseUrl(StringData* url, int power, bool connectable) {
|
||||||
int8_t level = CALIBRATED_POWERS[min(7, max(0, power))];
|
power = min(MICROBIT_BLE_POWER_LEVELS-1, max(0, power));
|
||||||
uBit.bleManager.advertiseEddystoneUrl(ManagedString(url), level);
|
int8_t level = CALIBRATED_POWERS[power];
|
||||||
|
uBit.bleManager.advertiseEddystoneUrl(ManagedString(url), level, connectable);
|
||||||
|
uBit.bleManager.setTransmitPower(power);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Advertise an Eddystone UID
|
||||||
|
* @param nsAndInstance 16 bytes buffer of namespace (bytes 0-9) and instance (bytes 10-15)
|
||||||
|
* @param power power level between 0 and 7, eg: 7
|
||||||
|
* @param connectable true to keep bluetooth connectable for other services, false otherwise.
|
||||||
|
*/
|
||||||
|
//% parts=bluetooth weight=12 advanced=true
|
||||||
|
void advertiseUidBuffer(Buffer nsAndInstance, int power, bool connectable) {
|
||||||
|
ManagedBuffer buf(nsAndInstance);
|
||||||
|
if (buf.length() != 16) return;
|
||||||
|
|
||||||
|
power = min(MICROBIT_BLE_POWER_LEVELS-1, max(0, power));
|
||||||
|
int8_t level = CALIBRATED_POWERS[power];
|
||||||
|
uint8_t uidNs[10]; buf.readBytes(uidNs, 0, 10);
|
||||||
|
uint8_t uidInst[6]; buf.readBytes(uidInst, 10, 6);
|
||||||
|
uBit.bleManager.advertiseEddystoneUid((const char*)uidNs, (const char*)uidInst, level, connectable);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the bluetooth transmit power between 0 (minimal) and 7 (maximum).
|
||||||
|
* @param power power level between 0 (minimal) and 7 (maximum), eg: 7.
|
||||||
|
*/
|
||||||
|
//% parts=bluetooth weight=5 help=bluetooth/set-transmit-power advanced=true
|
||||||
|
//% blockId=bluetooth_settransmitpower block="bluetooth set transmit power %power"
|
||||||
|
void setTransmitPower(int power) {
|
||||||
|
uBit.bleManager.setTransmitPower(min(MICROBIT_BLE_POWER_LEVELS-1, max(0, power)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -140,7 +170,7 @@ namespace bluetooth {
|
|||||||
*/
|
*/
|
||||||
//% blockId=eddystone_stop_advertising block="bluetooth stop advertising"
|
//% blockId=eddystone_stop_advertising block="bluetooth stop advertising"
|
||||||
//% parts=bluetooth weight=10
|
//% parts=bluetooth weight=10
|
||||||
//% help=bluetooth/stop-advertising
|
//% help=bluetooth/stop-advertising advanced=true
|
||||||
void stopAdvertising() {
|
void stopAdvertising() {
|
||||||
uBit.bleManager.stopAdvertising();
|
uBit.bleManager.stopAdvertising();
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* Support for additional Bluetooth services.
|
* Support for additional Bluetooth services.
|
||||||
*/
|
*/
|
||||||
//% color=#0082FB weight=20
|
//% color=#0082FB weight=20 icon="\uf294"
|
||||||
namespace bluetooth {
|
namespace bluetooth {
|
||||||
/**
|
/**
|
||||||
* Writes to the Bluetooth UART service buffer. From there the data is transmitted over Bluetooth to a connected device.
|
* Writes to the Bluetooth UART service buffer. From there the data is transmitted over Bluetooth to a connected device.
|
||||||
@ -46,4 +46,21 @@ namespace bluetooth {
|
|||||||
// dummy implementation for simulator
|
// dummy implementation for simulator
|
||||||
return "???"
|
return "???"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Advertise an Eddystone UID
|
||||||
|
* @param ns 4 last bytes of the namespace uid
|
||||||
|
* @param instance 4 last bytes of the instance uid
|
||||||
|
* @param power power level between 0 and 7, eg: 7
|
||||||
|
* @param connectable true to keep bluetooth connectable for other services, false otherwise.
|
||||||
|
*/
|
||||||
|
//% blockId=eddystone_advertise_uid block="bluetooth advertise UID|namespace (bytes 6-9)%ns|instance (bytes 2-6)%instance|with power %power|connectable %connectable"
|
||||||
|
//% parts=bluetooth weight=12 blockGap=8
|
||||||
|
//% help=bluetooth/advertise-uid blockExternalInputs=1
|
||||||
|
export function advertiseUid(ns: number, instance: number, power: number, connectable: boolean) {
|
||||||
|
const buf = pins.createBuffer(16);
|
||||||
|
buf.setNumber(NumberFormat.Int32BE, 6, ns);
|
||||||
|
buf.setNumber(NumberFormat.Int32BE, 12, instance);
|
||||||
|
bluetooth.advertiseUidBuffer(buf, power, connectable);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,41 +24,56 @@
|
|||||||
"microbit-dal": {
|
"microbit-dal": {
|
||||||
"bluetooth": {
|
"bluetooth": {
|
||||||
"private_addressing": 0,
|
"private_addressing": 0,
|
||||||
"whitelist": 1,
|
|
||||||
"advertising_timeout": 0,
|
"advertising_timeout": 0,
|
||||||
"tx_power": 6,
|
"tx_power": 6,
|
||||||
"dfu_service": 1,
|
"dfu_service": 1,
|
||||||
"event_service": 1,
|
"event_service": 1,
|
||||||
"device_info_service": 1,
|
"device_info_service": 1,
|
||||||
"eddystone_url": 1,
|
"eddystone_url": 1,
|
||||||
"eddystone_uid": 0,
|
"eddystone_uid": 1,
|
||||||
"pairing_mode": 1,
|
|
||||||
"open": 0,
|
"open": 0,
|
||||||
"security_level": "SECURITY_MODE_ENCRYPTION_WITH_MITM"
|
"pairing_mode": 1,
|
||||||
}
|
"whitelist": 1,
|
||||||
|
"security_level": "SECURITY_MODE_ENCRYPTION_NO_MITM"
|
||||||
},
|
},
|
||||||
"gatt_table_size": "0x700"
|
"gatt_table_size": "0x700"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"userConfigs": [
|
"userConfigs": [
|
||||||
{
|
{
|
||||||
"description": "No pairing: Anyone can connect via Bluetooth.",
|
"description": "Unsecure: Anyone can connect via Bluetooth.",
|
||||||
"config": {
|
"config": {
|
||||||
"microbit-dal": {
|
"microbit-dal": {
|
||||||
"bluetooth": {
|
"bluetooth": {
|
||||||
"open": 1,
|
"open": 1,
|
||||||
"pairing_mode": null,
|
"pairing_mode": 0,
|
||||||
|
"whitelist": 0,
|
||||||
"security_level": null
|
"security_level": null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"description": "Passkey pairing: Button press and 6 digit key to pair via Bluetooth.",
|
"description": "JustWorks pairing (default): Button press to pair.",
|
||||||
|
"config": {
|
||||||
|
"microbit-dal": {
|
||||||
|
"bluetooth": {
|
||||||
|
"open": null,
|
||||||
|
"pairing_mode": null,
|
||||||
|
"whitelist": null,
|
||||||
|
"security_level": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"description": "Passkey pairing: Button press and 6 digit key to pair.",
|
||||||
"config": {
|
"config": {
|
||||||
"microbit-dal": {
|
"microbit-dal": {
|
||||||
"bluetooth": {
|
"bluetooth": {
|
||||||
"open": 0,
|
"open": 0,
|
||||||
"pairing_mode": 1,
|
"pairing_mode": 1,
|
||||||
|
"whitelist": 1,
|
||||||
"security_level": "SECURITY_MODE_ENCRYPTION_WITH_MITM"
|
"security_level": "SECURITY_MODE_ENCRYPTION_WITH_MITM"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
32
libs/bluetooth/shims.d.ts
vendored
@ -4,7 +4,7 @@
|
|||||||
/**
|
/**
|
||||||
* Support for additional Bluetooth services.
|
* Support for additional Bluetooth services.
|
||||||
*/
|
*/
|
||||||
//% color=#0082FB weight=20
|
//% color=#0082FB weight=20 icon="\uf294"
|
||||||
declare namespace bluetooth {
|
declare namespace bluetooth {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -83,20 +83,38 @@ declare namespace bluetooth {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Advertise an Eddystone URL
|
* Advertise an Eddystone URL
|
||||||
* @param url the url to transmit. Must be no longer than the supported eddystone url length
|
* @param url the url to transmit. Must be no longer than the supported eddystone url length, eg: "https://pxt.io/"
|
||||||
* @param power power level between 0 and 7, e.g.: 7
|
* @param power power level between 0 and 7, eg: 7
|
||||||
|
* @param connectable true to keep bluetooth connectable for other services, false otherwise.
|
||||||
*/
|
*/
|
||||||
//% blockId=eddystone_advertise_url block="bluetooth advertise url %url|with power %power"
|
//% blockId=eddystone_advertise_url block="bluetooth advertise url %url|with power %power|connectable %connectable"
|
||||||
//% parts=bluetooth weight=11 blockGap=8
|
//% parts=bluetooth weight=11 blockGap=8
|
||||||
//% help=bluetooth/advertise-url shim=bluetooth::advertiseUrl
|
//% help=bluetooth/advertise-url blockExternalInputs=1 shim=bluetooth::advertiseUrl
|
||||||
function advertiseUrl(url: string, power: number): void;
|
function advertiseUrl(url: string, power: number, connectable: boolean): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Advertise an Eddystone UID
|
||||||
|
* @param nsAndInstance 16 bytes buffer of namespace (bytes 0-9) and instance (bytes 10-15)
|
||||||
|
* @param power power level between 0 and 7, eg: 7
|
||||||
|
* @param connectable true to keep bluetooth connectable for other services, false otherwise.
|
||||||
|
*/
|
||||||
|
//% parts=bluetooth weight=12 advanced=true shim=bluetooth::advertiseUidBuffer
|
||||||
|
function advertiseUidBuffer(nsAndInstance: Buffer, power: number, connectable: boolean): void;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the bluetooth transmit power between 0 (minimal) and 7 (maximum).
|
||||||
|
* @param power power level between 0 (minimal) and 7 (maximum), eg: 7.
|
||||||
|
*/
|
||||||
|
//% parts=bluetooth weight=5 help=bluetooth/set-transmit-power advanced=true
|
||||||
|
//% blockId=bluetooth_settransmitpower block="bluetooth set transmit power %power" shim=bluetooth::setTransmitPower
|
||||||
|
function setTransmitPower(power: number): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stops advertising Eddystone end points
|
* Stops advertising Eddystone end points
|
||||||
*/
|
*/
|
||||||
//% blockId=eddystone_stop_advertising block="bluetooth stop advertising"
|
//% blockId=eddystone_stop_advertising block="bluetooth stop advertising"
|
||||||
//% parts=bluetooth weight=10
|
//% parts=bluetooth weight=10
|
||||||
//% help=bluetooth/stop-advertising shim=bluetooth::stopAdvertising
|
//% help=bluetooth/stop-advertising advanced=true shim=bluetooth::stopAdvertising
|
||||||
function stopAdvertising(): void;
|
function stopAdvertising(): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,62 +1,3 @@
|
|||||||
<xml xmlns="http://www.w3.org/1999/xhtml">
|
<xml xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<block type="device_forever">
|
<block type="pxt-on-start"></block>
|
||||||
<statement name="HANDLER">
|
|
||||||
<block type="device_show_leds">
|
|
||||||
<field name="LED00">FALSE</field>
|
|
||||||
<field name="LED10">FALSE</field>
|
|
||||||
<field name="LED20">FALSE</field>
|
|
||||||
<field name="LED30">FALSE</field>
|
|
||||||
<field name="LED40">FALSE</field>
|
|
||||||
<field name="LED01">FALSE</field>
|
|
||||||
<field name="LED11">TRUE</field>
|
|
||||||
<field name="LED21">FALSE</field>
|
|
||||||
<field name="LED31">TRUE</field>
|
|
||||||
<field name="LED41">FALSE</field>
|
|
||||||
<field name="LED02">FALSE</field>
|
|
||||||
<field name="LED12">FALSE</field>
|
|
||||||
<field name="LED22">FALSE</field>
|
|
||||||
<field name="LED32">FALSE</field>
|
|
||||||
<field name="LED42">FALSE</field>
|
|
||||||
<field name="LED03">TRUE</field>
|
|
||||||
<field name="LED13">FALSE</field>
|
|
||||||
<field name="LED23">FALSE</field>
|
|
||||||
<field name="LED33">FALSE</field>
|
|
||||||
<field name="LED43">TRUE</field>
|
|
||||||
<field name="LED04">FALSE</field>
|
|
||||||
<field name="LED14">TRUE</field>
|
|
||||||
<field name="LED24">TRUE</field>
|
|
||||||
<field name="LED34">TRUE</field>
|
|
||||||
<field name="LED44">FALSE</field>
|
|
||||||
<next>
|
|
||||||
<block type="device_show_leds">
|
|
||||||
<field name="LED00">FALSE</field>
|
|
||||||
<field name="LED10">FALSE</field>
|
|
||||||
<field name="LED20">FALSE</field>
|
|
||||||
<field name="LED30">FALSE</field>
|
|
||||||
<field name="LED40">FALSE</field>
|
|
||||||
<field name="LED01">FALSE</field>
|
|
||||||
<field name="LED11">FALSE</field>
|
|
||||||
<field name="LED21">FALSE</field>
|
|
||||||
<field name="LED31">FALSE</field>
|
|
||||||
<field name="LED41">FALSE</field>
|
|
||||||
<field name="LED02">FALSE</field>
|
|
||||||
<field name="LED12">FALSE</field>
|
|
||||||
<field name="LED22">FALSE</field>
|
|
||||||
<field name="LED32">FALSE</field>
|
|
||||||
<field name="LED42">FALSE</field>
|
|
||||||
<field name="LED03">FALSE</field>
|
|
||||||
<field name="LED13">FALSE</field>
|
|
||||||
<field name="LED23">FALSE</field>
|
|
||||||
<field name="LED33">FALSE</field>
|
|
||||||
<field name="LED43">FALSE</field>
|
|
||||||
<field name="LED04">FALSE</field>
|
|
||||||
<field name="LED14">FALSE</field>
|
|
||||||
<field name="LED24">FALSE</field>
|
|
||||||
<field name="LED34">FALSE</field>
|
|
||||||
<field name="LED44">FALSE</field>
|
|
||||||
</block>
|
|
||||||
</next>
|
|
||||||
</block>
|
|
||||||
</statement>
|
|
||||||
</block>
|
|
||||||
</xml>
|
</xml>
|
@ -1,16 +1 @@
|
|||||||
basic.forever(() => {
|
|
||||||
basic.showLeds(`
|
|
||||||
. # . # .
|
|
||||||
# . # . #
|
|
||||||
# . . . #
|
|
||||||
. # . # .
|
|
||||||
. . # . .
|
|
||||||
`)
|
|
||||||
basic.showLeds(`
|
|
||||||
. . . . .
|
|
||||||
. . . . .
|
|
||||||
. . . . .
|
|
||||||
. . . . .
|
|
||||||
. . . . .
|
|
||||||
`)
|
|
||||||
})
|
|
||||||
|
@ -85,7 +85,7 @@
|
|||||||
"game.setLife": "Sets the current life value",
|
"game.setLife": "Sets the current life value",
|
||||||
"game.setLife|param|value": "TODO",
|
"game.setLife|param|value": "TODO",
|
||||||
"game.setScore": "Sets the current score value",
|
"game.setScore": "Sets the current score value",
|
||||||
"game.setScore|param|value": "TODO",
|
"game.setScore|param|value": "new score value.",
|
||||||
"game.showScore": "Displays the score on the screen.",
|
"game.showScore": "Displays the score on the screen.",
|
||||||
"game.startCountdown": "Starts a game countdown timer",
|
"game.startCountdown": "Starts a game countdown timer",
|
||||||
"game.startCountdown|param|ms": "countdown duration in milliseconds, eg: 10000",
|
"game.startCountdown|param|ms": "countdown duration in milliseconds, eg: 10000",
|
||||||
@ -97,26 +97,28 @@
|
|||||||
"input.acceleration": "Get the acceleration value in milli-gravitys (when the board is laying flat with the screen up, x=0, y=0 and z=-1024)",
|
"input.acceleration": "Get the acceleration value in milli-gravitys (when the board is laying flat with the screen up, x=0, y=0 and z=-1024)",
|
||||||
"input.acceleration|param|dimension": "TODO",
|
"input.acceleration|param|dimension": "TODO",
|
||||||
"input.buttonIsPressed": "Get the button state (pressed or not) for ``A`` and ``B``.",
|
"input.buttonIsPressed": "Get the button state (pressed or not) for ``A`` and ``B``.",
|
||||||
|
"input.buttonIsPressed|param|button": "the button to query the request, eg: Button.A",
|
||||||
"input.calibrate": "Obsolete, compass calibration is automatic.",
|
"input.calibrate": "Obsolete, compass calibration is automatic.",
|
||||||
"input.compassHeading": "Get the current compass heading in degrees.",
|
"input.compassHeading": "Get the current compass heading in degrees.",
|
||||||
"input.lightLevel": "Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright.",
|
"input.lightLevel": "Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright.",
|
||||||
"input.magneticForce": "Get the magnetic force value in ``micro-Teslas`` (``µT``). This function is not supported in the simulator.",
|
"input.magneticForce": "Get the magnetic force value in ``micro-Teslas`` (``µT``). This function is not supported in the simulator.",
|
||||||
"input.magneticForce|param|dimension": "TODO",
|
"input.magneticForce|param|dimension": "TODO",
|
||||||
"input.onButtonPressed": "Do something when a button (``A``, ``B`` or both ``A+B``) is pressed",
|
"input.onButtonPressed": "Do something when a button (``A``, ``B`` or both ``A+B``) is pressed",
|
||||||
"input.onButtonPressed|param|body": "TODO",
|
"input.onButtonPressed|param|body": "code to run when event is raised",
|
||||||
"input.onButtonPressed|param|button": "TODO",
|
"input.onButtonPressed|param|button": "the button that needs to be pressed",
|
||||||
"input.onGesture": "Do something when when a gesture is done (like shaking the micro:bit).",
|
"input.onGesture": "Do something when when a gesture is done (like shaking the micro:bit).",
|
||||||
"input.onGesture|param|body": "TODO",
|
"input.onGesture|param|body": "code to run when gesture is raised",
|
||||||
|
"input.onGesture|param|gesture": "the type of gesture to track, eg: Gesture.Shake",
|
||||||
"input.onLogoDown": "Attaches code to run when the logo is oriented downwards and the board is vertical.",
|
"input.onLogoDown": "Attaches code to run when the logo is oriented downwards and the board is vertical.",
|
||||||
"input.onLogoDown|param|body": "TODO",
|
"input.onLogoDown|param|body": "TODO",
|
||||||
"input.onLogoUp": "Attaches code to run when the logo is oriented upwards and the board is vertical.",
|
"input.onLogoUp": "Attaches code to run when the logo is oriented upwards and the board is vertical.",
|
||||||
"input.onLogoUp|param|body": "TODO",
|
"input.onLogoUp|param|body": "TODO",
|
||||||
"input.onPinPressed": "Do something when a pin is pressed.",
|
"input.onPinPressed": "Do something when a pin is pressed.",
|
||||||
"input.onPinPressed|param|body": "the code to run when the pin is pressed",
|
"input.onPinPressed|param|body": "the code to run when the pin is pressed",
|
||||||
"input.onPinPressed|param|name": "the pin that needs to be pressed",
|
"input.onPinPressed|param|name": "the pin that needs to be pressed, eg: TouchPin.P0",
|
||||||
"input.onPinReleased": "Do something when a pin is released.",
|
"input.onPinReleased": "Do something when a pin is released.",
|
||||||
"input.onPinReleased|param|body": "the code to run when the pin is released",
|
"input.onPinReleased|param|body": "the code to run when the pin is released",
|
||||||
"input.onPinReleased|param|name": "the pin that needs to be released",
|
"input.onPinReleased|param|name": "the pin that needs to be released, eg: TouchPin.P0",
|
||||||
"input.onScreenDown": "Attaches code to run when the screen is facing down.",
|
"input.onScreenDown": "Attaches code to run when the screen is facing down.",
|
||||||
"input.onScreenDown|param|body": "TODO",
|
"input.onScreenDown|param|body": "TODO",
|
||||||
"input.onScreenUp": "Attaches code to run when the screen is facing up.",
|
"input.onScreenUp": "Attaches code to run when the screen is facing up.",
|
||||||
@ -124,7 +126,7 @@
|
|||||||
"input.onShake": "Attaches code to run when the device is shaken.",
|
"input.onShake": "Attaches code to run when the device is shaken.",
|
||||||
"input.onShake|param|body": "TODO",
|
"input.onShake|param|body": "TODO",
|
||||||
"input.pinIsPressed": "Get the pin state (pressed or not). Requires to hold the ground to close the circuit.",
|
"input.pinIsPressed": "Get the pin state (pressed or not). Requires to hold the ground to close the circuit.",
|
||||||
"input.pinIsPressed|param|name": "pin used to detect the touch",
|
"input.pinIsPressed|param|name": "pin used to detect the touch, eg: TouchPin.P0",
|
||||||
"input.rotation": "The pitch or roll of the device, rotation along the ``x-axis`` or ``y-axis``, in degrees.",
|
"input.rotation": "The pitch or roll of the device, rotation along the ``x-axis`` or ``y-axis``, in degrees.",
|
||||||
"input.rotation|param|kind": "TODO",
|
"input.rotation|param|kind": "TODO",
|
||||||
"input.runningTime": "Gets the number of milliseconds elapsed since power on.",
|
"input.runningTime": "Gets the number of milliseconds elapsed since power on.",
|
||||||
@ -166,7 +168,7 @@
|
|||||||
"music.changeTempoBy": "Change the tempo by the specified amount",
|
"music.changeTempoBy": "Change the tempo by the specified amount",
|
||||||
"music.changeTempoBy|param|bpm": "The change in beats per minute to the tempo, eg: 20",
|
"music.changeTempoBy|param|bpm": "The change in beats per minute to the tempo, eg: 20",
|
||||||
"music.noteFrequency": "Gets the frequency of a note.",
|
"music.noteFrequency": "Gets the frequency of a note.",
|
||||||
"music.noteFrequency|param|name": "the note name",
|
"music.noteFrequency|param|name": "the note name, eg: Note.C",
|
||||||
"music.playTone": "Plays a tone through pin ``P0`` for the given duration.",
|
"music.playTone": "Plays a tone through pin ``P0`` for the given duration.",
|
||||||
"music.playTone|param|frequency": "pitch of the tone to play in Hertz (Hz)",
|
"music.playTone|param|frequency": "pitch of the tone to play in Hertz (Hz)",
|
||||||
"music.playTone|param|ms": "tone duration in milliseconds (ms)",
|
"music.playTone|param|ms": "tone duration in milliseconds (ms)",
|
||||||
@ -182,21 +184,21 @@
|
|||||||
"pins.analogPitch|param|frequency": "frequency to modulate in Hz.",
|
"pins.analogPitch|param|frequency": "frequency to modulate in Hz.",
|
||||||
"pins.analogPitch|param|ms": "duration of the pitch in milli seconds.",
|
"pins.analogPitch|param|ms": "duration of the pitch in milli seconds.",
|
||||||
"pins.analogReadPin": "Read the connector value as analog, that is, as a value comprised between 0 and 1023.",
|
"pins.analogReadPin": "Read the connector value as analog, that is, as a value comprised between 0 and 1023.",
|
||||||
"pins.analogReadPin|param|name": "pin to write to",
|
"pins.analogReadPin|param|name": "pin to write to, eg: AnalogPin.P0",
|
||||||
"pins.analogSetPeriod": "Configures the Pulse-width modulation (PWM) of the analog output to the given value in **microseconds** or `1/1000` milliseconds.\nIf this pin is not configured as an analog output (using `analog write pin`), the operation has no effect.",
|
"pins.analogSetPeriod": "Configures the Pulse-width modulation (PWM) of the analog output to the given value in **microseconds** or `1/1000` milliseconds.\nIf this pin is not configured as an analog output (using `analog write pin`), the operation has no effect.",
|
||||||
"pins.analogSetPeriod|param|micros": "period in micro seconds. eg:20000",
|
"pins.analogSetPeriod|param|micros": "period in micro seconds. eg:20000",
|
||||||
"pins.analogSetPeriod|param|name": "analog pin to set period to",
|
"pins.analogSetPeriod|param|name": "analog pin to set period to, eg: AnalogPin.P0",
|
||||||
"pins.analogSetPitchPin": "Sets the pin used when using `analog pitch` or music.",
|
"pins.analogSetPitchPin": "Sets the pin used when using `analog pitch` or music.",
|
||||||
"pins.analogSetPitchPin|param|name": "pin to modulate pitch from",
|
"pins.analogSetPitchPin|param|name": "pin to modulate pitch from",
|
||||||
"pins.analogWritePin": "Set the connector value as analog. Value must be comprised between 0 and 1023.",
|
"pins.analogWritePin": "Set the connector value as analog. Value must be comprised between 0 and 1023.",
|
||||||
"pins.analogWritePin|param|name": "pin name to write to",
|
"pins.analogWritePin|param|name": "pin name to write to, eg: AnalogPin.P0",
|
||||||
"pins.analogWritePin|param|value": "value to write to the pin between ``0`` and ``1023``. eg:1023,0",
|
"pins.analogWritePin|param|value": "value to write to the pin between ``0`` and ``1023``. eg:1023,0",
|
||||||
"pins.createBuffer": "Create a new zero-initialized buffer.",
|
"pins.createBuffer": "Create a new zero-initialized buffer.",
|
||||||
"pins.createBuffer|param|size": "number of bytes in the buffer",
|
"pins.createBuffer|param|size": "number of bytes in the buffer",
|
||||||
"pins.digitalReadPin": "Read the specified pin or connector as either 0 or 1",
|
"pins.digitalReadPin": "Read the specified pin or connector as either 0 or 1",
|
||||||
"pins.digitalReadPin|param|name": "pin to read from",
|
"pins.digitalReadPin|param|name": "pin to read from, eg: DigitalPin.P0",
|
||||||
"pins.digitalWritePin": "Set a pin or connector value to either 0 or 1.",
|
"pins.digitalWritePin": "Set a pin or connector value to either 0 or 1.",
|
||||||
"pins.digitalWritePin|param|name": "pin to write to",
|
"pins.digitalWritePin|param|name": "pin to write to, eg: DigitalPin.P0",
|
||||||
"pins.digitalWritePin|param|value": "value to set on the pin, 1 eg,0",
|
"pins.digitalWritePin|param|value": "value to set on the pin, 1 eg,0",
|
||||||
"pins.i2cReadBuffer": "Read `size` bytes from a 7-bit I2C `address`.",
|
"pins.i2cReadBuffer": "Read `size` bytes from a 7-bit I2C `address`.",
|
||||||
"pins.i2cReadNumber": "Read one number from 7-bit I2C address.",
|
"pins.i2cReadNumber": "Read one number from 7-bit I2C address.",
|
||||||
@ -209,19 +211,21 @@
|
|||||||
"pins.map|param|toLow": "the lower bound of the value's target range",
|
"pins.map|param|toLow": "the lower bound of the value's target range",
|
||||||
"pins.map|param|value": "value to map in ranges",
|
"pins.map|param|value": "value to map in ranges",
|
||||||
"pins.onPulsed": "Configures this pin to a digital input, and generates events where the timestamp is the duration that this pin was either ``high`` or ``low``.",
|
"pins.onPulsed": "Configures this pin to a digital input, and generates events where the timestamp is the duration that this pin was either ``high`` or ``low``.",
|
||||||
|
"pins.onPulsed|param|name": "digital pin to register to, eg: DigitalPin.P0",
|
||||||
|
"pins.onPulsed|param|pulse": "the value of the pulse, eg: PulseValue.High",
|
||||||
"pins.pulseDuration": "Gets the duration of the last pulse in micro-seconds. This function should be called from a ``onPulsed`` handler.",
|
"pins.pulseDuration": "Gets the duration of the last pulse in micro-seconds. This function should be called from a ``onPulsed`` handler.",
|
||||||
"pins.pulseIn": "Returns the duration of a pulse in microseconds",
|
"pins.pulseIn": "Returns the duration of a pulse in microseconds",
|
||||||
"pins.pulseIn|param|name": "the pin which measures the pulse",
|
"pins.pulseIn|param|name": "the pin which measures the pulse, eg: DigitalPin.P0",
|
||||||
"pins.pulseIn|param|value": "the value of the pulse (default high)",
|
"pins.pulseIn|param|value": "the value of the pulse, eg: PulseValue.High",
|
||||||
"pins.servoSetPulse": "Configures this IO pin as an analog/pwm output, configures the period to be 20 ms, and sets the pulse width, based on the value it is given **microseconds** or `1/1000` milliseconds.",
|
"pins.servoSetPulse": "Configures this IO pin as an analog/pwm output, configures the period to be 20 ms, and sets the pulse width, based on the value it is given **microseconds** or `1/1000` milliseconds.",
|
||||||
"pins.servoSetPulse|param|micros": "pulse duration in micro seconds, eg:1500",
|
"pins.servoSetPulse|param|micros": "pulse duration in micro seconds, eg:1500",
|
||||||
"pins.servoSetPulse|param|name": "pin name",
|
"pins.servoSetPulse|param|name": "pin name",
|
||||||
"pins.servoWritePin": "Writes a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement).",
|
"pins.servoWritePin": "Writes a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement).",
|
||||||
"pins.servoWritePin|param|name": "pin to write to",
|
"pins.servoWritePin|param|name": "pin to write to, eg: AnalogPin.P0",
|
||||||
"pins.servoWritePin|param|value": "angle or rotation speed, eg:180,90,0",
|
"pins.servoWritePin|param|value": "angle or rotation speed, eg:180,90,0",
|
||||||
"pins.setPull": "Configures the pull of this pin.",
|
"pins.setPull": "Configures the pull of this pin.",
|
||||||
"pins.setPull|param|name": "pin to set the pull mode on",
|
"pins.setPull|param|name": "pin to set the pull mode on, eg: DigitalPin.P0",
|
||||||
"pins.setPull|param|pull": "one of the mbed pull configurations: PullUp, PullDown, PullNone ",
|
"pins.setPull|param|pull": "one of the mbed pull configurations, eg: PinPullMode.PullUp",
|
||||||
"pins.sizeOf": "Get the size in bytes of specified number format.",
|
"pins.sizeOf": "Get the size in bytes of specified number format.",
|
||||||
"pins.spiWrite": "Write to the SPI slave and return the response",
|
"pins.spiWrite": "Write to the SPI slave and return the response",
|
||||||
"pins.spiWrite|param|value": "Data to be sent to the SPI slave",
|
"pins.spiWrite|param|value": "Data to be sent to the SPI slave",
|
||||||
@ -232,8 +236,9 @@
|
|||||||
"serial.readUntil": "Reads a line of text from the serial port and returns the buffer when the delimiter is met.",
|
"serial.readUntil": "Reads a line of text from the serial port and returns the buffer when the delimiter is met.",
|
||||||
"serial.readUntil|param|delimiter": "text delimiter that separates each text chunk",
|
"serial.readUntil|param|delimiter": "text delimiter that separates each text chunk",
|
||||||
"serial.redirect": "Dynamically configuring the serial instance to use pins other than USBTX and USBRX.",
|
"serial.redirect": "Dynamically configuring the serial instance to use pins other than USBTX and USBRX.",
|
||||||
"serial.redirect|param|rx": "the new reception pin",
|
"serial.redirect|param|rate": "the new baud rate. eg: 115200",
|
||||||
"serial.redirect|param|tx": "the new transmission pins",
|
"serial.redirect|param|rx": "the new reception pin, eg: SerialPin.P1",
|
||||||
|
"serial.redirect|param|tx": "the new transmission pins, eg: SerialPin.P0",
|
||||||
"serial.writeLine": "Prints a line of text to the serial",
|
"serial.writeLine": "Prints a line of text to the serial",
|
||||||
"serial.writeNumber": "Prints a numeric value to the serial",
|
"serial.writeNumber": "Prints a numeric value to the serial",
|
||||||
"serial.writeString": "Sends a piece of text through Serial connection.",
|
"serial.writeString": "Sends a piece of text through Serial connection.",
|
||||||
|
@ -9,6 +9,8 @@
|
|||||||
"AcceleratorRange.TwoG|block": "2g",
|
"AcceleratorRange.TwoG|block": "2g",
|
||||||
"BaudRate.BaudRate115200|block": "115200",
|
"BaudRate.BaudRate115200|block": "115200",
|
||||||
"BaudRate.BaudRate9600|block": "9600",
|
"BaudRate.BaudRate9600|block": "9600",
|
||||||
|
"BeatFraction.Breve|block": "4",
|
||||||
|
"BeatFraction.Double|block": "2",
|
||||||
"BeatFraction.Eighth|block": "1/8",
|
"BeatFraction.Eighth|block": "1/8",
|
||||||
"BeatFraction.Half|block": "1/2",
|
"BeatFraction.Half|block": "1/2",
|
||||||
"BeatFraction.Quarter|block": "1/4",
|
"BeatFraction.Quarter|block": "1/4",
|
||||||
@ -31,6 +33,8 @@
|
|||||||
"DisplayMode.Greyscale|block": "greyscale",
|
"DisplayMode.Greyscale|block": "greyscale",
|
||||||
"EventCreationMode.CreateAndFire": "MicroBitEvent is initialised, and its event handlers are immediately fired (not suitable for use in interrupts!).",
|
"EventCreationMode.CreateAndFire": "MicroBitEvent is initialised, and its event handlers are immediately fired (not suitable for use in interrupts!).",
|
||||||
"EventCreationMode.CreateOnly": "MicroBitEvent is initialised, and no further processing takes place.",
|
"EventCreationMode.CreateOnly": "MicroBitEvent is initialised, and no further processing takes place.",
|
||||||
|
"Gesture.EightG": "Raised when a 8G shock is detected",
|
||||||
|
"Gesture.EightG|block": "8g",
|
||||||
"Gesture.FreeFall": "Raised when the board is falling!",
|
"Gesture.FreeFall": "Raised when the board is falling!",
|
||||||
"Gesture.FreeFall|block": "free fall",
|
"Gesture.FreeFall|block": "free fall",
|
||||||
"Gesture.LogoDown": "Raised when the logo is downward and the screen is vertical",
|
"Gesture.LogoDown": "Raised when the logo is downward and the screen is vertical",
|
||||||
@ -108,6 +112,7 @@
|
|||||||
"game.createSprite|block": "create sprite at|x: %x|y: %y",
|
"game.createSprite|block": "create sprite at|x: %x|y: %y",
|
||||||
"game.gameOver|block": "game over",
|
"game.gameOver|block": "game over",
|
||||||
"game.score|block": "score",
|
"game.score|block": "score",
|
||||||
|
"game.setScore|block": "set score %points",
|
||||||
"game.startCountdown|block": "start countdown|(ms) %duration",
|
"game.startCountdown|block": "start countdown|(ms) %duration",
|
||||||
"game|block": "game",
|
"game|block": "game",
|
||||||
"images.createBigImage|block": "create big image",
|
"images.createBigImage|block": "create big image",
|
||||||
@ -120,7 +125,7 @@
|
|||||||
"input.magneticForce|block": "magnetic force (µT)|%NAME",
|
"input.magneticForce|block": "magnetic force (µT)|%NAME",
|
||||||
"input.onButtonPressed|block": "on button|%NAME|pressed",
|
"input.onButtonPressed|block": "on button|%NAME|pressed",
|
||||||
"input.onGesture|block": "on |%NAME",
|
"input.onGesture|block": "on |%NAME",
|
||||||
"input.onPinPressed|block": "on pin %NAME|pressed",
|
"input.onPinPressed|block": "on pin %name|pressed",
|
||||||
"input.onPinReleased|block": "on pin %NAME|released",
|
"input.onPinReleased|block": "on pin %NAME|released",
|
||||||
"input.pinIsPressed|block": "pin %NAME|is pressed",
|
"input.pinIsPressed|block": "pin %NAME|is pressed",
|
||||||
"input.rotation|block": "rotation (°)|%NAME",
|
"input.rotation|block": "rotation (°)|%NAME",
|
||||||
@ -129,6 +134,7 @@
|
|||||||
"input.temperature|block": "temperature (°C)",
|
"input.temperature|block": "temperature (°C)",
|
||||||
"input|block": "input",
|
"input|block": "input",
|
||||||
"led.brightness|block": "brightness",
|
"led.brightness|block": "brightness",
|
||||||
|
"led.enable|block": "led enable %on",
|
||||||
"led.plotBarGraph|block": "plot bar graph of %value |up to %high",
|
"led.plotBarGraph|block": "plot bar graph of %value |up to %high",
|
||||||
"led.plot|block": "plot|x %x|y %y",
|
"led.plot|block": "plot|x %x|y %y",
|
||||||
"led.point|block": "point|x %x|y %y",
|
"led.point|block": "point|x %x|y %y",
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
/**
|
/**
|
||||||
* Provides access to basic micro:bit functionality.
|
* Provides access to basic micro:bit functionality.
|
||||||
*/
|
*/
|
||||||
//% color=#0078D7 weight=100
|
//% color=#0078D7 weight=100 icon="\uf00a"
|
||||||
namespace basic {
|
namespace basic {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -13,7 +13,7 @@ namespace basic {
|
|||||||
*/
|
*/
|
||||||
//% help=basic/show-number
|
//% help=basic/show-number
|
||||||
//% weight=96
|
//% weight=96
|
||||||
//% blockId=device_show_number block="show|number %number" blockGap=8 icon="\uf1ec"
|
//% blockId=device_show_number block="show|number %number" blockGap=8
|
||||||
//% async
|
//% async
|
||||||
//% parts="ledmatrix"
|
//% parts="ledmatrix"
|
||||||
void showNumber(int value, int interval = 150) {
|
void showNumber(int value, int interval = 150) {
|
||||||
@ -50,7 +50,7 @@ namespace basic {
|
|||||||
*/
|
*/
|
||||||
//% help=basic/show-string
|
//% help=basic/show-string
|
||||||
//% weight=87 blockGap=8
|
//% weight=87 blockGap=8
|
||||||
//% block="show|string %text" icon="\uf031"
|
//% block="show|string %text"
|
||||||
//% async
|
//% async
|
||||||
//% blockId=device_print_message
|
//% blockId=device_print_message
|
||||||
//% parts="ledmatrix"
|
//% parts="ledmatrix"
|
||||||
@ -73,7 +73,7 @@ namespace basic {
|
|||||||
* Turn off all LEDs
|
* Turn off all LEDs
|
||||||
*/
|
*/
|
||||||
//% help=basic/clear-screen weight=79
|
//% help=basic/clear-screen weight=79
|
||||||
//% blockId=device_clear_display block="clear screen" icon="\uf12d"
|
//% blockId=device_clear_display block="clear screen"
|
||||||
//% parts="ledmatrix"
|
//% parts="ledmatrix"
|
||||||
void clearScreen() {
|
void clearScreen() {
|
||||||
uBit.display.image.clear();
|
uBit.display.image.clear();
|
||||||
@ -112,7 +112,7 @@ namespace basic {
|
|||||||
* Repeats the code forever in the background. On each iteration, allows other codes to run.
|
* Repeats the code forever in the background. On each iteration, allows other codes to run.
|
||||||
* @param body code to execute
|
* @param body code to execute
|
||||||
*/
|
*/
|
||||||
//% help=basic/forever weight=55 blockGap=8
|
//% help=basic/forever weight=55 blockGap=8 blockAllowMultiple=1
|
||||||
//% blockId=device_forever block="forever" icon="\uf01e"
|
//% blockId=device_forever block="forever" icon="\uf01e"
|
||||||
void forever(Action a) {
|
void forever(Action a) {
|
||||||
if (a != 0) {
|
if (a != 0) {
|
||||||
|
@ -121,7 +121,7 @@ namespace control {
|
|||||||
/**
|
/**
|
||||||
* Schedules code that run in the background.
|
* Schedules code that run in the background.
|
||||||
*/
|
*/
|
||||||
//% help=control/in-background
|
//% help=control/in-background blockAllowMultiple=1
|
||||||
//% blockId="control_in_background" block="run in background" blockGap=8
|
//% blockId="control_in_background" block="run in background" blockGap=8
|
||||||
void inBackground(Action a) {
|
void inBackground(Action a) {
|
||||||
runInBackground(a);
|
runInBackground(a);
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* Runtime and event utilities.
|
* Runtime and event utilities.
|
||||||
*/
|
*/
|
||||||
//% weight=1 color="#333333"
|
//% weight=1 color="#333333" icon="\uf233"
|
||||||
//% advanced=true
|
//% advanced=true
|
||||||
namespace control {
|
namespace control {
|
||||||
|
|
||||||
|
@ -153,14 +153,20 @@ namespace Array_ {
|
|||||||
//%
|
//%
|
||||||
int length(RefCollection *c) { return c->length(); }
|
int length(RefCollection *c) { return c->length(); }
|
||||||
//%
|
//%
|
||||||
|
void setLength(RefCollection *c, int newLength) { c->setLength(newLength); }
|
||||||
|
//%
|
||||||
void push(RefCollection *c, uint32_t x) { c->push(x); }
|
void push(RefCollection *c, uint32_t x) { c->push(x); }
|
||||||
//%
|
//%
|
||||||
|
uint32_t pop(RefCollection *c) { return c->pop(); }
|
||||||
|
//%
|
||||||
uint32_t getAt(RefCollection *c, int x) { return c->getAt(x); }
|
uint32_t getAt(RefCollection *c, int x) { return c->getAt(x); }
|
||||||
//%
|
//%
|
||||||
void removeAt(RefCollection *c, int x) { c->removeAt(x); }
|
|
||||||
//%
|
|
||||||
void setAt(RefCollection *c, int x, uint32_t y) { c->setAt(x, y); }
|
void setAt(RefCollection *c, int x, uint32_t y) { c->setAt(x, y); }
|
||||||
//%
|
//%
|
||||||
|
uint32_t removeAt(RefCollection *c, int x) { return c->removeAt(x); }
|
||||||
|
//%
|
||||||
|
void insertAt(RefCollection *c, int x, uint32_t value) { c->insertAt(x, value); }
|
||||||
|
//%
|
||||||
int indexOf(RefCollection *c, uint32_t x, int start) { return c->indexOf(x, start); }
|
int indexOf(RefCollection *c, uint32_t x, int start) { return c->indexOf(x, start); }
|
||||||
//%
|
//%
|
||||||
int removeElement(RefCollection *c, uint32_t x) { return c->removeElement(x); }
|
int removeElement(RefCollection *c, uint32_t x) { return c->removeElement(x); }
|
||||||
|
5
libs/core/enums.d.ts
vendored
@ -115,6 +115,11 @@ declare namespace basic {
|
|||||||
*/
|
*/
|
||||||
//% block="6g"
|
//% block="6g"
|
||||||
SixG = 9, // MICROBIT_ACCELEROMETER_EVT_6G
|
SixG = 9, // MICROBIT_ACCELEROMETER_EVT_6G
|
||||||
|
/**
|
||||||
|
* Raised when a 8G shock is detected
|
||||||
|
*/
|
||||||
|
//% block="8g"
|
||||||
|
EightG = 10, // MICROBIT_ACCELEROMETER_EVT_8G
|
||||||
}
|
}
|
||||||
declare namespace input {
|
declare namespace input {
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ enum LedSpriteProperty {
|
|||||||
/**
|
/**
|
||||||
* A single-LED sprite game engine
|
* A single-LED sprite game engine
|
||||||
*/
|
*/
|
||||||
//% color=#008272 weight=32
|
//% color=#008272 weight=32 icon="\uf11b"
|
||||||
//% advanced=true
|
//% advanced=true
|
||||||
namespace game {
|
namespace game {
|
||||||
let _score: number = 0;
|
let _score: number = 0;
|
||||||
@ -40,7 +40,7 @@ namespace game {
|
|||||||
* @param x sprite horizontal coordinate, eg: 2
|
* @param x sprite horizontal coordinate, eg: 2
|
||||||
* @param y sprite vertical coordinate, eg: 2
|
* @param y sprite vertical coordinate, eg: 2
|
||||||
*/
|
*/
|
||||||
//% weight=60
|
//% weight=60 blockGap=8
|
||||||
//% blockId=game_create_sprite block="create sprite at|x: %x|y: %y"
|
//% blockId=game_create_sprite block="create sprite at|x: %x|y: %y"
|
||||||
//% parts="ledmatrix"
|
//% parts="ledmatrix"
|
||||||
export function createSprite(x: number, y: number): LedSprite {
|
export function createSprite(x: number, y: number): LedSprite {
|
||||||
@ -146,8 +146,9 @@ namespace game {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the current score value
|
* Sets the current score value
|
||||||
* @param value TODO
|
* @param value new score value.
|
||||||
*/
|
*/
|
||||||
|
//% blockId=game_set_score block="set score %points" blockGap=8
|
||||||
//% weight=10 help=game/set-score
|
//% weight=10 help=game/set-score
|
||||||
export function setScore(value: number): void {
|
export function setScore(value: number): void {
|
||||||
_score = Math.max(0, value);
|
_score = Math.max(0, value);
|
||||||
@ -589,7 +590,7 @@ namespace game {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Turns on the sprite (on by default)
|
* Turns on the sprite (on by default)
|
||||||
* @param this TODO
|
* @param this the sprite
|
||||||
*/
|
*/
|
||||||
public on(): void {
|
public on(): void {
|
||||||
this.setBrightness(255);
|
this.setBrightness(255);
|
||||||
@ -597,7 +598,7 @@ namespace game {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Turns off the sprite (on by default)
|
* Turns off the sprite (on by default)
|
||||||
* @param this TODO
|
* @param this the sprite
|
||||||
*/
|
*/
|
||||||
public off(): void {
|
public off(): void {
|
||||||
this.setBrightness(0);
|
this.setBrightness(0);
|
||||||
@ -605,8 +606,8 @@ namespace game {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the ``brightness`` of a sprite
|
* Set the ``brightness`` of a sprite
|
||||||
* @param this TODO
|
* @param this the sprite
|
||||||
* @param brightness TODO
|
* @param brightness the brightness from 0 (off) to 255 (on), eg: 255.
|
||||||
*/
|
*/
|
||||||
//% parts="ledmatrix"
|
//% parts="ledmatrix"
|
||||||
public setBrightness(brightness: number): void {
|
public setBrightness(brightness: number): void {
|
||||||
@ -616,8 +617,9 @@ namespace game {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Reports the ``brightness` of a sprite on the LED screen
|
* Reports the ``brightness` of a sprite on the LED screen
|
||||||
* @param this TODO
|
* @param this the sprite
|
||||||
*/
|
*/
|
||||||
|
//% parts="ledmatrix"
|
||||||
public brightness(): number {
|
public brightness(): number {
|
||||||
let r: number;
|
let r: number;
|
||||||
return this._brightness;
|
return this._brightness;
|
||||||
@ -625,8 +627,8 @@ namespace game {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Changes the ``y`` position by the given amount
|
* Changes the ``y`` position by the given amount
|
||||||
* @param this TODO
|
* @param this the sprite
|
||||||
* @param value TODO
|
* @param value the value to change brightness
|
||||||
*/
|
*/
|
||||||
public changeBrightnessBy(value: number): void {
|
public changeBrightnessBy(value: number): void {
|
||||||
this.setBrightness(this._brightness + value);
|
this.setBrightness(this._brightness + value);
|
||||||
@ -643,10 +645,12 @@ namespace game {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Deletes the sprite from the game engine. All further operation of the sprite will not have any effect.
|
* Deletes the sprite from the game engine. All further operation of the sprite will not have any effect.
|
||||||
* @param sprite TODO
|
* @param this sprite to delete
|
||||||
*/
|
*/
|
||||||
public delete(sprite: LedSprite): void {
|
//% weight=59
|
||||||
sprites.removeElement(sprite);
|
//% blockId="game_delete_sprite" block="delete %this"
|
||||||
|
public delete(): void {
|
||||||
|
sprites.removeElement(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
/**
|
/**
|
||||||
* Creation, manipulation and display of LED images.
|
* Creation, manipulation and display of LED images.
|
||||||
*/
|
*/
|
||||||
//% color=#5C2D91 weight=31
|
//% color=#5C2D91 weight=31 icon="\uf03e"
|
||||||
//% advanced=true
|
//% advanced=true
|
||||||
namespace images {
|
namespace images {
|
||||||
/**
|
/**
|
||||||
|
@ -104,18 +104,23 @@ enum class Gesture {
|
|||||||
* Raised when a 6G shock is detected
|
* Raised when a 6G shock is detected
|
||||||
*/
|
*/
|
||||||
//% block="6g"
|
//% block="6g"
|
||||||
SixG = MICROBIT_ACCELEROMETER_EVT_6G
|
SixG = MICROBIT_ACCELEROMETER_EVT_6G,
|
||||||
|
/**
|
||||||
|
* Raised when a 8G shock is detected
|
||||||
|
*/
|
||||||
|
//% block="8g"
|
||||||
|
EightG = MICROBIT_ACCELEROMETER_EVT_8G
|
||||||
};
|
};
|
||||||
|
|
||||||
//% color=300 weight=99
|
//% color=300 weight=99 icon="\uf192"
|
||||||
namespace input {
|
namespace input {
|
||||||
/**
|
/**
|
||||||
* Do something when a button (``A``, ``B`` or both ``A+B``) is pressed
|
* Do something when a button (``A``, ``B`` or both ``A+B``) is pressed
|
||||||
* @param button TODO
|
* @param button the button that needs to be pressed
|
||||||
* @param body TODO
|
* @param body code to run when event is raised
|
||||||
*/
|
*/
|
||||||
//% help=input/on-button-pressed weight=85 blockGap=8
|
//% help=input/on-button-pressed weight=85 blockGap=8
|
||||||
//% blockId=device_button_event block="on button|%NAME|pressed" icon="\uf192"
|
//% blockId=device_button_event block="on button|%NAME|pressed"
|
||||||
//% parts="buttonpair"
|
//% parts="buttonpair"
|
||||||
void onButtonPressed(Button button, Action body) {
|
void onButtonPressed(Button button, Action body) {
|
||||||
registerWithDal((int)button, MICROBIT_BUTTON_EVT_CLICK, body);
|
registerWithDal((int)button, MICROBIT_BUTTON_EVT_CLICK, body);
|
||||||
@ -123,26 +128,28 @@ namespace input {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Do something when when a gesture is done (like shaking the micro:bit).
|
* Do something when when a gesture is done (like shaking the micro:bit).
|
||||||
* @param body TODO
|
* @param gesture the type of gesture to track, eg: Gesture.Shake
|
||||||
|
* @param body code to run when gesture is raised
|
||||||
*/
|
*/
|
||||||
//% help=input/on-gesture weight=84 blockGap=8
|
//% help=input/on-gesture weight=84 blockGap=8
|
||||||
//% blockId=device_gesture_event block="on |%NAME" icon="\uf135"
|
//% blockId=device_gesture_event block="on |%NAME"
|
||||||
//% parts="accelerometer"
|
//% parts="accelerometer"
|
||||||
void onGesture(Gesture gesture, Action body) {
|
void onGesture(Gesture gesture, Action body) {
|
||||||
if ((int)gesture == MICROBIT_ACCELEROMETER_EVT_3G && uBit.accelerometer.getRange() < 3)
|
int gi = (int)gesture;
|
||||||
|
if (gi == MICROBIT_ACCELEROMETER_EVT_3G && uBit.accelerometer.getRange() < 3)
|
||||||
uBit.accelerometer.setRange(4);
|
uBit.accelerometer.setRange(4);
|
||||||
else if ((int)gesture == MICROBIT_ACCELEROMETER_EVT_6G && uBit.accelerometer.getRange() < 6)
|
else if ((gi == MICROBIT_ACCELEROMETER_EVT_6G || gi == MICROBIT_ACCELEROMETER_EVT_8G) && uBit.accelerometer.getRange() < 6)
|
||||||
uBit.accelerometer.setRange(8);
|
uBit.accelerometer.setRange(8);
|
||||||
registerWithDal(MICROBIT_ID_GESTURE, (int)gesture, body);
|
registerWithDal(MICROBIT_ID_GESTURE, gi, body);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Do something when a pin is pressed.
|
* Do something when a pin is pressed.
|
||||||
* @param name the pin that needs to be pressed
|
* @param name the pin that needs to be pressed, eg: TouchPin.P0
|
||||||
* @param body the code to run when the pin is pressed
|
* @param body the code to run when the pin is pressed
|
||||||
*/
|
*/
|
||||||
//% help=input/on-pin-pressed weight=83
|
//% help=input/on-pin-pressed weight=83
|
||||||
//% blockId=device_pin_event block="on pin %NAME|pressed" icon="\uf094"
|
//% blockId=device_pin_event block="on pin %name|pressed"
|
||||||
void onPinPressed(TouchPin name, Action body) {
|
void onPinPressed(TouchPin name, Action body) {
|
||||||
auto pin = getPin((int)name);
|
auto pin = getPin((int)name);
|
||||||
if (!pin) return;
|
if (!pin) return;
|
||||||
@ -154,11 +161,11 @@ namespace input {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Do something when a pin is released.
|
* Do something when a pin is released.
|
||||||
* @param name the pin that needs to be released
|
* @param name the pin that needs to be released, eg: TouchPin.P0
|
||||||
* @param body the code to run when the pin is released
|
* @param body the code to run when the pin is released
|
||||||
*/
|
*/
|
||||||
//% help=input/on-pin-released weight=6 blockGap=8
|
//% help=input/on-pin-released weight=6 blockGap=8
|
||||||
//% blockId=device_pin_released block="on pin %NAME|released" icon="\uf094"
|
//% blockId=device_pin_released block="on pin %NAME|released"
|
||||||
//% advanced=true
|
//% advanced=true
|
||||||
void onPinReleased(TouchPin name, Action body) {
|
void onPinReleased(TouchPin name, Action body) {
|
||||||
auto pin = getPin((int)name);
|
auto pin = getPin((int)name);
|
||||||
@ -171,6 +178,7 @@ namespace input {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the button state (pressed or not) for ``A`` and ``B``.
|
* Get the button state (pressed or not) for ``A`` and ``B``.
|
||||||
|
* @param button the button to query the request, eg: Button.A
|
||||||
*/
|
*/
|
||||||
//% help=input/button-is-pressed weight=60
|
//% help=input/button-is-pressed weight=60
|
||||||
//% block="button|%NAME|is pressed"
|
//% block="button|%NAME|is pressed"
|
||||||
@ -189,10 +197,10 @@ namespace input {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the pin state (pressed or not). Requires to hold the ground to close the circuit.
|
* Get the pin state (pressed or not). Requires to hold the ground to close the circuit.
|
||||||
* @param name pin used to detect the touch
|
* @param name pin used to detect the touch, eg: TouchPin.P0
|
||||||
*/
|
*/
|
||||||
//% help=input/pin-is-pressed weight=58
|
//% help=input/pin-is-pressed weight=58
|
||||||
//% blockId="device_pin_is_pressed" block="pin %NAME|is pressed" icon="\uf094"
|
//% blockId="device_pin_is_pressed" block="pin %NAME|is pressed"
|
||||||
//% blockGap=8
|
//% blockGap=8
|
||||||
bool pinIsPressed(TouchPin name) {
|
bool pinIsPressed(TouchPin name) {
|
||||||
auto pin = getPin((int)name);
|
auto pin = getPin((int)name);
|
||||||
@ -210,7 +218,7 @@ namespace input {
|
|||||||
* Get the acceleration value in milli-gravitys (when the board is laying flat with the screen up, x=0, y=0 and z=-1024)
|
* Get the acceleration value in milli-gravitys (when the board is laying flat with the screen up, x=0, y=0 and z=-1024)
|
||||||
* @param dimension TODO
|
* @param dimension TODO
|
||||||
*/
|
*/
|
||||||
//% help=input/acceleration weight=58 icon="\uf135"
|
//% help=input/acceleration weight=58
|
||||||
//% blockId=device_acceleration block="acceleration (mg)|%NAME" blockGap=8
|
//% blockId=device_acceleration block="acceleration (mg)|%NAME" blockGap=8
|
||||||
//% parts="accelerometer"
|
//% parts="accelerometer"
|
||||||
int acceleration(Dimension dimension) {
|
int acceleration(Dimension dimension) {
|
||||||
@ -227,7 +235,7 @@ namespace input {
|
|||||||
* Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright.
|
* Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright.
|
||||||
*/
|
*/
|
||||||
//% help=input/light-level weight=57
|
//% help=input/light-level weight=57
|
||||||
//% blockId=device_get_light_level block="light level" blockGap=8 icon="\uf185"
|
//% blockId=device_get_light_level block="light level" blockGap=8
|
||||||
//% parts="ledmatrix"
|
//% parts="ledmatrix"
|
||||||
int lightLevel() {
|
int lightLevel() {
|
||||||
return uBit.display.readLightLevel();
|
return uBit.display.readLightLevel();
|
||||||
@ -237,7 +245,7 @@ namespace input {
|
|||||||
* Get the current compass heading in degrees.
|
* Get the current compass heading in degrees.
|
||||||
*/
|
*/
|
||||||
//% help=input/compass-heading
|
//% help=input/compass-heading
|
||||||
//% weight=56 icon="\uf14e"
|
//% weight=56
|
||||||
//% blockId=device_heading block="compass heading (°)" blockGap=8
|
//% blockId=device_heading block="compass heading (°)" blockGap=8
|
||||||
//% parts="compass"
|
//% parts="compass"
|
||||||
int compassHeading() {
|
int compassHeading() {
|
||||||
@ -248,7 +256,7 @@ namespace input {
|
|||||||
/**
|
/**
|
||||||
* Gets the temperature in Celsius degrees (°C).
|
* Gets the temperature in Celsius degrees (°C).
|
||||||
*/
|
*/
|
||||||
//% weight=55 icon="\uf06d"
|
//% weight=55
|
||||||
//% help=input/temperature
|
//% help=input/temperature
|
||||||
//% blockId=device_temperature block="temperature (°C)" blockGap=8
|
//% blockId=device_temperature block="temperature (°C)" blockGap=8
|
||||||
//% parts="thermometer"
|
//% parts="thermometer"
|
||||||
@ -261,7 +269,7 @@ namespace input {
|
|||||||
* @param kind TODO
|
* @param kind TODO
|
||||||
*/
|
*/
|
||||||
//% help=input/rotation weight=52
|
//% help=input/rotation weight=52
|
||||||
//% blockId=device_get_rotation block="rotation (°)|%NAME" blockGap=8 icon="\uf197"
|
//% blockId=device_get_rotation block="rotation (°)|%NAME" blockGap=8
|
||||||
//% parts="accelerometer" advanced=true
|
//% parts="accelerometer" advanced=true
|
||||||
int rotation(Rotation kind) {
|
int rotation(Rotation kind) {
|
||||||
switch (kind) {
|
switch (kind) {
|
||||||
@ -276,7 +284,7 @@ namespace input {
|
|||||||
* @param dimension TODO
|
* @param dimension TODO
|
||||||
*/
|
*/
|
||||||
//% help=input/magnetic-force weight=51
|
//% help=input/magnetic-force weight=51
|
||||||
//% blockId=device_get_magnetic_force block="magnetic force (µT)|%NAME" blockGap=8 icon="\uf076"
|
//% blockId=device_get_magnetic_force block="magnetic force (µT)|%NAME" blockGap=8
|
||||||
//% parts="compass"
|
//% parts="compass"
|
||||||
//% advanced=true
|
//% advanced=true
|
||||||
int magneticForce(Dimension dimension) {
|
int magneticForce(Dimension dimension) {
|
||||||
@ -296,7 +304,7 @@ namespace input {
|
|||||||
* Gets the number of milliseconds elapsed since power on.
|
* Gets the number of milliseconds elapsed since power on.
|
||||||
*/
|
*/
|
||||||
//% help=input/running-time weight=50
|
//% help=input/running-time weight=50
|
||||||
//% blockId=device_get_running_time block="running time (ms)" icon="\uf017"
|
//% blockId=device_get_running_time block="running time (ms)"
|
||||||
//% advanced=true
|
//% advanced=true
|
||||||
int runningTime() {
|
int runningTime() {
|
||||||
return system_timer_current_time();
|
return system_timer_current_time();
|
||||||
@ -313,7 +321,7 @@ namespace input {
|
|||||||
* @param range a value describe the maximum strengh of acceleration measured
|
* @param range a value describe the maximum strengh of acceleration measured
|
||||||
*/
|
*/
|
||||||
//% help=input/set-accelerometer-range
|
//% help=input/set-accelerometer-range
|
||||||
//% blockId=device_set_accelerometer_range block="set accelerometer|range %range" icon="\uf135"
|
//% blockId=device_set_accelerometer_range block="set accelerometer|range %range"
|
||||||
//% weight=5
|
//% weight=5
|
||||||
//% parts="accelerometer"
|
//% parts="accelerometer"
|
||||||
//% advanced=true
|
//% advanced=true
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* Events and data from sensors
|
* Events and data from sensors
|
||||||
*/
|
*/
|
||||||
//% color=#B4009E weight=99
|
//% color=#B4009E weight=99 icon="\uf192"
|
||||||
namespace input {
|
namespace input {
|
||||||
/**
|
/**
|
||||||
* Attaches code to run when the screen is facing up.
|
* Attaches code to run when the screen is facing up.
|
||||||
|
@ -8,7 +8,7 @@ enum class DisplayMode_ {
|
|||||||
// TODO DISPLAY_MODE_BLACK_AND_WHITE_LIGHT_SENSE
|
// TODO DISPLAY_MODE_BLACK_AND_WHITE_LIGHT_SENSE
|
||||||
};
|
};
|
||||||
|
|
||||||
//% color=3 weight=35
|
//% color=3 weight=35 icon="\uf205"
|
||||||
namespace led {
|
namespace led {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -17,7 +17,7 @@ namespace led {
|
|||||||
* @param y TODO
|
* @param y TODO
|
||||||
*/
|
*/
|
||||||
//% help=led/plot weight=78
|
//% help=led/plot weight=78
|
||||||
//% blockId=device_plot block="plot|x %x|y %y" icon="\uf205" blockGap=8
|
//% blockId=device_plot block="plot|x %x|y %y" blockGap=8
|
||||||
//% parts="ledmatrix"
|
//% parts="ledmatrix"
|
||||||
void plot(int x, int y) {
|
void plot(int x, int y) {
|
||||||
uBit.display.image.setPixelValue(x, y, 1);
|
uBit.display.image.setPixelValue(x, y, 1);
|
||||||
@ -29,7 +29,7 @@ namespace led {
|
|||||||
* @param y TODO
|
* @param y TODO
|
||||||
*/
|
*/
|
||||||
//% help=led/unplot weight=77
|
//% help=led/unplot weight=77
|
||||||
//% blockId=device_unplot block="unplot|x %x|y %y" icon="\uf204" blockGap=8
|
//% blockId=device_unplot block="unplot|x %x|y %y" blockGap=8
|
||||||
//% parts="ledmatrix"
|
//% parts="ledmatrix"
|
||||||
void unplot(int x, int y) {
|
void unplot(int x, int y) {
|
||||||
uBit.display.image.setPixelValue(x, y, 0);
|
uBit.display.image.setPixelValue(x, y, 0);
|
||||||
@ -41,7 +41,7 @@ namespace led {
|
|||||||
* @param y TODO
|
* @param y TODO
|
||||||
*/
|
*/
|
||||||
//% help=led/point weight=76
|
//% help=led/point weight=76
|
||||||
//% blockId=device_point block="point|x %x|y %y" icon="\uf10c"
|
//% blockId=device_point block="point|x %x|y %y"
|
||||||
//% parts="ledmatrix"
|
//% parts="ledmatrix"
|
||||||
bool point(int x, int y) {
|
bool point(int x, int y) {
|
||||||
int pix = uBit.display.image.getPixelValue(x, y);
|
int pix = uBit.display.image.getPixelValue(x, y);
|
||||||
@ -52,7 +52,7 @@ namespace led {
|
|||||||
* Get the screen brightness from 0 (off) to 255 (full bright).
|
* Get the screen brightness from 0 (off) to 255 (full bright).
|
||||||
*/
|
*/
|
||||||
//% help=led/brightness weight=60
|
//% help=led/brightness weight=60
|
||||||
//% blockId=device_get_brightness block="brightness" icon="\uf042" blockGap=8
|
//% blockId=device_get_brightness block="brightness" blockGap=8
|
||||||
//% parts="ledmatrix"
|
//% parts="ledmatrix"
|
||||||
//% advanced=true
|
//% advanced=true
|
||||||
int brightness() {
|
int brightness() {
|
||||||
@ -64,7 +64,7 @@ namespace led {
|
|||||||
* @param value the brightness value, eg:255, 127, 0
|
* @param value the brightness value, eg:255, 127, 0
|
||||||
*/
|
*/
|
||||||
//% help=led/set-brightness weight=59
|
//% help=led/set-brightness weight=59
|
||||||
//% blockId=device_set_brightness block="set brightness %value" icon="\uf042"
|
//% blockId=device_set_brightness block="set brightness %value"
|
||||||
//% parts="ledmatrix"
|
//% parts="ledmatrix"
|
||||||
//% advanced=true
|
//% advanced=true
|
||||||
void setBrightness(int value) {
|
void setBrightness(int value) {
|
||||||
@ -75,7 +75,7 @@ namespace led {
|
|||||||
* Cancels the current animation and clears other pending animations.
|
* Cancels the current animation and clears other pending animations.
|
||||||
*/
|
*/
|
||||||
//% weight=50 help=led/stop-animation
|
//% weight=50 help=led/stop-animation
|
||||||
//% blockId=device_stop_animation block="stop animation" icon="\uf04d"
|
//% blockId=device_stop_animation block="stop animation"
|
||||||
//% parts="ledmatrix"
|
//% parts="ledmatrix"
|
||||||
//% advanced=true
|
//% advanced=true
|
||||||
void stopAnimation() {
|
void stopAnimation() {
|
||||||
@ -95,7 +95,7 @@ namespace led {
|
|||||||
/**
|
/**
|
||||||
* Turns on or off the display
|
* Turns on or off the display
|
||||||
*/
|
*/
|
||||||
//% help=led/enable blockId=device_led_enable icon="\uf04d"
|
//% help=led/enable blockId=device_led_enable block="led enable %on"
|
||||||
//% advanced=true parts="ledmatrix"
|
//% advanced=true parts="ledmatrix"
|
||||||
void enable(bool on) {
|
void enable(bool on) {
|
||||||
if (on) uBit.display.enable();
|
if (on) uBit.display.enable();
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* Control of the LED screen.
|
* Control of the LED screen.
|
||||||
*/
|
*/
|
||||||
//% color=#5C2D91 weight=97
|
//% color=#5C2D91 weight=97 icon="\uf205"
|
||||||
namespace led {
|
namespace led {
|
||||||
|
|
||||||
// what's the current high value
|
// what's the current high value
|
||||||
|
@ -119,13 +119,17 @@ enum BeatFraction {
|
|||||||
//% block="1/8"
|
//% block="1/8"
|
||||||
Eighth = 8,
|
Eighth = 8,
|
||||||
//% block="1/16"
|
//% block="1/16"
|
||||||
Sixteenth = 16
|
Sixteenth = 16,
|
||||||
|
//% block="2"
|
||||||
|
Double = 32,
|
||||||
|
//% block="4",
|
||||||
|
Breve = 64
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Generation of music tones through pin ``P0``.
|
* Generation of music tones through pin ``P0``.
|
||||||
*/
|
*/
|
||||||
//% color=#D83B01 weight=98
|
//% color=#D83B01 weight=98 icon="\uf025"
|
||||||
namespace music {
|
namespace music {
|
||||||
let beatsPerMinute: number = 120;
|
let beatsPerMinute: number = 120;
|
||||||
|
|
||||||
@ -135,7 +139,7 @@ namespace music {
|
|||||||
* @param ms tone duration in milliseconds (ms)
|
* @param ms tone duration in milliseconds (ms)
|
||||||
*/
|
*/
|
||||||
//% help=music/play-tone weight=90
|
//% help=music/play-tone weight=90
|
||||||
//% blockId=device_play_note block="play|tone %note=device_note|for %duration=device_beat" icon="\uf025" blockGap=8
|
//% blockId=device_play_note block="play|tone %note=device_note|for %duration=device_beat" blockGap=8
|
||||||
//% parts="headphone"
|
//% parts="headphone"
|
||||||
export function playTone(frequency: number, ms: number): void {
|
export function playTone(frequency: number, ms: number): void {
|
||||||
pins.analogPitch(frequency, ms);
|
pins.analogPitch(frequency, ms);
|
||||||
@ -146,7 +150,7 @@ namespace music {
|
|||||||
* @param frequency pitch of the tone to play in Hertz (Hz)
|
* @param frequency pitch of the tone to play in Hertz (Hz)
|
||||||
*/
|
*/
|
||||||
//% help=music/ring-tone weight=80
|
//% help=music/ring-tone weight=80
|
||||||
//% blockId=device_ring block="ring tone (Hz)|%note=device_note" icon="\uf025" blockGap=8
|
//% blockId=device_ring block="ring tone (Hz)|%note=device_note" blockGap=8
|
||||||
//% parts="headphone"
|
//% parts="headphone"
|
||||||
export function ringTone(frequency: number): void {
|
export function ringTone(frequency: number): void {
|
||||||
pins.analogPitch(frequency, 0);
|
pins.analogPitch(frequency, 0);
|
||||||
@ -166,7 +170,7 @@ namespace music {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the frequency of a note.
|
* Gets the frequency of a note.
|
||||||
* @param name the note name
|
* @param name the note name, eg: Note.C
|
||||||
*/
|
*/
|
||||||
//% weight=50 help=music/note-frequency
|
//% weight=50 help=music/note-frequency
|
||||||
//% blockId=device_note block="%note"
|
//% blockId=device_note block="%note"
|
||||||
@ -188,11 +192,15 @@ namespace music {
|
|||||||
init();
|
init();
|
||||||
if (fraction == null) fraction = BeatFraction.Whole;
|
if (fraction == null) fraction = BeatFraction.Whole;
|
||||||
let beat = 60000 / beatsPerMinute;
|
let beat = 60000 / beatsPerMinute;
|
||||||
if (fraction == BeatFraction.Whole) return beat;
|
switch (fraction) {
|
||||||
else if (fraction == BeatFraction.Half) return beat / 2;
|
case BeatFraction.Half: return beat / 2;
|
||||||
else if (fraction == BeatFraction.Quarter) return beat / 4
|
case BeatFraction.Quarter: return beat / 4;
|
||||||
else if (fraction == BeatFraction.Eighth) return beat / 8;
|
case BeatFraction.Eighth: return beat / 8;
|
||||||
else return beat / 16;
|
case BeatFraction.Sixteenth: return beat / 16;
|
||||||
|
case BeatFraction.Double: return beat * 2;
|
||||||
|
case BeatFraction.Breve: return beat * 4;
|
||||||
|
default: return beat;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -92,7 +92,7 @@ namespace pins {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Read the specified pin or connector as either 0 or 1
|
* Read the specified pin or connector as either 0 or 1
|
||||||
* @param name pin to read from
|
* @param name pin to read from, eg: DigitalPin.P0
|
||||||
*/
|
*/
|
||||||
//% help=pins/digital-read-pin weight=30
|
//% help=pins/digital-read-pin weight=30
|
||||||
//% blockId=device_get_digital_pin block="digital read|pin %name" blockGap=8
|
//% blockId=device_get_digital_pin block="digital read|pin %name" blockGap=8
|
||||||
@ -102,7 +102,7 @@ namespace pins {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a pin or connector value to either 0 or 1.
|
* Set a pin or connector value to either 0 or 1.
|
||||||
* @param name pin to write to
|
* @param name pin to write to, eg: DigitalPin.P0
|
||||||
* @param value value to set on the pin, 1 eg,0
|
* @param value value to set on the pin, 1 eg,0
|
||||||
*/
|
*/
|
||||||
//% help=pins/digital-write-pin weight=29
|
//% help=pins/digital-write-pin weight=29
|
||||||
@ -113,7 +113,7 @@ namespace pins {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Read the connector value as analog, that is, as a value comprised between 0 and 1023.
|
* Read the connector value as analog, that is, as a value comprised between 0 and 1023.
|
||||||
* @param name pin to write to
|
* @param name pin to write to, eg: AnalogPin.P0
|
||||||
*/
|
*/
|
||||||
//% help=pins/analog-read-pin weight=25
|
//% help=pins/analog-read-pin weight=25
|
||||||
//% blockId=device_get_analog_pin block="analog read|pin %name" blockGap="8"
|
//% blockId=device_get_analog_pin block="analog read|pin %name" blockGap="8"
|
||||||
@ -123,7 +123,7 @@ namespace pins {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the connector value as analog. Value must be comprised between 0 and 1023.
|
* Set the connector value as analog. Value must be comprised between 0 and 1023.
|
||||||
* @param name pin name to write to
|
* @param name pin name to write to, eg: AnalogPin.P0
|
||||||
* @param value value to write to the pin between ``0`` and ``1023``. eg:1023,0
|
* @param value value to write to the pin between ``0`` and ``1023``. eg:1023,0
|
||||||
*/
|
*/
|
||||||
//% help=pins/analog-write-pin weight=24
|
//% help=pins/analog-write-pin weight=24
|
||||||
@ -135,7 +135,7 @@ namespace pins {
|
|||||||
/**
|
/**
|
||||||
* Configures the Pulse-width modulation (PWM) of the analog output to the given value in **microseconds** or `1/1000` milliseconds.
|
* Configures the Pulse-width modulation (PWM) of the analog output to the given value in **microseconds** or `1/1000` milliseconds.
|
||||||
* If this pin is not configured as an analog output (using `analog write pin`), the operation has no effect.
|
* If this pin is not configured as an analog output (using `analog write pin`), the operation has no effect.
|
||||||
* @param name analog pin to set period to
|
* @param name analog pin to set period to, eg: AnalogPin.P0
|
||||||
* @param micros period in micro seconds. eg:20000
|
* @param micros period in micro seconds. eg:20000
|
||||||
*/
|
*/
|
||||||
//% help=pins/analog-set-period weight=23 blockGap=8
|
//% help=pins/analog-set-period weight=23 blockGap=8
|
||||||
@ -146,6 +146,8 @@ namespace pins {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Configures this pin to a digital input, and generates events where the timestamp is the duration that this pin was either ``high`` or ``low``.
|
* Configures this pin to a digital input, and generates events where the timestamp is the duration that this pin was either ``high`` or ``low``.
|
||||||
|
* @param name digital pin to register to, eg: DigitalPin.P0
|
||||||
|
* @param pulse the value of the pulse, eg: PulseValue.High
|
||||||
*/
|
*/
|
||||||
//% help=pins/on-pulsed weight=22 blockGap=8 advanced=true
|
//% help=pins/on-pulsed weight=22 blockGap=8 advanced=true
|
||||||
//% blockId=pins_on_pulsed block="on|pin %pin|pulsed %pulse"
|
//% blockId=pins_on_pulsed block="on|pin %pin|pulsed %pulse"
|
||||||
@ -169,8 +171,8 @@ namespace pins {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the duration of a pulse in microseconds
|
* Returns the duration of a pulse in microseconds
|
||||||
* @param name the pin which measures the pulse
|
* @param name the pin which measures the pulse, eg: DigitalPin.P0
|
||||||
* @param value the value of the pulse (default high)
|
* @param value the value of the pulse, eg: PulseValue.High
|
||||||
* @param maximum duration in micro-seconds
|
* @param maximum duration in micro-seconds
|
||||||
*/
|
*/
|
||||||
//% blockId="pins_pulse_in" block="pulse in (µs)|pin %name|pulsed %value"
|
//% blockId="pins_pulse_in" block="pulse in (µs)|pin %name|pulsed %value"
|
||||||
@ -198,7 +200,7 @@ namespace pins {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Writes a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement).
|
* Writes a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement).
|
||||||
* @param name pin to write to
|
* @param name pin to write to, eg: AnalogPin.P0
|
||||||
* @param value angle or rotation speed, eg:180,90,0
|
* @param value angle or rotation speed, eg:180,90,0
|
||||||
*/
|
*/
|
||||||
//% help=pins/servo-write-pin weight=20
|
//% help=pins/servo-write-pin weight=20
|
||||||
@ -260,8 +262,8 @@ namespace pins {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Configures the pull of this pin.
|
* Configures the pull of this pin.
|
||||||
* @param name pin to set the pull mode on
|
* @param name pin to set the pull mode on, eg: DigitalPin.P0
|
||||||
* @param pull one of the mbed pull configurations: PullUp, PullDown, PullNone
|
* @param pull one of the mbed pull configurations, eg: PinPullMode.PullUp
|
||||||
*/
|
*/
|
||||||
//% help=pins/set-pull weight=3 advanced=true
|
//% help=pins/set-pull weight=3 advanced=true
|
||||||
//% blockId=device_set_pull block="set pull|pin %pin|to %pull"
|
//% blockId=device_set_pull block="set pull|pin %pin|to %pull"
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* Control currents in Pins for analog/digital signals, servos, i2c, ...
|
* Control currents in Pins for analog/digital signals, servos, i2c, ...
|
||||||
*/
|
*/
|
||||||
//% color=#A80000 weight=30
|
//% color=#A80000 weight=30 icon="\uf140"
|
||||||
//% advanced=true
|
//% advanced=true
|
||||||
namespace pins {
|
namespace pins {
|
||||||
/**
|
/**
|
||||||
|
@ -117,7 +117,6 @@ namespace pxt {
|
|||||||
|
|
||||||
void RefObject::destroy() {
|
void RefObject::destroy() {
|
||||||
((RefObjectMethod)getVTable()->methods[0])(this);
|
((RefObjectMethod)getVTable()->methods[0])(this);
|
||||||
delete this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void RefObject::print() {
|
void RefObject::print() {
|
||||||
@ -132,6 +131,9 @@ namespace pxt {
|
|||||||
if (refmask[i]) decr(r->fields[i]);
|
if (refmask[i]) decr(r->fields[i]);
|
||||||
r->fields[i] = 0;
|
r->fields[i] = 0;
|
||||||
}
|
}
|
||||||
|
//RefRecord is allocated using placement new
|
||||||
|
r->~RefRecord();
|
||||||
|
::operator delete(r);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RefRecord_print(RefRecord *r)
|
void RefRecord_print(RefRecord *r)
|
||||||
@ -139,63 +141,373 @@ namespace pxt {
|
|||||||
printf("RefRecord %p r=%d size=%d bytes\n", r, r->refcnt, r->getVTable()->numbytes);
|
printf("RefRecord %p r=%d size=%d bytes\n", r, r->refcnt, r->getVTable()->numbytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RefCollection::push(uint32_t x) {
|
uint32_t Segment::get(uint32_t i)
|
||||||
if (isRef()) incr(x);
|
{
|
||||||
data.push_back(x);
|
#ifdef DEBUG_BUILD
|
||||||
|
printf("In Segment::get index:%u\n", i);
|
||||||
|
this->print();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (i < length)
|
||||||
|
{
|
||||||
|
if (data[i] != Segment::MissingValue)
|
||||||
|
{
|
||||||
|
return data[i];
|
||||||
|
}
|
||||||
|
error(ERR_MISSING_VALUE);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
error(ERR_OUT_OF_BOUNDS);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t RefCollection::getAt(int x) {
|
void Segment::set(uint32_t i, uint32_t value)
|
||||||
if (in_range(x)) {
|
{
|
||||||
uint32_t tmp = data.at(x);
|
if (i < size)
|
||||||
if (isRef()) incr(tmp);
|
{
|
||||||
|
data[i] = value;
|
||||||
|
}
|
||||||
|
else if (i < Segment::MaxSize)
|
||||||
|
{
|
||||||
|
growByMin(i + 1);
|
||||||
|
data[i] = value;
|
||||||
|
}
|
||||||
|
if (length <= i)
|
||||||
|
{
|
||||||
|
length = i + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG_BUILD
|
||||||
|
printf("In Segment::set\n");
|
||||||
|
this->print();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t Segment::growthFactor(uint16_t size)
|
||||||
|
{
|
||||||
|
if (size == 0)
|
||||||
|
{
|
||||||
|
return 4;
|
||||||
|
}
|
||||||
|
if (size < 64)
|
||||||
|
{
|
||||||
|
return size * 2; // Double
|
||||||
|
}
|
||||||
|
if (size < 512)
|
||||||
|
{
|
||||||
|
return size * 5/3; //Grow by 1.66 rate
|
||||||
|
}
|
||||||
|
return size + 256; //Grow by constant rate
|
||||||
|
}
|
||||||
|
|
||||||
|
void Segment::growByMin(uint16_t minSize)
|
||||||
|
{
|
||||||
|
growBy(max(minSize, growthFactor(size)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void Segment::growBy(uint16_t newSize)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_BUILD
|
||||||
|
printf("growBy: %d\n", newSize);
|
||||||
|
this->print();
|
||||||
|
#endif
|
||||||
|
if (size < newSize)
|
||||||
|
{
|
||||||
|
//this will throw if unable to allocate
|
||||||
|
uint32_t *tmp = (uint32_t*)(::operator new(newSize * sizeof(uint32_t)));
|
||||||
|
|
||||||
|
//Copy existing data
|
||||||
|
if (size)
|
||||||
|
{
|
||||||
|
memcpy(tmp, data, size * sizeof(uint32_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
//fill the rest with missing values;
|
||||||
|
for(uint16_t i = size; i < newSize; i++)
|
||||||
|
{
|
||||||
|
tmp[i] = Segment::MissingValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
//free older segment;
|
||||||
|
::operator delete(data);
|
||||||
|
|
||||||
|
data = tmp;
|
||||||
|
size = newSize;
|
||||||
|
|
||||||
|
#ifdef DEBUG_BUILD
|
||||||
|
printf("growBy - after reallocation\n");
|
||||||
|
this->print();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
//else { no shrinking yet; }
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Segment::ensure(uint16_t newSize)
|
||||||
|
{
|
||||||
|
if (newSize < size)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
growByMin(newSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Segment::setLength(uint32_t newLength)
|
||||||
|
{
|
||||||
|
if (newLength > size)
|
||||||
|
{
|
||||||
|
ensure(length);
|
||||||
|
}
|
||||||
|
length = newLength;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Segment::push(uint32_t value)
|
||||||
|
{
|
||||||
|
this->set(length, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t Segment::pop()
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_BUILD
|
||||||
|
printf("In Segment::pop\n");
|
||||||
|
this->print();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (length > 0)
|
||||||
|
{
|
||||||
|
uint32_t value = data[length];
|
||||||
|
data[length] = Segment::MissingValue;
|
||||||
|
--length;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
error(ERR_OUT_OF_BOUNDS);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//this function removes an element at index i and shifts the rest of the elements to
|
||||||
|
//left to fill the gap
|
||||||
|
uint32_t Segment::remove(uint32_t i)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_BUILD
|
||||||
|
printf("In Segment::remove index:%u\n", i);
|
||||||
|
this->print();
|
||||||
|
#endif
|
||||||
|
if (i < length)
|
||||||
|
{
|
||||||
|
//value to return
|
||||||
|
uint32_t ret = data[i];
|
||||||
|
if (i + 1 < length)
|
||||||
|
{
|
||||||
|
//Move the rest of the elements to fill in the gap.
|
||||||
|
memmove(data + i, data + i + 1, (length - i - 1) * sizeof(uint32_t));
|
||||||
|
}
|
||||||
|
length--;
|
||||||
|
data[length] = Segment::MissingValue;
|
||||||
|
#ifdef DEBUG_BUILD
|
||||||
|
printf("After Segment::remove index:%u\n", i);
|
||||||
|
this->print();
|
||||||
|
#endif
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
error(ERR_OUT_OF_BOUNDS);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//this function inserts element value at index i by shifting the rest of the elements right.
|
||||||
|
void Segment::insert(uint32_t i, uint32_t value)
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_BUILD
|
||||||
|
printf("In Segment::insert index:%u value:%u\n", i, value);
|
||||||
|
this->print();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (i < length)
|
||||||
|
{
|
||||||
|
ensure(length + 1);
|
||||||
|
if (i + 1 < length)
|
||||||
|
{
|
||||||
|
//Move the rest of the elements to fill in the gap.
|
||||||
|
memmove(data + i + 1, data + i, (length - i) * sizeof(uint32_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
data[i] = value;
|
||||||
|
length++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//This is insert beyond the length, just call set which will adjust the length
|
||||||
|
set(i, value);
|
||||||
|
}
|
||||||
|
#ifdef DEBUG_BUILD
|
||||||
|
printf("After Segment::insert index:%u\n", i);
|
||||||
|
this->print();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void Segment::print()
|
||||||
|
{
|
||||||
|
printf("Segment: %x, length: %u, size: %u\n", data, (uint)length, (uint)size);
|
||||||
|
for(uint i = 0; i < size; i++)
|
||||||
|
{
|
||||||
|
printf("%d ",(uint)data[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Segment::isValidIndex(uint32_t i)
|
||||||
|
{
|
||||||
|
if (i > length || data[i] == Segment::MissingValue)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Segment::getNextValidIndex(uint32_t i, uint32_t *result)
|
||||||
|
{
|
||||||
|
while (i < length)
|
||||||
|
{
|
||||||
|
if (data[i] != Segment::MissingValue)
|
||||||
|
{
|
||||||
|
*result = i;
|
||||||
|
|
||||||
|
#ifdef DEBUG_BUILD
|
||||||
|
printf("In Segment::getNextValidIndex result=%u\n",i);
|
||||||
|
this->print();
|
||||||
|
#endif
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Segment::destroy()
|
||||||
|
{
|
||||||
|
#ifdef DEBUG_BUILD
|
||||||
|
printf("In Segment::destroy\n");
|
||||||
|
this->print();
|
||||||
|
#endif
|
||||||
|
length = size = 0;
|
||||||
|
::operator delete(data);
|
||||||
|
data = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void RefCollection::push(uint32_t x)
|
||||||
|
{
|
||||||
|
if (isRef()) incr(x);
|
||||||
|
head.push(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t RefCollection::pop()
|
||||||
|
{
|
||||||
|
uint32_t ret = head.pop();
|
||||||
|
if (isRef())
|
||||||
|
{
|
||||||
|
incr(ret);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t RefCollection::getAt(int i)
|
||||||
|
{
|
||||||
|
if (head.isValidIndex(i))
|
||||||
|
{
|
||||||
|
uint32_t tmp = head.get(i);
|
||||||
|
if (isRef())
|
||||||
|
{
|
||||||
|
incr(tmp);
|
||||||
|
}
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
else {
|
else
|
||||||
|
{
|
||||||
error(ERR_OUT_OF_BOUNDS);
|
error(ERR_OUT_OF_BOUNDS);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void RefCollection::removeAt(int x) {
|
uint32_t RefCollection::removeAt(int i)
|
||||||
if (!in_range(x))
|
{
|
||||||
return;
|
if (!head.isValidIndex((uint32_t)i))
|
||||||
|
{
|
||||||
if (isRef()) decr(data.at(x));
|
error(ERR_OUT_OF_BOUNDS);
|
||||||
data.erase(data.begin()+x);
|
return 0;
|
||||||
|
}
|
||||||
|
if (isRef())
|
||||||
|
{
|
||||||
|
decr(head.get(i));
|
||||||
|
}
|
||||||
|
return head.remove(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RefCollection::setAt(int x, uint32_t y) {
|
void RefCollection::insertAt(int i, uint32_t value)
|
||||||
if (!in_range(x))
|
{
|
||||||
return;
|
if (i < length())
|
||||||
|
{
|
||||||
if (isRef()) {
|
head.insert(i, value);
|
||||||
decr(data.at(x));
|
if (isRef())
|
||||||
incr(y);
|
{
|
||||||
|
incr(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
error(ERR_OUT_OF_BOUNDS);
|
||||||
}
|
}
|
||||||
data.at(x) = y;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int RefCollection::indexOf(uint32_t x, int start) {
|
void RefCollection::setAt(int i, uint32_t value)
|
||||||
if (!in_range(start))
|
{
|
||||||
return -1;
|
if (isRef())
|
||||||
|
{
|
||||||
|
if (head.isValidIndex((uint32_t)i))
|
||||||
|
{
|
||||||
|
decr(head.get(i));
|
||||||
|
}
|
||||||
|
incr(value);
|
||||||
|
}
|
||||||
|
head.set(i, value);
|
||||||
|
}
|
||||||
|
|
||||||
if (isString()) {
|
int RefCollection::indexOf(uint32_t x, int start)
|
||||||
|
{
|
||||||
|
if (isString())
|
||||||
|
{
|
||||||
StringData *xx = (StringData*)x;
|
StringData *xx = (StringData*)x;
|
||||||
for (uint32_t i = start; i < data.size(); ++i) {
|
uint32_t i = start;
|
||||||
StringData *ee = (StringData*)data.at(i);
|
while(head.getNextValidIndex(start, &i))
|
||||||
|
{
|
||||||
|
StringData *ee = (StringData*)head.get(i);
|
||||||
if (xx->len == ee->len && memcmp(xx->data, ee->data, xx->len) == 0)
|
if (xx->len == ee->len && memcmp(xx->data, ee->data, xx->len) == 0)
|
||||||
|
{
|
||||||
return (int)i;
|
return (int)i;
|
||||||
}
|
}
|
||||||
} else {
|
start = i;
|
||||||
for (uint32_t i = start; i < data.size(); ++i)
|
}
|
||||||
if (data.at(i) == x)
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
uint32_t i = start;
|
||||||
|
while(head.getNextValidIndex(start, &i))
|
||||||
|
{
|
||||||
|
if (head.get(i) == x)
|
||||||
|
{
|
||||||
return (int)i;
|
return (int)i;
|
||||||
}
|
}
|
||||||
|
start = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int RefCollection::removeElement(uint32_t x) {
|
int RefCollection::removeElement(uint32_t x)
|
||||||
|
{
|
||||||
int idx = indexOf(x, 0);
|
int idx = indexOf(x, 0);
|
||||||
if (idx >= 0) {
|
if (idx >= 0) {
|
||||||
removeAt(idx);
|
removeAt(idx);
|
||||||
@ -237,16 +549,23 @@ namespace pxt {
|
|||||||
void RefCollection::destroy()
|
void RefCollection::destroy()
|
||||||
{
|
{
|
||||||
if (this->isRef())
|
if (this->isRef())
|
||||||
for (uint32_t i = 0; i < this->data.size(); ++i) {
|
{
|
||||||
decr(this->data[i]);
|
uint32_t start = 0;
|
||||||
this->data[i] = 0;
|
uint32_t i = 0;
|
||||||
|
while(head.getNextValidIndex(start, &i))
|
||||||
|
{
|
||||||
|
decr(this->head.get(i));
|
||||||
|
start = i;
|
||||||
}
|
}
|
||||||
this->data.resize(0);
|
}
|
||||||
|
this->head.destroy();
|
||||||
|
delete this;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RefCollection::print()
|
void RefCollection::print()
|
||||||
{
|
{
|
||||||
printf("RefCollection %p r=%d flags=%d size=%d [%p, ...]\n", this, refcnt, getFlags(), data.size(), data.size() > 0 ? data[0] : 0);
|
printf("RefCollection %p r=%d flags=%d size=%d\n", this, refcnt, getFlags(), head.getLength());
|
||||||
|
head.print();
|
||||||
}
|
}
|
||||||
|
|
||||||
PXT_VTABLE_CTOR(RefAction) {}
|
PXT_VTABLE_CTOR(RefAction) {}
|
||||||
@ -258,6 +577,9 @@ namespace pxt {
|
|||||||
decr(fields[i]);
|
decr(fields[i]);
|
||||||
fields[i] = 0;
|
fields[i] = 0;
|
||||||
}
|
}
|
||||||
|
//RefAction is allocated using placement new
|
||||||
|
this->~RefAction();
|
||||||
|
::operator delete(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
void RefAction::print()
|
void RefAction::print()
|
||||||
@ -272,6 +594,7 @@ namespace pxt {
|
|||||||
|
|
||||||
void RefLocal::destroy()
|
void RefLocal::destroy()
|
||||||
{
|
{
|
||||||
|
delete this;
|
||||||
}
|
}
|
||||||
|
|
||||||
PXT_VTABLE_CTOR(RefLocal) {
|
PXT_VTABLE_CTOR(RefLocal) {
|
||||||
@ -290,6 +613,7 @@ namespace pxt {
|
|||||||
void RefRefLocal::destroy()
|
void RefRefLocal::destroy()
|
||||||
{
|
{
|
||||||
decr(v);
|
decr(v);
|
||||||
|
delete this;
|
||||||
}
|
}
|
||||||
|
|
||||||
PXT_VTABLE_BEGIN(RefMap, 0, RefMapMarker)
|
PXT_VTABLE_BEGIN(RefMap, 0, RefMapMarker)
|
||||||
@ -304,6 +628,7 @@ namespace pxt {
|
|||||||
data[i].val = 0;
|
data[i].val = 0;
|
||||||
}
|
}
|
||||||
data.resize(0);
|
data.resize(0);
|
||||||
|
delete this;
|
||||||
}
|
}
|
||||||
|
|
||||||
int RefMap::findIdx(uint32_t key) {
|
int RefMap::findIdx(uint32_t key) {
|
||||||
|
@ -38,6 +38,7 @@ namespace pxt {
|
|||||||
ERR_OUT_OF_BOUNDS = 8,
|
ERR_OUT_OF_BOUNDS = 8,
|
||||||
ERR_REF_DELETED = 7,
|
ERR_REF_DELETED = 7,
|
||||||
ERR_SIZE = 9,
|
ERR_SIZE = 9,
|
||||||
|
ERR_MISSING_VALUE = 10,
|
||||||
} ERROR;
|
} ERROR;
|
||||||
|
|
||||||
extern const uint32_t functionsAndBytecode[];
|
extern const uint32_t functionsAndBytecode[];
|
||||||
@ -167,11 +168,53 @@ namespace pxt {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Segment {
|
||||||
|
private:
|
||||||
|
uint32_t* data;
|
||||||
|
uint16_t length;
|
||||||
|
uint16_t size;
|
||||||
|
|
||||||
|
static const uint16_t MaxSize = 0xFFFF;
|
||||||
|
static const uint32_t MissingValue = 0x80000000;
|
||||||
|
|
||||||
|
static uint16_t growthFactor(uint16_t size);
|
||||||
|
void growByMin(uint16_t minSize);
|
||||||
|
void growBy(uint16_t newSize);
|
||||||
|
void ensure(uint16_t newSize);
|
||||||
|
|
||||||
|
public:
|
||||||
|
Segment() : data (nullptr), length(0), size(0) {};
|
||||||
|
|
||||||
|
uint32_t get(uint32_t i);
|
||||||
|
void set(uint32_t i, uint32_t value);
|
||||||
|
|
||||||
|
uint32_t getLength() { return length;};
|
||||||
|
void setLength(uint32_t newLength);
|
||||||
|
|
||||||
|
void push(uint32_t value);
|
||||||
|
uint32_t pop();
|
||||||
|
|
||||||
|
uint32_t remove(uint32_t i);
|
||||||
|
void insert(uint32_t i, uint32_t value);
|
||||||
|
|
||||||
|
//Returns true if there is a valid index greater than or equal to 'i', returns false otherwise
|
||||||
|
//If 'i' is valid returns it in 'result', if not tries to find the next valid
|
||||||
|
//index < length which is valid.
|
||||||
|
bool getNextValidIndex(uint32_t i, uint32_t *result);
|
||||||
|
bool isValidIndex(uint32_t i);
|
||||||
|
|
||||||
|
void destroy();
|
||||||
|
|
||||||
|
void print();
|
||||||
|
};
|
||||||
|
|
||||||
// A ref-counted collection of either primitive or ref-counted objects (String, Image,
|
// A ref-counted collection of either primitive or ref-counted objects (String, Image,
|
||||||
// user-defined record, another collection)
|
// user-defined record, another collection)
|
||||||
class RefCollection
|
class RefCollection
|
||||||
: public RefObject
|
: public RefObject
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
Segment head;
|
||||||
public:
|
public:
|
||||||
// 1 - collection of refs (need decr)
|
// 1 - collection of refs (need decr)
|
||||||
// 2 - collection of strings (in fact we always have 3, never 2 alone)
|
// 2 - collection of strings (in fact we always have 3, never 2 alone)
|
||||||
@ -179,23 +222,23 @@ namespace pxt {
|
|||||||
inline bool isRef() { return getFlags() & 1; }
|
inline bool isRef() { return getFlags() & 1; }
|
||||||
inline bool isString() { return getFlags() & 2; }
|
inline bool isString() { return getFlags() & 2; }
|
||||||
|
|
||||||
std::vector<uint32_t> data;
|
|
||||||
|
|
||||||
RefCollection(uint16_t f);
|
RefCollection(uint16_t f);
|
||||||
|
|
||||||
inline bool in_range(int x) {
|
|
||||||
return (0 <= x && x < (int)data.size());
|
|
||||||
}
|
|
||||||
|
|
||||||
inline int length() { return data.size(); }
|
|
||||||
|
|
||||||
void destroy();
|
void destroy();
|
||||||
void print();
|
void print();
|
||||||
|
|
||||||
|
uint32_t length() { return head.getLength();}
|
||||||
|
void setLength(uint32_t newLength) { head.setLength(newLength); }
|
||||||
|
|
||||||
void push(uint32_t x);
|
void push(uint32_t x);
|
||||||
uint32_t getAt(int x);
|
uint32_t pop();
|
||||||
void removeAt(int x);
|
uint32_t getAt(int i);
|
||||||
void setAt(int x, uint32_t y);
|
void setAt(int i, uint32_t x);
|
||||||
|
//removes the element at index i and shifts the other elements left
|
||||||
|
uint32_t removeAt(int i);
|
||||||
|
//inserts the element at index i and moves the other elements right.
|
||||||
|
void insertAt(int i, uint32_t x);
|
||||||
|
|
||||||
int indexOf(uint32_t x, int start);
|
int indexOf(uint32_t x, int start);
|
||||||
int removeElement(uint32_t x);
|
int removeElement(uint32_t x);
|
||||||
};
|
};
|
||||||
|
@ -34,7 +34,7 @@ enum Delimiters {
|
|||||||
Hash = 6,
|
Hash = 6,
|
||||||
};
|
};
|
||||||
|
|
||||||
//% weight=2 color=30
|
//% weight=2 color=30 icon="\uf287"
|
||||||
//% advanced=true
|
//% advanced=true
|
||||||
namespace serial {
|
namespace serial {
|
||||||
// note that at least one // followed by % is needed per declaration!
|
// note that at least one // followed by % is needed per declaration!
|
||||||
@ -83,16 +83,19 @@ namespace serial {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Dynamically configuring the serial instance to use pins other than USBTX and USBRX.
|
* Dynamically configuring the serial instance to use pins other than USBTX and USBRX.
|
||||||
* @param tx the new transmission pins
|
* @param tx the new transmission pins, eg: SerialPin.P0
|
||||||
* @param rx the new reception pin
|
* @param rx the new reception pin, eg: SerialPin.P1
|
||||||
* @param baud the new baud rate. eg: 115200
|
* @param rate the new baud rate. eg: 115200
|
||||||
*/
|
*/
|
||||||
//% weight=10
|
//% weight=10
|
||||||
//% help=serial/redirect-to
|
//% help=serial/redirect-to
|
||||||
//% blockId=serial_redirect block="serial|redirect to|TX %tx|RX %rx|at baud rate %rate"
|
//% blockId=serial_redirect block="serial|redirect to|TX %tx|RX %rx|at baud rate %rate"
|
||||||
//% blockExternalInputs=1
|
//% blockExternalInputs=1
|
||||||
void redirect(SerialPin tx, SerialPin rx, BaudRate rate) {
|
void redirect(SerialPin tx, SerialPin rx, BaudRate rate) {
|
||||||
uBit.serial.redirect((PinName)tx, (PinName)rx);
|
MicroBitPin* txp = getPin(tx); if (!tx) return;
|
||||||
|
MicroBitPin* rxp = getPin(rx); if (!rx) return;
|
||||||
|
|
||||||
|
uBit.serial.redirect(txp->name, rxp->name);
|
||||||
uBit.serial.baud((int)rate);
|
uBit.serial.baud((int)rate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* Reading and writing data over a serial connection.
|
* Reading and writing data over a serial connection.
|
||||||
*/
|
*/
|
||||||
//% weight=2 color=#002050
|
//% weight=2 color=#002050 icon="\uf287"
|
||||||
//% advanced=true
|
//% advanced=true
|
||||||
namespace serial {
|
namespace serial {
|
||||||
/**
|
/**
|
||||||
|
102
libs/core/shims.d.ts
vendored
@ -4,7 +4,7 @@
|
|||||||
/**
|
/**
|
||||||
* Creation, manipulation and display of LED images.
|
* Creation, manipulation and display of LED images.
|
||||||
*/
|
*/
|
||||||
//% color=#5C2D91 weight=31
|
//% color=#5C2D91 weight=31 icon="\uf03e"
|
||||||
//% advanced=true
|
//% advanced=true
|
||||||
declare namespace images {
|
declare namespace images {
|
||||||
|
|
||||||
@ -126,7 +126,7 @@ declare interface Image {
|
|||||||
/**
|
/**
|
||||||
* Provides access to basic micro:bit functionality.
|
* Provides access to basic micro:bit functionality.
|
||||||
*/
|
*/
|
||||||
//% color=#0078D7 weight=100
|
//% color=#0078D7 weight=100 icon="\uf00a"
|
||||||
declare namespace basic {
|
declare namespace basic {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -135,7 +135,7 @@ declare namespace basic {
|
|||||||
*/
|
*/
|
||||||
//% help=basic/show-number
|
//% help=basic/show-number
|
||||||
//% weight=96
|
//% weight=96
|
||||||
//% blockId=device_show_number block="show|number %number" blockGap=8 icon="\uf1ec"
|
//% blockId=device_show_number block="show|number %number" blockGap=8
|
||||||
//% async
|
//% async
|
||||||
//% parts="ledmatrix" interval.defl=150 shim=basic::showNumber
|
//% parts="ledmatrix" interval.defl=150 shim=basic::showNumber
|
||||||
function showNumber(value: number, interval?: number): void;
|
function showNumber(value: number, interval?: number): void;
|
||||||
@ -160,7 +160,7 @@ declare namespace basic {
|
|||||||
*/
|
*/
|
||||||
//% help=basic/show-string
|
//% help=basic/show-string
|
||||||
//% weight=87 blockGap=8
|
//% weight=87 blockGap=8
|
||||||
//% block="show|string %text" icon="\uf031"
|
//% block="show|string %text"
|
||||||
//% async
|
//% async
|
||||||
//% blockId=device_print_message
|
//% blockId=device_print_message
|
||||||
//% parts="ledmatrix" interval.defl=150 shim=basic::showString
|
//% parts="ledmatrix" interval.defl=150 shim=basic::showString
|
||||||
@ -170,7 +170,7 @@ declare namespace basic {
|
|||||||
* Turn off all LEDs
|
* Turn off all LEDs
|
||||||
*/
|
*/
|
||||||
//% help=basic/clear-screen weight=79
|
//% help=basic/clear-screen weight=79
|
||||||
//% blockId=device_clear_display block="clear screen" icon="\uf12d"
|
//% blockId=device_clear_display block="clear screen"
|
||||||
//% parts="ledmatrix" shim=basic::clearScreen
|
//% parts="ledmatrix" shim=basic::clearScreen
|
||||||
function clearScreen(): void;
|
function clearScreen(): void;
|
||||||
|
|
||||||
@ -195,7 +195,7 @@ declare namespace basic {
|
|||||||
* Repeats the code forever in the background. On each iteration, allows other codes to run.
|
* Repeats the code forever in the background. On each iteration, allows other codes to run.
|
||||||
* @param body code to execute
|
* @param body code to execute
|
||||||
*/
|
*/
|
||||||
//% help=basic/forever weight=55 blockGap=8
|
//% help=basic/forever weight=55 blockGap=8 blockAllowMultiple=1
|
||||||
//% blockId=device_forever block="forever" icon="\uf01e" shim=basic::forever
|
//% blockId=device_forever block="forever" icon="\uf01e" shim=basic::forever
|
||||||
function forever(a: () => void): void;
|
function forever(a: () => void): void;
|
||||||
|
|
||||||
@ -211,49 +211,51 @@ declare namespace basic {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
//% color=300 weight=99
|
//% color=300 weight=99 icon="\uf192"
|
||||||
declare namespace input {
|
declare namespace input {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Do something when a button (``A``, ``B`` or both ``A+B``) is pressed
|
* Do something when a button (``A``, ``B`` or both ``A+B``) is pressed
|
||||||
* @param button TODO
|
* @param button the button that needs to be pressed
|
||||||
* @param body TODO
|
* @param body code to run when event is raised
|
||||||
*/
|
*/
|
||||||
//% help=input/on-button-pressed weight=85 blockGap=8
|
//% help=input/on-button-pressed weight=85 blockGap=8
|
||||||
//% blockId=device_button_event block="on button|%NAME|pressed" icon="\uf192"
|
//% blockId=device_button_event block="on button|%NAME|pressed"
|
||||||
//% parts="buttonpair" shim=input::onButtonPressed
|
//% parts="buttonpair" shim=input::onButtonPressed
|
||||||
function onButtonPressed(button: Button, body: () => void): void;
|
function onButtonPressed(button: Button, body: () => void): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Do something when when a gesture is done (like shaking the micro:bit).
|
* Do something when when a gesture is done (like shaking the micro:bit).
|
||||||
* @param body TODO
|
* @param gesture the type of gesture to track, eg: Gesture.Shake
|
||||||
|
* @param body code to run when gesture is raised
|
||||||
*/
|
*/
|
||||||
//% help=input/on-gesture weight=84 blockGap=8
|
//% help=input/on-gesture weight=84 blockGap=8
|
||||||
//% blockId=device_gesture_event block="on |%NAME" icon="\uf135"
|
//% blockId=device_gesture_event block="on |%NAME"
|
||||||
//% parts="accelerometer" shim=input::onGesture
|
//% parts="accelerometer" shim=input::onGesture
|
||||||
function onGesture(gesture: Gesture, body: () => void): void;
|
function onGesture(gesture: Gesture, body: () => void): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Do something when a pin is pressed.
|
* Do something when a pin is pressed.
|
||||||
* @param name the pin that needs to be pressed
|
* @param name the pin that needs to be pressed, eg: TouchPin.P0
|
||||||
* @param body the code to run when the pin is pressed
|
* @param body the code to run when the pin is pressed
|
||||||
*/
|
*/
|
||||||
//% help=input/on-pin-pressed weight=83
|
//% help=input/on-pin-pressed weight=83
|
||||||
//% blockId=device_pin_event block="on pin %NAME|pressed" icon="\uf094" shim=input::onPinPressed
|
//% blockId=device_pin_event block="on pin %name|pressed" shim=input::onPinPressed
|
||||||
function onPinPressed(name: TouchPin, body: () => void): void;
|
function onPinPressed(name: TouchPin, body: () => void): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Do something when a pin is released.
|
* Do something when a pin is released.
|
||||||
* @param name the pin that needs to be released
|
* @param name the pin that needs to be released, eg: TouchPin.P0
|
||||||
* @param body the code to run when the pin is released
|
* @param body the code to run when the pin is released
|
||||||
*/
|
*/
|
||||||
//% help=input/on-pin-released weight=6 blockGap=8
|
//% help=input/on-pin-released weight=6 blockGap=8
|
||||||
//% blockId=device_pin_released block="on pin %NAME|released" icon="\uf094"
|
//% blockId=device_pin_released block="on pin %NAME|released"
|
||||||
//% advanced=true shim=input::onPinReleased
|
//% advanced=true shim=input::onPinReleased
|
||||||
function onPinReleased(name: TouchPin, body: () => void): void;
|
function onPinReleased(name: TouchPin, body: () => void): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the button state (pressed or not) for ``A`` and ``B``.
|
* Get the button state (pressed or not) for ``A`` and ``B``.
|
||||||
|
* @param button the button to query the request, eg: Button.A
|
||||||
*/
|
*/
|
||||||
//% help=input/button-is-pressed weight=60
|
//% help=input/button-is-pressed weight=60
|
||||||
//% block="button|%NAME|is pressed"
|
//% block="button|%NAME|is pressed"
|
||||||
@ -264,10 +266,10 @@ declare namespace input {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the pin state (pressed or not). Requires to hold the ground to close the circuit.
|
* Get the pin state (pressed or not). Requires to hold the ground to close the circuit.
|
||||||
* @param name pin used to detect the touch
|
* @param name pin used to detect the touch, eg: TouchPin.P0
|
||||||
*/
|
*/
|
||||||
//% help=input/pin-is-pressed weight=58
|
//% help=input/pin-is-pressed weight=58
|
||||||
//% blockId="device_pin_is_pressed" block="pin %NAME|is pressed" icon="\uf094"
|
//% blockId="device_pin_is_pressed" block="pin %NAME|is pressed"
|
||||||
//% blockGap=8 shim=input::pinIsPressed
|
//% blockGap=8 shim=input::pinIsPressed
|
||||||
function pinIsPressed(name: TouchPin): boolean;
|
function pinIsPressed(name: TouchPin): boolean;
|
||||||
|
|
||||||
@ -275,7 +277,7 @@ declare namespace input {
|
|||||||
* Get the acceleration value in milli-gravitys (when the board is laying flat with the screen up, x=0, y=0 and z=-1024)
|
* Get the acceleration value in milli-gravitys (when the board is laying flat with the screen up, x=0, y=0 and z=-1024)
|
||||||
* @param dimension TODO
|
* @param dimension TODO
|
||||||
*/
|
*/
|
||||||
//% help=input/acceleration weight=58 icon="\uf135"
|
//% help=input/acceleration weight=58
|
||||||
//% blockId=device_acceleration block="acceleration (mg)|%NAME" blockGap=8
|
//% blockId=device_acceleration block="acceleration (mg)|%NAME" blockGap=8
|
||||||
//% parts="accelerometer" shim=input::acceleration
|
//% parts="accelerometer" shim=input::acceleration
|
||||||
function acceleration(dimension: Dimension): number;
|
function acceleration(dimension: Dimension): number;
|
||||||
@ -284,7 +286,7 @@ declare namespace input {
|
|||||||
* Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright.
|
* Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright.
|
||||||
*/
|
*/
|
||||||
//% help=input/light-level weight=57
|
//% help=input/light-level weight=57
|
||||||
//% blockId=device_get_light_level block="light level" blockGap=8 icon="\uf185"
|
//% blockId=device_get_light_level block="light level" blockGap=8
|
||||||
//% parts="ledmatrix" shim=input::lightLevel
|
//% parts="ledmatrix" shim=input::lightLevel
|
||||||
function lightLevel(): number;
|
function lightLevel(): number;
|
||||||
|
|
||||||
@ -292,7 +294,7 @@ declare namespace input {
|
|||||||
* Get the current compass heading in degrees.
|
* Get the current compass heading in degrees.
|
||||||
*/
|
*/
|
||||||
//% help=input/compass-heading
|
//% help=input/compass-heading
|
||||||
//% weight=56 icon="\uf14e"
|
//% weight=56
|
||||||
//% blockId=device_heading block="compass heading (°)" blockGap=8
|
//% blockId=device_heading block="compass heading (°)" blockGap=8
|
||||||
//% parts="compass" shim=input::compassHeading
|
//% parts="compass" shim=input::compassHeading
|
||||||
function compassHeading(): number;
|
function compassHeading(): number;
|
||||||
@ -300,7 +302,7 @@ declare namespace input {
|
|||||||
/**
|
/**
|
||||||
* Gets the temperature in Celsius degrees (°C).
|
* Gets the temperature in Celsius degrees (°C).
|
||||||
*/
|
*/
|
||||||
//% weight=55 icon="\uf06d"
|
//% weight=55
|
||||||
//% help=input/temperature
|
//% help=input/temperature
|
||||||
//% blockId=device_temperature block="temperature (°C)" blockGap=8
|
//% blockId=device_temperature block="temperature (°C)" blockGap=8
|
||||||
//% parts="thermometer" shim=input::temperature
|
//% parts="thermometer" shim=input::temperature
|
||||||
@ -311,7 +313,7 @@ declare namespace input {
|
|||||||
* @param kind TODO
|
* @param kind TODO
|
||||||
*/
|
*/
|
||||||
//% help=input/rotation weight=52
|
//% help=input/rotation weight=52
|
||||||
//% blockId=device_get_rotation block="rotation (°)|%NAME" blockGap=8 icon="\uf197"
|
//% blockId=device_get_rotation block="rotation (°)|%NAME" blockGap=8
|
||||||
//% parts="accelerometer" advanced=true shim=input::rotation
|
//% parts="accelerometer" advanced=true shim=input::rotation
|
||||||
function rotation(kind: Rotation): number;
|
function rotation(kind: Rotation): number;
|
||||||
|
|
||||||
@ -320,7 +322,7 @@ declare namespace input {
|
|||||||
* @param dimension TODO
|
* @param dimension TODO
|
||||||
*/
|
*/
|
||||||
//% help=input/magnetic-force weight=51
|
//% help=input/magnetic-force weight=51
|
||||||
//% blockId=device_get_magnetic_force block="magnetic force (µT)|%NAME" blockGap=8 icon="\uf076"
|
//% blockId=device_get_magnetic_force block="magnetic force (µT)|%NAME" blockGap=8
|
||||||
//% parts="compass"
|
//% parts="compass"
|
||||||
//% advanced=true shim=input::magneticForce
|
//% advanced=true shim=input::magneticForce
|
||||||
function magneticForce(dimension: Dimension): number;
|
function magneticForce(dimension: Dimension): number;
|
||||||
@ -329,7 +331,7 @@ declare namespace input {
|
|||||||
* Gets the number of milliseconds elapsed since power on.
|
* Gets the number of milliseconds elapsed since power on.
|
||||||
*/
|
*/
|
||||||
//% help=input/running-time weight=50
|
//% help=input/running-time weight=50
|
||||||
//% blockId=device_get_running_time block="running time (ms)" icon="\uf017"
|
//% blockId=device_get_running_time block="running time (ms)"
|
||||||
//% advanced=true shim=input::runningTime
|
//% advanced=true shim=input::runningTime
|
||||||
function runningTime(): number;
|
function runningTime(): number;
|
||||||
|
|
||||||
@ -344,7 +346,7 @@ declare namespace input {
|
|||||||
* @param range a value describe the maximum strengh of acceleration measured
|
* @param range a value describe the maximum strengh of acceleration measured
|
||||||
*/
|
*/
|
||||||
//% help=input/set-accelerometer-range
|
//% help=input/set-accelerometer-range
|
||||||
//% blockId=device_set_accelerometer_range block="set accelerometer|range %range" icon="\uf135"
|
//% blockId=device_set_accelerometer_range block="set accelerometer|range %range"
|
||||||
//% weight=5
|
//% weight=5
|
||||||
//% parts="accelerometer"
|
//% parts="accelerometer"
|
||||||
//% advanced=true shim=input::setAccelerometerRange
|
//% advanced=true shim=input::setAccelerometerRange
|
||||||
@ -360,7 +362,7 @@ declare namespace control {
|
|||||||
/**
|
/**
|
||||||
* Schedules code that run in the background.
|
* Schedules code that run in the background.
|
||||||
*/
|
*/
|
||||||
//% help=control/in-background
|
//% help=control/in-background blockAllowMultiple=1
|
||||||
//% blockId="control_in_background" block="run in background" blockGap=8 shim=control::inBackground
|
//% blockId="control_in_background" block="run in background" blockGap=8 shim=control::inBackground
|
||||||
function inBackground(a: () => void): void;
|
function inBackground(a: () => void): void;
|
||||||
|
|
||||||
@ -425,7 +427,7 @@ declare namespace control {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
//% color=3 weight=35
|
//% color=3 weight=35 icon="\uf205"
|
||||||
declare namespace led {
|
declare namespace led {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -434,7 +436,7 @@ declare namespace led {
|
|||||||
* @param y TODO
|
* @param y TODO
|
||||||
*/
|
*/
|
||||||
//% help=led/plot weight=78
|
//% help=led/plot weight=78
|
||||||
//% blockId=device_plot block="plot|x %x|y %y" icon="\uf205" blockGap=8
|
//% blockId=device_plot block="plot|x %x|y %y" blockGap=8
|
||||||
//% parts="ledmatrix" shim=led::plot
|
//% parts="ledmatrix" shim=led::plot
|
||||||
function plot(x: number, y: number): void;
|
function plot(x: number, y: number): void;
|
||||||
|
|
||||||
@ -444,7 +446,7 @@ declare namespace led {
|
|||||||
* @param y TODO
|
* @param y TODO
|
||||||
*/
|
*/
|
||||||
//% help=led/unplot weight=77
|
//% help=led/unplot weight=77
|
||||||
//% blockId=device_unplot block="unplot|x %x|y %y" icon="\uf204" blockGap=8
|
//% blockId=device_unplot block="unplot|x %x|y %y" blockGap=8
|
||||||
//% parts="ledmatrix" shim=led::unplot
|
//% parts="ledmatrix" shim=led::unplot
|
||||||
function unplot(x: number, y: number): void;
|
function unplot(x: number, y: number): void;
|
||||||
|
|
||||||
@ -454,7 +456,7 @@ declare namespace led {
|
|||||||
* @param y TODO
|
* @param y TODO
|
||||||
*/
|
*/
|
||||||
//% help=led/point weight=76
|
//% help=led/point weight=76
|
||||||
//% blockId=device_point block="point|x %x|y %y" icon="\uf10c"
|
//% blockId=device_point block="point|x %x|y %y"
|
||||||
//% parts="ledmatrix" shim=led::point
|
//% parts="ledmatrix" shim=led::point
|
||||||
function point(x: number, y: number): boolean;
|
function point(x: number, y: number): boolean;
|
||||||
|
|
||||||
@ -462,7 +464,7 @@ declare namespace led {
|
|||||||
* Get the screen brightness from 0 (off) to 255 (full bright).
|
* Get the screen brightness from 0 (off) to 255 (full bright).
|
||||||
*/
|
*/
|
||||||
//% help=led/brightness weight=60
|
//% help=led/brightness weight=60
|
||||||
//% blockId=device_get_brightness block="brightness" icon="\uf042" blockGap=8
|
//% blockId=device_get_brightness block="brightness" blockGap=8
|
||||||
//% parts="ledmatrix"
|
//% parts="ledmatrix"
|
||||||
//% advanced=true shim=led::brightness
|
//% advanced=true shim=led::brightness
|
||||||
function brightness(): number;
|
function brightness(): number;
|
||||||
@ -472,7 +474,7 @@ declare namespace led {
|
|||||||
* @param value the brightness value, eg:255, 127, 0
|
* @param value the brightness value, eg:255, 127, 0
|
||||||
*/
|
*/
|
||||||
//% help=led/set-brightness weight=59
|
//% help=led/set-brightness weight=59
|
||||||
//% blockId=device_set_brightness block="set brightness %value" icon="\uf042"
|
//% blockId=device_set_brightness block="set brightness %value"
|
||||||
//% parts="ledmatrix"
|
//% parts="ledmatrix"
|
||||||
//% advanced=true shim=led::setBrightness
|
//% advanced=true shim=led::setBrightness
|
||||||
function setBrightness(value: number): void;
|
function setBrightness(value: number): void;
|
||||||
@ -481,7 +483,7 @@ declare namespace led {
|
|||||||
* Cancels the current animation and clears other pending animations.
|
* Cancels the current animation and clears other pending animations.
|
||||||
*/
|
*/
|
||||||
//% weight=50 help=led/stop-animation
|
//% weight=50 help=led/stop-animation
|
||||||
//% blockId=device_stop_animation block="stop animation" icon="\uf04d"
|
//% blockId=device_stop_animation block="stop animation"
|
||||||
//% parts="ledmatrix"
|
//% parts="ledmatrix"
|
||||||
//% advanced=true shim=led::stopAnimation
|
//% advanced=true shim=led::stopAnimation
|
||||||
function stopAnimation(): void;
|
function stopAnimation(): void;
|
||||||
@ -497,7 +499,7 @@ declare namespace led {
|
|||||||
/**
|
/**
|
||||||
* Turns on or off the display
|
* Turns on or off the display
|
||||||
*/
|
*/
|
||||||
//% help=led/enable blockId=device_led_enable icon="\uf04d"
|
//% help=led/enable blockId=device_led_enable block="led enable %on"
|
||||||
//% advanced=true parts="ledmatrix" shim=led::enable
|
//% advanced=true parts="ledmatrix" shim=led::enable
|
||||||
function enable(on: boolean): void;
|
function enable(on: boolean): void;
|
||||||
|
|
||||||
@ -512,7 +514,7 @@ declare namespace pins {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Read the specified pin or connector as either 0 or 1
|
* Read the specified pin or connector as either 0 or 1
|
||||||
* @param name pin to read from
|
* @param name pin to read from, eg: DigitalPin.P0
|
||||||
*/
|
*/
|
||||||
//% help=pins/digital-read-pin weight=30
|
//% help=pins/digital-read-pin weight=30
|
||||||
//% blockId=device_get_digital_pin block="digital read|pin %name" blockGap=8 shim=pins::digitalReadPin
|
//% blockId=device_get_digital_pin block="digital read|pin %name" blockGap=8 shim=pins::digitalReadPin
|
||||||
@ -520,7 +522,7 @@ declare namespace pins {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a pin or connector value to either 0 or 1.
|
* Set a pin or connector value to either 0 or 1.
|
||||||
* @param name pin to write to
|
* @param name pin to write to, eg: DigitalPin.P0
|
||||||
* @param value value to set on the pin, 1 eg,0
|
* @param value value to set on the pin, 1 eg,0
|
||||||
*/
|
*/
|
||||||
//% help=pins/digital-write-pin weight=29
|
//% help=pins/digital-write-pin weight=29
|
||||||
@ -529,7 +531,7 @@ declare namespace pins {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Read the connector value as analog, that is, as a value comprised between 0 and 1023.
|
* Read the connector value as analog, that is, as a value comprised between 0 and 1023.
|
||||||
* @param name pin to write to
|
* @param name pin to write to, eg: AnalogPin.P0
|
||||||
*/
|
*/
|
||||||
//% help=pins/analog-read-pin weight=25
|
//% help=pins/analog-read-pin weight=25
|
||||||
//% blockId=device_get_analog_pin block="analog read|pin %name" blockGap="8" shim=pins::analogReadPin
|
//% blockId=device_get_analog_pin block="analog read|pin %name" blockGap="8" shim=pins::analogReadPin
|
||||||
@ -537,7 +539,7 @@ declare namespace pins {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the connector value as analog. Value must be comprised between 0 and 1023.
|
* Set the connector value as analog. Value must be comprised between 0 and 1023.
|
||||||
* @param name pin name to write to
|
* @param name pin name to write to, eg: AnalogPin.P0
|
||||||
* @param value value to write to the pin between ``0`` and ``1023``. eg:1023,0
|
* @param value value to write to the pin between ``0`` and ``1023``. eg:1023,0
|
||||||
*/
|
*/
|
||||||
//% help=pins/analog-write-pin weight=24
|
//% help=pins/analog-write-pin weight=24
|
||||||
@ -547,7 +549,7 @@ declare namespace pins {
|
|||||||
/**
|
/**
|
||||||
* Configures the Pulse-width modulation (PWM) of the analog output to the given value in **microseconds** or `1/1000` milliseconds.
|
* Configures the Pulse-width modulation (PWM) of the analog output to the given value in **microseconds** or `1/1000` milliseconds.
|
||||||
* If this pin is not configured as an analog output (using `analog write pin`), the operation has no effect.
|
* If this pin is not configured as an analog output (using `analog write pin`), the operation has no effect.
|
||||||
* @param name analog pin to set period to
|
* @param name analog pin to set period to, eg: AnalogPin.P0
|
||||||
* @param micros period in micro seconds. eg:20000
|
* @param micros period in micro seconds. eg:20000
|
||||||
*/
|
*/
|
||||||
//% help=pins/analog-set-period weight=23 blockGap=8
|
//% help=pins/analog-set-period weight=23 blockGap=8
|
||||||
@ -556,6 +558,8 @@ declare namespace pins {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Configures this pin to a digital input, and generates events where the timestamp is the duration that this pin was either ``high`` or ``low``.
|
* Configures this pin to a digital input, and generates events where the timestamp is the duration that this pin was either ``high`` or ``low``.
|
||||||
|
* @param name digital pin to register to, eg: DigitalPin.P0
|
||||||
|
* @param pulse the value of the pulse, eg: PulseValue.High
|
||||||
*/
|
*/
|
||||||
//% help=pins/on-pulsed weight=22 blockGap=8 advanced=true
|
//% help=pins/on-pulsed weight=22 blockGap=8 advanced=true
|
||||||
//% blockId=pins_on_pulsed block="on|pin %pin|pulsed %pulse" shim=pins::onPulsed
|
//% blockId=pins_on_pulsed block="on|pin %pin|pulsed %pulse" shim=pins::onPulsed
|
||||||
@ -571,8 +575,8 @@ declare namespace pins {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the duration of a pulse in microseconds
|
* Returns the duration of a pulse in microseconds
|
||||||
* @param name the pin which measures the pulse
|
* @param name the pin which measures the pulse, eg: DigitalPin.P0
|
||||||
* @param value the value of the pulse (default high)
|
* @param value the value of the pulse, eg: PulseValue.High
|
||||||
* @param maximum duration in micro-seconds
|
* @param maximum duration in micro-seconds
|
||||||
*/
|
*/
|
||||||
//% blockId="pins_pulse_in" block="pulse in (µs)|pin %name|pulsed %value"
|
//% blockId="pins_pulse_in" block="pulse in (µs)|pin %name|pulsed %value"
|
||||||
@ -581,7 +585,7 @@ declare namespace pins {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Writes a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement).
|
* Writes a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement).
|
||||||
* @param name pin to write to
|
* @param name pin to write to, eg: AnalogPin.P0
|
||||||
* @param value angle or rotation speed, eg:180,90,0
|
* @param value angle or rotation speed, eg:180,90,0
|
||||||
*/
|
*/
|
||||||
//% help=pins/servo-write-pin weight=20
|
//% help=pins/servo-write-pin weight=20
|
||||||
@ -617,8 +621,8 @@ declare namespace pins {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Configures the pull of this pin.
|
* Configures the pull of this pin.
|
||||||
* @param name pin to set the pull mode on
|
* @param name pin to set the pull mode on, eg: DigitalPin.P0
|
||||||
* @param pull one of the mbed pull configurations: PullUp, PullDown, PullNone
|
* @param pull one of the mbed pull configurations, eg: PinPullMode.PullUp
|
||||||
*/
|
*/
|
||||||
//% help=pins/set-pull weight=3 advanced=true
|
//% help=pins/set-pull weight=3 advanced=true
|
||||||
//% blockId=device_set_pull block="set pull|pin %pin|to %pull" shim=pins::setPull
|
//% blockId=device_set_pull block="set pull|pin %pin|to %pull" shim=pins::setPull
|
||||||
@ -654,7 +658,7 @@ declare namespace pins {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
//% weight=2 color=30
|
//% weight=2 color=30 icon="\uf287"
|
||||||
//% advanced=true
|
//% advanced=true
|
||||||
declare namespace serial {
|
declare namespace serial {
|
||||||
|
|
||||||
@ -685,9 +689,9 @@ declare namespace serial {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Dynamically configuring the serial instance to use pins other than USBTX and USBRX.
|
* Dynamically configuring the serial instance to use pins other than USBTX and USBRX.
|
||||||
* @param tx the new transmission pins
|
* @param tx the new transmission pins, eg: SerialPin.P0
|
||||||
* @param rx the new reception pin
|
* @param rx the new reception pin, eg: SerialPin.P1
|
||||||
* @param baud the new baud rate. eg: 115200
|
* @param rate the new baud rate. eg: 115200
|
||||||
*/
|
*/
|
||||||
//% weight=10
|
//% weight=10
|
||||||
//% help=serial/redirect-to
|
//% help=serial/redirect-to
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "devices",
|
"name": "devices",
|
||||||
"description": "The BLE specific services",
|
"description": "Camera, remote control and other Bluetooth services",
|
||||||
"files": [
|
"files": [
|
||||||
"README.md",
|
"README.md",
|
||||||
"enums.d.ts",
|
"enums.d.ts",
|
||||||
@ -9,16 +9,8 @@
|
|||||||
],
|
],
|
||||||
"public": true,
|
"public": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"core": "file:../core"
|
"core": "file:../core",
|
||||||
},
|
"bluetooth": "file:../bluetooth"
|
||||||
"yotta": {
|
|
||||||
"config": {
|
|
||||||
"microbit-dal": {
|
|
||||||
"bluetooth": {
|
|
||||||
"enabled": 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"installedVersion": "ljipgq"
|
"installedVersion": "ljipgq"
|
||||||
}
|
}
|
||||||
|
@ -24,7 +24,7 @@ using namespace pxt;
|
|||||||
// payload: string length (9), string (10 ... 28)
|
// payload: string length (9), string (10 ... 28)
|
||||||
#define PACKET_TYPE_STRING 2
|
#define PACKET_TYPE_STRING 2
|
||||||
|
|
||||||
//% color=270 weight=34
|
//% color=270 weight=34 icon="\uf012"
|
||||||
namespace radio {
|
namespace radio {
|
||||||
|
|
||||||
// -------------------------------------------------------------------------
|
// -------------------------------------------------------------------------
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
/**
|
/**
|
||||||
* Communicate data using radio packets
|
* Communicate data using radio packets
|
||||||
*/
|
*/
|
||||||
//% color=#E3008C weight=34
|
//% color=#E3008C weight=34 icon="\uf012"
|
||||||
namespace radio {
|
namespace radio {
|
||||||
export class Packet {
|
export class Packet {
|
||||||
/**
|
/**
|
||||||
|