Compare commits
132 Commits
Author | SHA1 | Date | |
---|---|---|---|
2798b579a6 | |||
9d23f82238 | |||
ce53d5c386 | |||
5d3471b3b2 | |||
08b9b10ac8 | |||
404d7cc4a2 | |||
7c43739e4b | |||
92d8adfdbd | |||
0f273131f6 | |||
9ae0c48477 | |||
5f538f418e | |||
859b68b6e3 | |||
6576f7bd66 | |||
5a670f3291 | |||
7129487618 | |||
e1797b457a | |||
c82efa452d | |||
493014af01 | |||
fb4a96d81b | |||
bbf115f33c | |||
5d9c2cf590 | |||
b99231f6e2 | |||
2676907129 | |||
6f4c533ebb | |||
85dcaea979 | |||
8560b31657 | |||
b896588f45 | |||
0b4d4facfe | |||
52ad897ee3 | |||
72582f2a60 | |||
2b2048da7d | |||
e85fa990bd | |||
81a61538c3 | |||
cc8751bd09 | |||
03f933a1c8 | |||
10a77d9fef | |||
773f8a8688 | |||
f67743d935 | |||
237a57ee86 | |||
b80edb43fc | |||
6c9b609fe0 | |||
26d78768c0 | |||
6812767555 | |||
2aa7c91ca7 | |||
baf2c3247f | |||
c9536b0cf2 | |||
7fd7e15bd4 | |||
948b0ef304 | |||
715771b991 | |||
65d48f4b02 | |||
283c331a5e | |||
ba96e94fa7 | |||
7e1248b8dc | |||
cbe280187a | |||
761e4f38cd | |||
a9137f7761 | |||
3274e237cf | |||
5261b2b270 | |||
1adede163a | |||
bb80874ef9 | |||
9e9d11cb94 | |||
c004aa4b1b | |||
cdd4798945 | |||
0f56142317 | |||
6927085d64 | |||
c1b654f092 | |||
2f551c97b5 | |||
01e6aab376 | |||
df17ba09ae | |||
9c09a427c9 | |||
4b35f0f751 | |||
bb03cc4357 | |||
6f8b17e4ba | |||
60c5dfc539 | |||
bca5839b49 | |||
47e3737245 | |||
b8d5ec853e | |||
46d42e5300 | |||
ffabb9b16d | |||
d62c10d278 | |||
e2b2aa7ff1 | |||
664c8dcd35 | |||
bd7430b642 | |||
61fd28d840 | |||
c33df897d5 | |||
3bb0bd2a9f | |||
7751061b51 | |||
88a7fa5038 | |||
3c8a62df54 | |||
c661fd0eca | |||
8a124812b6 | |||
02c41b59bd | |||
b003af6eae | |||
5e5709e48d | |||
dafb056730 | |||
721ae893bb | |||
45dd3fc1bf | |||
9626207a61 | |||
87b6e0aba1 | |||
0d9890cfac | |||
5d40750542 | |||
bd09754466 | |||
5740133921 | |||
4e23553824 | |||
9b68519aff | |||
e6dc3b8974 | |||
53634f4d6a | |||
3ee0c6ea42 | |||
ef098cbd28 | |||
356b17cb13 | |||
47d382135b | |||
241da7fbed | |||
feb17c5e45 | |||
6559f386d2 | |||
6bf46577f9 | |||
0130ecb0c2 | |||
9820a035ce | |||
88acd9254d | |||
650fe61dcd | |||
c4e57e0165 | |||
a55ddcbab3 | |||
f58508afa2 | |||
4b92de7516 | |||
6176963504 | |||
37ec692dc4 | |||
1c2dc68479 | |||
a33472dbd4 | |||
746dc5d5ab | |||
70bd81d9c2 | |||
400b9269ee | |||
d54baaca51 | |||
7c564ebaab |
@ -2,8 +2,9 @@ language: node_js
|
||||
node_js:
|
||||
- "5.7.0"
|
||||
script:
|
||||
- "node node_modules/kindscript/built/kind.js travis"
|
||||
- "node node_modules/kindscript/built/kind.js uploaddoc"
|
||||
- "node node_modules/pxt-core/built/pxt.js travis"
|
||||
- "(cd libs/lang-test0; node ../../node_modules/pxt-core/built/pxt.js run)"
|
||||
- "node node_modules/pxt-core/built/pxt.js uploaddoc"
|
||||
sudo: false
|
||||
notifications:
|
||||
email:
|
||||
|
2
.vscode/tasks.json
vendored
2
.vscode/tasks.json
vendored
@ -1,7 +1,7 @@
|
||||
{
|
||||
"version": "0.1.0",
|
||||
// Task runner is jake
|
||||
"command": "kind",
|
||||
"command": "pxt",
|
||||
// Need to be executed in shell / cmd
|
||||
"isShellCommand": true,
|
||||
"showOutput": "always",
|
||||
|
@ -1,4 +1,4 @@
|
||||
/// <reference path="../node_modules/kindscript/built/kind.d.ts"/>
|
||||
/// <reference path="../node_modules/pxt-core/built/pxt.d.ts"/>
|
||||
|
||||
import * as fs from 'fs';
|
||||
import * as path from 'path';
|
||||
@ -7,7 +7,7 @@ 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)
|
||||
|
||||
export function deployCoreAsync(res: ts.ks.CompileResult) {
|
||||
export function deployCoreAsync(res: ts.pxt.CompileResult) {
|
||||
return getBitDrivesAsync()
|
||||
.then(drives => {
|
||||
if (drives.length == 0) {
|
||||
@ -40,4 +40,4 @@ function getBitDrivesAsync(): Promise<string[]> {
|
||||
} else {
|
||||
return Promise.resolve([])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,3 +1,8 @@
|
||||
```sim
|
||||
basic.forever(() => {
|
||||
basic.showString("Hi!");
|
||||
})
|
||||
```
|
||||
# About
|
||||
|
||||
The [BBC micro:bit](https://www.microbit.co.uk) is a [pocket-size computer](/device) with a 5x5 display of 25 LEDs, Bluetooth and sensors that can be programmed by anyone.
|
||||
|
@ -1,5 +1,6 @@
|
||||
# Lessons
|
||||
|
||||
|
||||
### @short Lessons
|
||||
|
||||
### ~column
|
||||
|
@ -22,12 +22,9 @@ Learn how to creating a message with a **string**, `show string` to write your m
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
```cards
|
||||
basic.showString('Hi!')
|
||||
|
||||
input.onButtonPressed(Button.A, () => {
|
||||
|
||||
})
|
||||
input.onButtonPressed(Button.A, () => {})
|
||||
|
||||
```
|
||||
|
||||
|
@ -20,7 +20,7 @@ Learn how to **show LEDs**, to show an image on the BBC micro:bit's LED screen.
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
```cards
|
||||
basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
@ -28,10 +28,7 @@ basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
`)
|
||||
|
||||
|
||||
basic.pause(100)
|
||||
|
||||
```
|
||||
|
||||
## Objectives
|
||||
|
@ -23,18 +23,11 @@ Learn how to control a blinking LED. We will be learning how to create a blinkin
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
```cards
|
||||
led.plot(0, 0)
|
||||
|
||||
led.unplot(0, 0)
|
||||
|
||||
basic.pause(100)
|
||||
|
||||
basic.forever(() => {
|
||||
|
||||
})
|
||||
|
||||
|
||||
basic.forever(() => {})
|
||||
```
|
||||
|
||||
|
||||
|
@ -17,23 +17,13 @@ Learn the functions of **on data received**, **send number** and **receive numbe
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
|
||||
```cards
|
||||
basic.showNumber(0)
|
||||
|
||||
input.acceleration(Dimension.X)
|
||||
|
||||
led.plotBarGraph(0, 1023)
|
||||
|
||||
radio.onDataReceived(() => {
|
||||
|
||||
|
||||
})
|
||||
|
||||
radio.onDataReceived(() => {})
|
||||
radio.sendNumber(0)
|
||||
|
||||
radio.receiveNumber()
|
||||
|
||||
```
|
||||
|
||||
## Objectives
|
||||
|
@ -21,17 +21,12 @@ Learn how to use an if statements to run code run code depending on whether a co
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
```cards
|
||||
input.compassHeading()
|
||||
|
||||
basic.forever(() => {})
|
||||
|
||||
let x = 0
|
||||
|
||||
if (true) {}
|
||||
|
||||
basic.showString("Hello!")
|
||||
|
||||
basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
|
@ -21,22 +21,12 @@ Learn how to creating a **variable** to keep track of the current count. We will
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
```cards
|
||||
input.compassHeading()
|
||||
|
||||
basic.forever(() => {
|
||||
|
||||
|
||||
})
|
||||
|
||||
basic.forever(() => {})
|
||||
let x = 0
|
||||
|
||||
if (true) {
|
||||
|
||||
}
|
||||
|
||||
if (true) {}
|
||||
basic.showString("Hello!")
|
||||
|
||||
basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
@ -44,7 +34,6 @@ basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
`)
|
||||
|
||||
```
|
||||
|
||||
* **variable**: [read more...](/microbit/reference/variables/var)
|
||||
|
@ -21,21 +21,11 @@ Learn how to use an if statements to run code run code depending on whether a co
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
|
||||
input.onGesture(Gesture.Shake, () => {
|
||||
|
||||
})
|
||||
|
||||
|
||||
|
||||
```cards
|
||||
input.onGesture(Gesture.Shake, () => {})
|
||||
let x = 0
|
||||
x = Math.random(3)
|
||||
|
||||
if (true) {
|
||||
|
||||
}
|
||||
|
||||
Math.random(3)
|
||||
if (true) {}
|
||||
basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
@ -43,10 +33,6 @@ basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
`)
|
||||
|
||||
|
||||
|
||||
|
||||
```
|
||||
|
||||
## Objectives
|
||||
|
@ -21,13 +21,11 @@ Learn how to creating a **while loop**, `while condition do` to repeat code whil
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
```cards
|
||||
let x = 0
|
||||
basic.showNumber(0)
|
||||
while (true) {
|
||||
|
||||
basic.pause(20)
|
||||
}
|
||||
while (true) {}
|
||||
basic.pause(20)
|
||||
```
|
||||
|
||||
## Objectives
|
||||
|
@ -20,13 +20,8 @@ Learn how to `show LEDs` by showing an image on the LED screen. We will be learn
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
basic.forever(() => {
|
||||
|
||||
|
||||
})
|
||||
|
||||
|
||||
```cards
|
||||
basic.forever(() => {})
|
||||
basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
@ -34,11 +29,8 @@ basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
`)
|
||||
|
||||
basic.pause(100)
|
||||
|
||||
basic.clearScreen()
|
||||
|
||||
```
|
||||
|
||||
## Objectives
|
||||
|
@ -19,15 +19,10 @@ Learn how to create game blocks to keep track of the current score. We will be l
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
```cards
|
||||
game.addScore(1)
|
||||
|
||||
input.onButtonPressed(Button.A, () => {
|
||||
|
||||
})
|
||||
|
||||
input.onButtonPressed(Button.A, () => {})
|
||||
basic.showNumber(0)
|
||||
|
||||
```
|
||||
|
||||
## Objectives
|
||||
|
@ -18,15 +18,10 @@ Learn how to creating a message with a **game over** to write your message. We w
|
||||
## Documentation
|
||||
|
||||
|
||||
```docs
|
||||
```cards
|
||||
game.gameOver()
|
||||
|
||||
basic.showString("Hello!")
|
||||
|
||||
input.onButtonPressed(Button.A, () => {
|
||||
|
||||
})
|
||||
|
||||
input.onButtonPressed(Button.A, () => {})
|
||||
```
|
||||
|
||||
## Objectives
|
||||
|
@ -19,21 +19,12 @@ Learn how to get the acceleration **acceleration**, `acceleration` value (g-forc
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
|
||||
basic.forever(() => {
|
||||
|
||||
|
||||
})
|
||||
|
||||
```cards
|
||||
basic.forever(() => {})
|
||||
let x = 0
|
||||
|
||||
input.acceleration(Dimension.X)
|
||||
|
||||
Math.abs(0)
|
||||
|
||||
led.setBrightness(255)
|
||||
|
||||
basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
@ -41,7 +32,6 @@ basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
`)
|
||||
|
||||
```
|
||||
|
||||
## Objectives
|
||||
|
@ -21,22 +21,12 @@ Learn how to create numbers randomly by using the input of the BBC micro:bit. We
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
|
||||
input.onButtonPressed(Button.A, () => {
|
||||
|
||||
|
||||
})
|
||||
|
||||
```cards
|
||||
input.onButtonPressed(Button.A, () => {})
|
||||
let x = 0
|
||||
|
||||
basic.showNumber(0)
|
||||
|
||||
Math.random(3)
|
||||
|
||||
basic.clearScreen()
|
||||
|
||||
|
||||
```
|
||||
|
||||
## Objectives
|
||||
|
@ -26,10 +26,8 @@ Learn how to control a blinking LED. We will be learning how to create a blinkin
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
for (let i = 0; i < 5; i++) {
|
||||
|
||||
}
|
||||
```cards
|
||||
for (let i = 0; i < 5; i++) {}
|
||||
basic.showNumber(0)
|
||||
basic.pause(100)
|
||||
|
||||
|
@ -22,19 +22,11 @@ Learn how to use the **pin pressed**, `on pin pressed` to run code when the user
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
if (true) {
|
||||
|
||||
}
|
||||
|
||||
input.onPinPressed(TouchPin.P0, () => {
|
||||
|
||||
})
|
||||
```cards
|
||||
if (true) {}
|
||||
input.onPinPressed(TouchPin.P0, () => {})
|
||||
let x = 0
|
||||
Math.random(3)
|
||||
basic.showNumber(0)
|
||||
basic.pause(100)
|
||||
|
||||
|
||||
|
||||
```
|
||||
|
@ -19,14 +19,10 @@ Learn how to creating **conditionals**, `if condition do` to conditionally run c
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
if (true) {
|
||||
|
||||
}
|
||||
```cards
|
||||
if (true) {}
|
||||
Math.random(3)
|
||||
input.onGesture(Gesture.Shake, () => {
|
||||
|
||||
})
|
||||
input.onGesture(Gesture.Shake, () => {})
|
||||
basic.showNumber(7)
|
||||
basic.clearScreen()
|
||||
basic.showString("Hello!")
|
||||
|
@ -20,13 +20,9 @@ On Logo Up
|
||||
Learn how to plot image **on logo up**, `on logo up` to run code when the micro:bit screen is facing up and vertically orientated. We will be learning how to plot an image with the logo up, basic show LEDs, and logo down.
|
||||
|
||||
## Documentation
|
||||
```docs
|
||||
input.onLogoUp(() => {
|
||||
|
||||
})
|
||||
input.onLogoDown(() => {
|
||||
|
||||
})
|
||||
```cards
|
||||
input.onLogoUp(() => {})
|
||||
input.onLogoDown(() => {})
|
||||
basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
@ -34,8 +30,6 @@ basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
`)
|
||||
|
||||
|
||||
```
|
||||
|
||||
## Objectives
|
||||
|
@ -21,11 +21,9 @@ Learn how to **set brightness** of an image `set brightness` to set the brightne
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
```cards
|
||||
led.setBrightness(255)
|
||||
input.onButtonPressed(Button.A, () => {
|
||||
|
||||
})
|
||||
input.onButtonPressed(Button.A, () => {})
|
||||
basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
@ -33,7 +31,6 @@ basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
`)
|
||||
|
||||
```
|
||||
|
||||
## Objectives
|
||||
|
@ -15,14 +15,13 @@ Running Time
|
||||
Learn how to use running time. We will be learning how to create a pogo game using variables, forever loop, conditionals, on button pressed, as well as simple commands, such as show LEDs and clear screen.
|
||||
|
||||
## Documentation
|
||||
```docs
|
||||
```cards
|
||||
let jumps = 0
|
||||
let acc = input.acceleration(Dimension.Y)
|
||||
basic.showNumber(jumps)
|
||||
basic.showNumber(radio.receiveNumber())
|
||||
basic.showNumber(0)
|
||||
radio.receiveNumber()
|
||||
led.stopAnimation()
|
||||
jumps = jumps + 1;
|
||||
radio.sendNumber(jumps)
|
||||
radio.sendNumber(0)
|
||||
basic.forever(() => { })
|
||||
basic.showLeds(`
|
||||
. . . . .
|
||||
@ -32,11 +31,8 @@ basic.showLeds(`
|
||||
. # # # .
|
||||
`)
|
||||
basic.clearScreen()
|
||||
if (acc > 2000) {
|
||||
|
||||
}
|
||||
if (true) {}
|
||||
radio.onDataReceived(() => { })
|
||||
|
||||
```
|
||||
## Objectives
|
||||
|
||||
|
@ -23,10 +23,8 @@ Learn how to create a **local variable**, `var t :=time` where you can store dat
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
input.onGesture(Gesture.Shake, () => {
|
||||
|
||||
})
|
||||
```cards
|
||||
input.onGesture(Gesture.Shake, () => {})
|
||||
Math.random(3)
|
||||
let x = 0
|
||||
basic.showLeds(`
|
||||
|
@ -19,11 +19,9 @@ Learn how to create images that look like a rotating animation by using a while
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
```cards
|
||||
let x = 0
|
||||
input.onButtonPressed(Button.A, () => {
|
||||
|
||||
})
|
||||
input.onButtonPressed(Button.A, () => {})
|
||||
basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
@ -32,10 +30,8 @@ basic.showLeds(`
|
||||
. . . . .
|
||||
`)
|
||||
basic.pause(100)
|
||||
while (true) {
|
||||
|
||||
basic.pause(20)
|
||||
}
|
||||
while (true) {}
|
||||
basic.pause(20)
|
||||
```
|
||||
|
||||
## Objectives
|
||||
|
@ -23,7 +23,7 @@ Learn how to **clear screen**, `clear screen` to turn off all the LED lights on
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
```cards
|
||||
basic.clearScreen()
|
||||
basic.showLeds(`
|
||||
. . . . .
|
||||
@ -32,10 +32,7 @@ basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
`)
|
||||
input.onButtonPressed(Button.A, () => {
|
||||
|
||||
})
|
||||
|
||||
input.onButtonPressed(Button.A, () => {})
|
||||
```
|
||||
|
||||
## Objectives
|
||||
|
@ -24,10 +24,8 @@ Learn how to **show LEDs** to turn on a LED light pattern on the LED screen. We
|
||||
* **show LEDs** : [read more...](/microbit/reference/basic/show-leds)
|
||||
* **on button pressed** : [read more...](/microbit/reference/input/on-button-pressed)
|
||||
|
||||
```docs
|
||||
input.onButtonPressed(Button.A, () => {
|
||||
|
||||
})
|
||||
```cards
|
||||
input.onButtonPressed(Button.A, () => {})
|
||||
basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
@ -35,7 +33,6 @@ basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
`)
|
||||
|
||||
```
|
||||
|
||||
## Objectives
|
||||
|
@ -25,7 +25,7 @@ Learn how to show LEDs with a, `pause` to pause program execution for a specifie
|
||||
* **pause** : [read more...](/microbit/reference/basic/pause)
|
||||
* **forever** : [read more...](/microbit/reference/basic/forever)
|
||||
|
||||
```docs
|
||||
```cards
|
||||
basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
@ -34,8 +34,5 @@ basic.showLeds(`
|
||||
. . . . .
|
||||
`)
|
||||
basic.pause(100)
|
||||
basic.forever(() => {
|
||||
|
||||
})
|
||||
|
||||
basic.forever(() => {})
|
||||
```
|
||||
|
@ -22,14 +22,10 @@ Learn how to use an if statement to run code run code depending on whether a con
|
||||
## Documentation
|
||||
|
||||
|
||||
```docs
|
||||
if (true) {
|
||||
|
||||
}
|
||||
```cards
|
||||
if (true) {}
|
||||
let x = 0
|
||||
input.onGesture(Gesture.Shake, () => {
|
||||
|
||||
})
|
||||
input.onGesture(Gesture.Shake, () => {})
|
||||
Math.random(3)
|
||||
basic.showLeds(`
|
||||
. . . . .
|
||||
|
@ -17,14 +17,11 @@ For Loop
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
```cards
|
||||
led.plot(0, 0)
|
||||
led.unplot(0, 0)
|
||||
for (let i = 0; i < 5; i++) {
|
||||
|
||||
}
|
||||
for (let i = 0; i < 5; i++) {}
|
||||
basic.pause(100)
|
||||
|
||||
```
|
||||
|
||||
## Objectives
|
||||
|
@ -17,15 +17,12 @@ Learn how to get the ambient temperature (degree Celsius °C). The temperature i
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
```cards
|
||||
input.temperature()
|
||||
let x = 0
|
||||
basic.showNumber(7)
|
||||
basic.showString("Hello!")
|
||||
input.onGesture(Gesture.Shake, () => {
|
||||
|
||||
})
|
||||
|
||||
input.onGesture(Gesture.Shake, () => {})
|
||||
```
|
||||
|
||||
## Objectives
|
||||
|
@ -21,7 +21,7 @@ Learn how to use an if statement to run code run code depending on whether a con
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
```cards
|
||||
basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
@ -29,16 +29,11 @@ basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
`)
|
||||
input.onButtonPressed(Button.A, () => {
|
||||
|
||||
})
|
||||
input.onButtonPressed(Button.A, () => {})
|
||||
let x = 0
|
||||
Math.random(3)
|
||||
if (true) {
|
||||
|
||||
}
|
||||
if (true) {}
|
||||
basic.showString("Hello!")
|
||||
|
||||
```
|
||||
|
||||
## Objectives
|
||||
|
@ -21,7 +21,7 @@ Learn how to get the **acceleration**, `acceleration` in one of three specified
|
||||
|
||||
## Documentation
|
||||
|
||||
```docs
|
||||
```cards
|
||||
basic.forever(() => {
|
||||
})
|
||||
let x = 0
|
||||
|
@ -1,460 +1,17 @@
|
||||
# Reference
|
||||
|
||||
### @section full
|
||||
|
||||
### ~column
|
||||
|
||||
### Basic
|
||||
|
||||
[show number](/microbit/reference/basic/show-number)
|
||||
|
||||
~~~~block
|
||||
basic.showNumber(2)
|
||||
~~~~
|
||||
|
||||
[show string](/microbit/reference/basic/show-string)
|
||||
|
||||
~~~~block
|
||||
basic.showString('Hello!')
|
||||
~~~~
|
||||
|
||||
[show LEDs](/microbit/reference/basic/show-leds)
|
||||
|
||||
~~~~block
|
||||
basic.showLeds(`. . . . .
|
||||
. # . # .
|
||||
. . . . .
|
||||
# . . . #
|
||||
. # # # .`)
|
||||
~~~~
|
||||
|
||||
[clear screen](/microbit/reference/basic/clear-screen)
|
||||
|
||||
~~~~block
|
||||
basic.clearScreen()
|
||||
~~~~
|
||||
|
||||
[forever](/microbit/reference/basic/forever)
|
||||
|
||||
~~~~block
|
||||
basic.forever(() => { })
|
||||
~~~~
|
||||
|
||||
[pause](/microbit/reference/basic/pause)
|
||||
|
||||
```block
|
||||
basic.pause(200)
|
||||
```
|
||||
|
||||
### Input
|
||||
|
||||
[on button pressed](/microbit/reference/input/on-button-pressed)
|
||||
|
||||
```block
|
||||
input.onButtonPressed(Button.A, () => {})
|
||||
```
|
||||
|
||||
[on pin pressed](/microbit/reference/input/on-pin-pressed)
|
||||
|
||||
```block
|
||||
input.onPinPressed(TouchPin.P0, () => {})
|
||||
```
|
||||
|
||||
[on shake](/microbit/reference/input/on-shake)
|
||||
|
||||

|
||||
|
||||
[on logo up](/microbit/reference/on-logo-up)
|
||||
|
||||

|
||||
|
||||
[on logo down](/microbit/reference/on-logo-down)
|
||||
|
||||

|
||||
|
||||
[on screen up](/microbit/reference/on-screen-up)
|
||||
|
||||

|
||||
|
||||
[on screen down](/microbit/reference/on-screen-down)
|
||||
|
||||

|
||||
|
||||
[button is pressed](/microbit/reference/button-is-pressed)
|
||||
|
||||

|
||||
|
||||
[compass heading](/microbit/reference/compass-heading)
|
||||
|
||||

|
||||
|
||||
[temperature](/microbit/reference/temperature)
|
||||
|
||||

|
||||
|
||||
[acceleration](/microbit/reference/input/acceleration)
|
||||
|
||||

|
||||
|
||||
[rotation](/microbit/reference/rotation)
|
||||
|
||||

|
||||
|
||||
[magnetic force](/microbit/reference/magnetic-force)
|
||||
|
||||

|
||||
|
||||
[running time](/microbit/reference/running-time)
|
||||
|
||||

|
||||
|
||||
### Loops
|
||||
|
||||
[for](/microbit/reference/loops/for)
|
||||
|
||||
```block
|
||||
for(let i = 0;i<5;i++) {}
|
||||
```
|
||||
|
||||
[repeat](/microbit/reference/loops/repeat)
|
||||
|
||||

|
||||
|
||||
[while](/microbit/reference/loops/while)
|
||||
|
||||
```block
|
||||
while(true) {}
|
||||
```
|
||||
|
||||
[forever](/microbit/reference/basic/forever)
|
||||
|
||||
```block
|
||||
basic.forever(() => {})
|
||||
```
|
||||
|
||||
|
||||
|
||||
### ~
|
||||
|
||||
### ~column
|
||||
|
||||
### Logic
|
||||
|
||||
[if](/microbit/reference/logic/if)
|
||||
|
||||
```block
|
||||
if(false) {
|
||||
}
|
||||
```
|
||||
|
||||
[Boolean](/microbit/reference/types/boolean) values: *true*; *false*
|
||||
|
||||
```block
|
||||
true
|
||||
false
|
||||
```
|
||||
|
||||
Boolean binary operators: *and* (conjunction); *or* (disjunction)
|
||||
|
||||
```block
|
||||
true && false;
|
||||
true || false;
|
||||
```
|
||||
|
||||
Boolean negation operator
|
||||
|
||||
```block
|
||||
!true
|
||||
```
|
||||
|
||||
Comparison operators (=, !=, <, >, <=, >=)
|
||||
|
||||
```block
|
||||
0 == 0;
|
||||
1 !- 0;
|
||||
0 < 1;
|
||||
1 > 0;
|
||||
0 <= 1;
|
||||
1 >= 0;
|
||||
```
|
||||
|
||||
### Variables
|
||||
|
||||
[Assign](/microbit/reference/variables/assign) (set) a variable's value
|
||||
|
||||
```block
|
||||
```namespaces
|
||||
basic.showString("Hello!");
|
||||
input.onButtonPressed(Button.A, () => {});
|
||||
for (let i = 0;i<5;++i) {}
|
||||
if (true){}
|
||||
let x = 0;
|
||||
```
|
||||
|
||||
Get a variable's value
|
||||
|
||||
```block
|
||||
let x = 0;
|
||||
x;
|
||||
```
|
||||
|
||||
[Change](/microbit/reference/variables/change-var) a variable's value
|
||||
|
||||
```block
|
||||
let x = 0;
|
||||
x+=1;
|
||||
```
|
||||
|
||||
### Math
|
||||
|
||||
[Numeric](/microbit/reference/types/number) values: 0, 1, 2, ...
|
||||
|
||||
```block
|
||||
0;
|
||||
1;
|
||||
2;
|
||||
```
|
||||
|
||||
Arithmetic binary operation (+, -, *, /)
|
||||
|
||||
```block
|
||||
0+1;
|
||||
0-1;
|
||||
1*2;
|
||||
3/4;
|
||||
```
|
||||
|
||||
Absolute value
|
||||
|
||||
```block
|
||||
Math.abs(-5);
|
||||
```
|
||||
|
||||
Minimum/maximum of two values
|
||||
|
||||
```block
|
||||
Math.min(0, 1);
|
||||
Math.max(0, 1);
|
||||
```
|
||||
|
||||
Random value
|
||||
|
||||
```block
|
||||
Math.random(5);
|
||||
led.plot(0,0);
|
||||
radio.sendNumber(0);
|
||||
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Whole));
|
||||
game.createSprite(2,2);
|
||||
pins.digitalReadPin(DigitalPin.P0);
|
||||
serial.writeLine("Hello!");
|
||||
control.inBackground(() => {});
|
||||
```
|
||||
|
||||
### LED
|
||||
|
||||
[plot](/microbit/reference/led/plot)
|
||||
|
||||
```block
|
||||
led.plot(2,2)
|
||||
```
|
||||
|
||||
[unplot](/microbit/reference/led/unplot)
|
||||
|
||||
```block
|
||||
led.unplot(2,2)
|
||||
```
|
||||
|
||||
[point](/microbit/reference/point)
|
||||
|
||||
```block
|
||||
led.point(2,2)
|
||||
```
|
||||
|
||||
[brightness](/microbit/reference/brightness)
|
||||
|
||||
```block
|
||||
led.brightness()
|
||||
```
|
||||
|
||||
[set brightness](/microbit/reference/set-brightness)
|
||||
|
||||
```block
|
||||
led.setBrightness(255)
|
||||
```
|
||||
|
||||
[stop animation](/microbit/reference/stop-animation)
|
||||
|
||||
```block
|
||||
led.stopAnimation()
|
||||
```
|
||||
|
||||
[plot bar graph](/microbit/reference/led/plot-bar-graph)
|
||||
|
||||
```block
|
||||
led.plotBarGraph(0, 1023)
|
||||
```
|
||||
|
||||
### Game
|
||||
|
||||
[create sprite](/microbit/reference/game/create-sprite)
|
||||
|
||||

|
||||
|
||||
[move](/microbit/reference/game/move)
|
||||
|
||||

|
||||
|
||||
[turn](/microbit/reference/game/turn)
|
||||
|
||||

|
||||
|
||||
[change](/microbit/reference/game/change)
|
||||
|
||||

|
||||
|
||||
[set](/microbit/reference/game/set)
|
||||
|
||||

|
||||
|
||||
[reports](/microbit/reference/reports)
|
||||
|
||||

|
||||
|
||||
[touching](/microbit/reference/touching)
|
||||
|
||||

|
||||
|
||||
[touching edge](/microbit/reference/touching-edge)
|
||||
|
||||

|
||||
|
||||
[if on edge, bounce](/microbit/reference/logic/if-on-edge-bounce)
|
||||
|
||||

|
||||
|
||||
[change score by](/microbit/reference/change-score-by)
|
||||
|
||||

|
||||
|
||||
[score](/microbit/reference/score)
|
||||
|
||||

|
||||
|
||||
[start countdown](/microbit/reference/start-countdown)
|
||||
|
||||

|
||||
|
||||
[game over](/microbit/reference/game-over)
|
||||
|
||||

|
||||
|
||||
### Music
|
||||
|
||||
[play tone](/microbit/reference/play-tone)
|
||||
|
||||

|
||||
|
||||
[ring tone](/microbit/reference/ring-tone)
|
||||
|
||||

|
||||
|
||||
[rest](/microbit/reference/rest)
|
||||
|
||||

|
||||
|
||||
[tempo](/microbit/reference/tempo)
|
||||
|
||||

|
||||
|
||||
[set tempo](/microbit/reference/set-tempo)
|
||||
|
||||

|
||||
|
||||
[change tempo](/microbit/reference/music/set-tempo)
|
||||
|
||||

|
||||
|
||||
### Comments
|
||||
|
||||
[comment](/microbit/reference/comment)
|
||||
|
||||
### Images
|
||||
|
||||
[show image](/microbit/reference/show-image)
|
||||
|
||||

|
||||
|
||||
[scroll image](/microbit/reference/scroll-image)
|
||||
|
||||

|
||||
|
||||
[create image](/microbit/reference/create-image)
|
||||
|
||||

|
||||
|
||||
|
||||
### ~
|
||||
|
||||
### ~column
|
||||
|
||||
### Pins
|
||||
|
||||
[digital read pin](/microbit/reference/pins/digital-read-pin)
|
||||
|
||||

|
||||
|
||||
[digital write pin](/microbit/reference/pins/digital-write-pin)
|
||||
|
||||

|
||||
|
||||
[analog read pin](/microbit/reference/pins/analog-read-pin)
|
||||
|
||||

|
||||
|
||||
[analog write pin](/microbit/reference/pins/analog-write-pin)
|
||||
|
||||

|
||||
|
||||
[analog set period](/microbit/reference/pins/analog-set-period)
|
||||
|
||||

|
||||
|
||||
[servo write pin](/microbit/reference/pins/servo-write-pin)
|
||||
|
||||

|
||||
|
||||
[servo set pulse](/microbit/reference/pins/servo-set-pulse)
|
||||
|
||||

|
||||
|
||||
[map](/microbit/reference/map)
|
||||
|
||||

|
||||
|
||||
|
||||
## Devices
|
||||
|
||||
Functions in this category require to be connected to a remote device.
|
||||
|
||||
[tell camera to](/microbit/reference/devices/tell-camera-to)
|
||||
|
||||

|
||||
|
||||
[tell remote control to](/microbit/reference/devices/tell-remote-control-to)
|
||||
|
||||

|
||||
|
||||
[raise alert to](/microbit/reference/devices/raise-alert-to)
|
||||
|
||||

|
||||
|
||||
[on notified](/microbit/reference/on-notified)
|
||||
|
||||

|
||||
|
||||
[on gamepad button](/microbit/reference/on-gamepad-button)
|
||||
|
||||

|
||||
|
||||
[on notified](/microbit/reference/on-notified)
|
||||
|
||||

|
||||
|
||||
[signal strength](/microbit/reference/signal-strength)
|
||||
|
||||

|
||||
|
||||
[on signal strength changed](/microbit/reference/on-signal-strength-changed)
|
||||
|
||||

|
||||
|
||||
### ~
|
||||
|
||||
|
35
docs/reference/basic.md
Normal file
35
docs/reference/basic.md
Normal file
@ -0,0 +1,35 @@
|
||||
# Basic
|
||||
|
||||
Provides access to basic micro:bit functionality.
|
||||
|
||||
|
||||
```cards
|
||||
basic.showNumber(0);
|
||||
basic.showLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
. . # . .
|
||||
. . . . .
|
||||
. . . . .
|
||||
`);
|
||||
basic.showString("Hello!");
|
||||
basic.clearScreen();
|
||||
basic.forever(() => {
|
||||
|
||||
});
|
||||
basic.pause(100);
|
||||
basic.plotLeds(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
. . # . .
|
||||
. . . . .
|
||||
. . . . .
|
||||
`);
|
||||
basic.showAnimation(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
. . # . .
|
||||
. . . . .
|
||||
. . . . .
|
||||
`);
|
||||
```
|
11
docs/reference/control.md
Normal file
11
docs/reference/control.md
Normal file
@ -0,0 +1,11 @@
|
||||
# Control
|
||||
|
||||
|
||||
|
||||
|
||||
```cards
|
||||
control.inBackground(() => {
|
||||
|
||||
});
|
||||
control.reset();
|
||||
```
|
12
docs/reference/game.md
Normal file
12
docs/reference/game.md
Normal file
@ -0,0 +1,12 @@
|
||||
# Game
|
||||
|
||||
|
||||
|
||||
|
||||
```cards
|
||||
game.addScore(1);
|
||||
game.score();
|
||||
game.startCountdown(10000);
|
||||
game.gameOver();
|
||||
game.setScore(0);
|
||||
```
|
21
docs/reference/images.md
Normal file
21
docs/reference/images.md
Normal file
@ -0,0 +1,21 @@
|
||||
# Images
|
||||
|
||||
|
||||
|
||||
|
||||
```cards
|
||||
images.createImage(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
. . # . .
|
||||
. . . . .
|
||||
. . . . .
|
||||
`);
|
||||
images.createBigImage(`
|
||||
. . . . .
|
||||
. . . . .
|
||||
. . # . .
|
||||
. . . . .
|
||||
. . . . .
|
||||
`);
|
||||
```
|
42
docs/reference/input.md
Normal file
42
docs/reference/input.md
Normal file
@ -0,0 +1,42 @@
|
||||
# Input
|
||||
|
||||
|
||||
|
||||
|
||||
```cards
|
||||
input.onButtonPressed(Button.A, () => {
|
||||
|
||||
});
|
||||
input.onGesture(Gesture.Shake, () => {
|
||||
|
||||
});
|
||||
input.onPinPressed(TouchPin.P0, () => {
|
||||
|
||||
});
|
||||
input.buttonIsPressed(Button.A);
|
||||
input.compassHeading();
|
||||
input.temperature();
|
||||
input.acceleration(Dimension.X);
|
||||
input.lightLevel();
|
||||
input.rotation(Rotation.Pitch);
|
||||
input.magneticForce(Dimension.X);
|
||||
input.runningTime();
|
||||
input.setAccelerometerRange(AcceleratorRange.OneG);
|
||||
input.pinIsPressed(TouchPin.P0);
|
||||
input.calibrate();
|
||||
input.onLogoDown(() => {
|
||||
|
||||
});
|
||||
input.onLogoUp(() => {
|
||||
|
||||
});
|
||||
input.onScreenDown(() => {
|
||||
|
||||
});
|
||||
input.onScreenUp(() => {
|
||||
|
||||
});
|
||||
input.onShake(() => {
|
||||
|
||||
});
|
||||
```
|
@ -126,15 +126,3 @@ This is useful if you have something connected at the other end. As explained ab
|
||||
let msg = serial.readString()
|
||||
```
|
||||
|
||||
* reads an image
|
||||
|
||||
```
|
||||
img = serial.readImage()
|
||||
```
|
||||
|
||||
* reads the state of the screen from serial
|
||||
|
||||
```
|
||||
serial.readScreen()
|
||||
```
|
||||
|
||||
|
21
docs/reference/led.md
Normal file
21
docs/reference/led.md
Normal file
@ -0,0 +1,21 @@
|
||||
# Led
|
||||
|
||||
|
||||
|
||||
|
||||
```cards
|
||||
led.plot(0, 0);
|
||||
led.unplot(0, 0);
|
||||
led.point(0, 0);
|
||||
led.brightness();
|
||||
led.setBrightness(255);
|
||||
led.stopAnimation();
|
||||
led.plotBarGraph(0, 1023);
|
||||
led.fadeIn();
|
||||
led.fadeOut();
|
||||
led.plotAll();
|
||||
led.screenshot();
|
||||
led.toggle(0, 0);
|
||||
led.toggleAll();
|
||||
led.setDisplayMode(DisplayMode.BackAndWhite);
|
||||
```
|
39
docs/reference/logic.md
Normal file
39
docs/reference/logic.md
Normal file
@ -0,0 +1,39 @@
|
||||
# Logic
|
||||
|
||||
[if](/microbit/reference/logic/if)
|
||||
|
||||
```blocks
|
||||
if(true) {
|
||||
}
|
||||
```
|
||||
|
||||
[Boolean](/microbit/reference/types/boolean) values: *true*; *false*
|
||||
|
||||
```blocks
|
||||
true
|
||||
false
|
||||
```
|
||||
|
||||
Boolean binary operators: *and* (conjunction); *or* (disjunction)
|
||||
|
||||
```blocks
|
||||
true && false;
|
||||
true || false;
|
||||
```
|
||||
|
||||
Boolean negation operator
|
||||
|
||||
```blocks
|
||||
!true
|
||||
```
|
||||
|
||||
Comparison operators (=, !=, <, >, <=, >=)
|
||||
|
||||
```blocks
|
||||
0 == 0;
|
||||
1 !- 0;
|
||||
0 < 1;
|
||||
1 > 0;
|
||||
0 <= 1;
|
||||
1 >= 0;
|
||||
```
|
26
docs/reference/loops.md
Normal file
26
docs/reference/loops.md
Normal file
@ -0,0 +1,26 @@
|
||||
# Loops
|
||||
|
||||
Repeat code.
|
||||
|
||||
|
||||
[for](/reference/loops/for)
|
||||
|
||||
```blocks
|
||||
for(let i = 0;i<5;i++) {}
|
||||
```
|
||||
|
||||
[repeat](/reference/loops/repeat)
|
||||
|
||||

|
||||
|
||||
[while](/reference/loops/while)
|
||||
|
||||
```blocks
|
||||
while(true) {}
|
||||
```
|
||||
|
||||
[forever](/reference/basic/forever)
|
||||
|
||||
```blocks
|
||||
basic.forever(() => {})
|
||||
```
|
37
docs/reference/math.md
Normal file
37
docs/reference/math.md
Normal file
@ -0,0 +1,37 @@
|
||||
# Math
|
||||
|
||||
[Numeric](/reference/types/number) values: 0, 1, 2, ...
|
||||
|
||||
```blocks
|
||||
0;
|
||||
1;
|
||||
2;
|
||||
```
|
||||
|
||||
Arithmetic binary operation (+, -, *, /)
|
||||
|
||||
```blocks
|
||||
0+1;
|
||||
0-1;
|
||||
1*2;
|
||||
3/4;
|
||||
```
|
||||
|
||||
Absolute value
|
||||
|
||||
```blocks
|
||||
Math.abs(-5);
|
||||
```
|
||||
|
||||
Minimum/maximum of two values
|
||||
|
||||
```blocks
|
||||
Math.min(0, 1);
|
||||
Math.max(0, 1);
|
||||
```
|
||||
|
||||
Random value
|
||||
|
||||
```blocks
|
||||
Math.random(5);
|
||||
```
|
15
docs/reference/music.md
Normal file
15
docs/reference/music.md
Normal file
@ -0,0 +1,15 @@
|
||||
# Music
|
||||
|
||||
|
||||
|
||||
|
||||
```cards
|
||||
music.playTone(0, 0);
|
||||
music.ringTone(0);
|
||||
music.rest(0);
|
||||
music.noteFrequency(Note.C);
|
||||
music.beat();
|
||||
music.tempo();
|
||||
music.changeTempoBy(20);
|
||||
music.setTempo(120);
|
||||
```
|
17
docs/reference/pins.md
Normal file
17
docs/reference/pins.md
Normal file
@ -0,0 +1,17 @@
|
||||
# Pins
|
||||
|
||||
|
||||
|
||||
|
||||
```cards
|
||||
pins.digitalReadPin(DigitalPin.P0);
|
||||
pins.digitalWritePin(DigitalPin.P0, 0);
|
||||
pins.analogReadPin(AnalogPin.P0);
|
||||
pins.analogWritePin(AnalogPin.P0, 1023);
|
||||
pins.analogSetPeriod(AnalogPin.P0, 20000);
|
||||
pins.servoWritePin(AnalogPin.P0, 180);
|
||||
pins.servoSetPulse(AnalogPin.P0, 1500);
|
||||
pins.map(0, 0, 1023, 0, 4);
|
||||
pins.analogPitch(0, 0);
|
||||
pins.analogSetPitchPin(AnalogPin.P0);
|
||||
```
|
17
docs/reference/radio.md
Normal file
17
docs/reference/radio.md
Normal file
@ -0,0 +1,17 @@
|
||||
# Radio
|
||||
|
||||
|
||||
|
||||
|
||||
```cards
|
||||
radio.sendNumber(0);
|
||||
radio.sendNumbers(0, 0, 0, 0);
|
||||
radio.onDataReceived(() => {
|
||||
|
||||
});
|
||||
radio.receiveNumber();
|
||||
radio.receivedNumberAt(0);
|
||||
radio.receivedSignalStrength();
|
||||
radio.setGroup(0);
|
||||
radio.setTransmitPower(0);
|
||||
```
|
21
docs/reference/variables.md
Normal file
21
docs/reference/variables.md
Normal file
@ -0,0 +1,21 @@
|
||||
## Variables
|
||||
|
||||
[Assign](/reference/variables/assign) (set) a variable's value
|
||||
|
||||
```blocks
|
||||
let x = 0;
|
||||
```
|
||||
|
||||
Get a variable's value
|
||||
|
||||
```blocks
|
||||
let x = 0;
|
||||
x;
|
||||
```
|
||||
|
||||
[Change](/reference/variables/change-var) a variable's value
|
||||
|
||||
```blocks
|
||||
let x = 0;
|
||||
x+=1;
|
||||
```
|
94
docs/static/microbitheart.svg
vendored
Normal file
94
docs/static/microbitheart.svg
vendored
Normal file
File diff suppressed because one or more lines are too long
After Width: | Height: | Size: 26 KiB |
2
docs/static/microbitlogo.svg
vendored
Normal file
2
docs/static/microbitlogo.svg
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
|
||||
<svg xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' width='193.50101' height='32.755001' version='1.1'><g transform='translate(-1.3555,0.63251107)'><title>micro:bit logo</title><path d='m 38.7185,20.11349 c -1.677,0 -3.035,-1.364 -3.035,-3.042 0,-1.678 1.357,-3.038 3.035,-3.038 1.684,0 3.039,1.36 3.039,3.038 0,1.678 -1.355,3.042 -3.039,3.042 m -22.311,-6.077 c -1.677,0 -3.042,1.357 -3.042,3.035 0,1.678 1.363,3.042 3.042,3.042 1.674,0 3.036,-1.364 3.036,-3.042 0,-1.678 -1.363,-3.035 -3.036,-3.035 m -0.003,-5.99 22.576,0 c 4.979,0 9.027,4.047 9.027,9.027 0,4.979 -4.049,9.031 -9.027,9.031 l -22.576,0 c -4.977,0 -9.03,-4.053 -9.03,-9.031 -0.001,-4.98 4.053,-9.027 9.03,-9.027 m 22.576,24.076 c 8.299,0 15.047,-6.75 15.047,-15.049 0,-8.299 -6.748,-15.051 -15.047,-15.051 l -22.576,0 c -8.299,0 -15.049,6.752 -15.049,15.051 0,8.299 6.75,15.049 15.049,15.049 l 22.576,0 m 112.099,-21.953 c 0,-1.453 -1.195,-2.633 -2.662,-2.633 -1.455,0 -2.639,1.18 -2.639,2.633 0,1.471 1.184,2.672 2.639,2.672 1.466,0 2.662,-1.202 2.662,-2.672 z m -66.786,5.445 c 0,-4.764 -2.893,-8.093 -7.031,-8.093 -2.027,0 -3.814,0.851 -5.223,2.47 -1.467,-1.661 -3.152,-2.47 -5.127,-2.47 -4.162,0 -7.066,3.329 -7.066,8.093 l 0,10.466 3.812,0 0,-10.644 c 0,-2.416 1.336,-4.104 3.254,-4.104 1.617,0 3.25,1.409 3.25,4.104 l 0,10.645 3.848,0 0,-10.645 c 0,-2.416 1.338,-4.104 3.252,-4.104 1.863,0 3.217,1.727 3.217,4.104 l 0,10.645 3.814,0 0,-10.467 z m 6.953,-7.632 -3.846,0 0,18.099 3.846,0 0,-18.099 z m 0.569,-5.128 c 0,-1.377 -1.096,-2.454 -2.492,-2.454 -1.4,0 -2.453,1.054 -2.453,2.454 0,1.398 1.078,2.494 2.453,2.494 1.375,0 2.492,-1.117 2.492,-2.494 z m 18.328,20.914 0.576,-0.521 -2.828,-2.658 -0.488,0.455 c -1.252,1.149 -2.504,1.686 -3.945,1.686 -3.064,0 -5.557,-2.557 -5.557,-5.699 0,-3.121 2.492,-5.66 5.557,-5.66 1.432,0 2.646,0.521 3.949,1.693 l 0.512,0.46 2.748,-2.802 -0.49,-0.502 c -1.754,-1.793 -4.016,-2.696 -6.719,-2.696 -2.459,0 -4.869,1.022 -6.605,2.798 -1.738,1.734 -2.691,4.119 -2.691,6.709 0,2.596 0.953,4.979 2.684,6.705 1.771,1.811 4.117,2.811 6.615,2.811 2.401,-0.003 4.647,-0.937 6.682,-2.779 z m 7.25,-6.947 c 0,-3.322 1.145,-4.686 4.217,-5.029 l 0.641,-0.07 0,-3.797 -0.777,0.058 c -5.629,0.458 -8.143,3.247 -8.143,9.048 l 0,9.051 4.062,0 0,-9.261 0,0 z m 21.998,6.923 c 1.762,-1.756 2.729,-4.146 2.729,-6.715 0,-2.565 -0.967,-4.951 -2.723,-6.702 -1.77,-1.809 -4.105,-2.806 -6.576,-2.806 -2.492,0 -4.84,0.997 -6.613,2.806 -1.752,1.792 -2.721,4.174 -2.721,6.702 0,2.53 0.969,4.916 2.721,6.707 1.771,1.81 4.121,2.808 6.613,2.808 2.472,0 4.808,-0.998 6.57,-2.8 z m -1.229,-6.714 c 0,3.18 -2.361,5.665 -5.377,5.665 -2.945,0 -5.346,-2.541 -5.346,-5.665 0,-3.137 2.398,-5.695 5.346,-5.695 2.963,-0.002 5.377,2.558 5.377,5.695 z m 12.917,6.418 c 0,-1.468 -1.195,-2.667 -2.662,-2.667 -1.455,0 -2.639,1.199 -2.639,2.667 0,1.453 1.184,2.632 2.639,2.632 1.466,0 2.662,-1.179 2.662,-2.632 z m 19.507,0.296 c 1.76,-1.756 2.73,-4.146 2.73,-6.715 0,-2.528 -0.973,-4.911 -2.729,-6.702 -1.746,-1.787 -4.08,-2.77 -6.574,-2.77 -2.035,0 -3.84,0.572 -5.484,1.744 l 0,-9.934 -3.816,0 0.008,15.582 c -0.037,0.411 -0.037,0.821 -0.037,1.198 0,6.119 3.836,10.396 9.33,10.396 2.475,0.001 4.807,-0.997 6.572,-2.799 z m -1.013,-6.677 c 0,3.123 -2.494,5.66 -5.559,5.66 -3.115,0 -5.557,-2.484 -5.557,-5.66 0,-3.143 2.494,-5.698 5.557,-5.698 3.065,0 5.559,2.556 5.559,5.698 z m 10.881,-9.085 -3.846,0 0,18.099 3.846,0 0,-18.099 z m 0.572,-5.128 c 0,-1.377 -1.098,-2.454 -2.492,-2.454 -1.4,0 -2.457,1.054 -2.457,2.454 0,1.398 1.076,2.494 2.457,2.494 1.373,0 2.492,-1.117 2.492,-2.494 z m 13.83,19.759 -0.619,-0.089 c -2.855,-0.409 -4.133,-2.104 -4.133,-5.495 l 0,-5.126 4.752,0 0,-3.674 -4.752,0 0,-4.006 -3.887,0 0,4.006 -1.662,0 0,3.674 1.662,0 0,4.525 c 0,6.215 2.113,8.932 7.783,10.029 l 0.855,0.164 0,-4.008 0.001,0 z' style='fill:#000000' /></g></svg>
|
After Width: | Height: | Size: 3.8 KiB |
@ -1,7 +0,0 @@
|
||||
{
|
||||
"corepkg": "microbit",
|
||||
"bundleddirs": [
|
||||
"libs/microbit",
|
||||
"libs/microbit-radio"
|
||||
]
|
||||
}
|
File diff suppressed because one or more lines are too long
@ -6,6 +6,7 @@
|
||||
],
|
||||
"public": true,
|
||||
"dependencies": {
|
||||
"microbit": "file:../microbit"
|
||||
"microbit": "file:../microbit",
|
||||
"microbit-radio": "file:../microbit-radio"
|
||||
}
|
||||
}
|
30
libs/i2c-fram/README.md
Normal file
30
libs/i2c-fram/README.md
Normal file
@ -0,0 +1,30 @@
|
||||
# I2C FRAM driver
|
||||
|
||||
This library provides a driver for this FRAM part: https://www.adafruit.com/products/1895
|
||||
|
||||
The memory is accessed one byte at a time. The library provides a utility functions
|
||||
to write an entire buffer.
|
||||
|
||||
## Reading/writing byte
|
||||
|
||||
```
|
||||
let addr = 100
|
||||
i2c_fram.writeByte(addr, 42)
|
||||
let val = i2c_fram.readByte(addr)
|
||||
console.log(`${addr}: ${val}`)
|
||||
```
|
||||
|
||||
## Reading/writing a buffer
|
||||
|
||||
This code will log current time and acceleration in X axis every second.
|
||||
|
||||
```
|
||||
let bufSz = 8
|
||||
for (let addr = 0; addr < 0x8000; addr += bufSz) {
|
||||
let buf = pins.createBuffer(bufSz)
|
||||
buf.setNumber(NumberFormat.Int32LE, 0, input.runningTime())
|
||||
buf.setNumber(NumberFormat.Int32LE, 4, input.acceleration(Dimension.X))
|
||||
i2c_fram.writeBuffer(addr, buf)
|
||||
basic.pause(1000)
|
||||
}
|
||||
```
|
55
libs/i2c-fram/fram.ts
Normal file
55
libs/i2c-fram/fram.ts
Normal file
@ -0,0 +1,55 @@
|
||||
namespace i2c_fram {
|
||||
const devaddr = 0x50;
|
||||
const memend = 0x7fff;
|
||||
|
||||
//% shim=pxtrt::panic
|
||||
function panic(code: number) { }
|
||||
|
||||
function die() { panic(142) }
|
||||
|
||||
export function readByte(addr: number) {
|
||||
if (addr < 0 || addr > memend)
|
||||
die();
|
||||
|
||||
let buf = pins.createBuffer(2)
|
||||
buf[0] = (addr >> 8) & 0xff;
|
||||
buf[1] = addr & 0xff;
|
||||
|
||||
pins.i2cWriteBuffer(devaddr, buf);
|
||||
buf = pins.i2cReadBuffer(devaddr, 1);
|
||||
|
||||
return buf[0];
|
||||
}
|
||||
|
||||
export function writeByte(addr: number, val: number) {
|
||||
if (addr < 0 || addr > memend)
|
||||
die();
|
||||
|
||||
if (val < 0 || val > 0xff)
|
||||
die();
|
||||
|
||||
let buf = pins.createBuffer(3)
|
||||
|
||||
buf[0] = (addr >> 8) & 0xff;
|
||||
buf[1] = addr & 0xff;
|
||||
buf[2] = val;
|
||||
|
||||
pins.i2cWriteBuffer(devaddr, buf)
|
||||
}
|
||||
|
||||
export function readBuffer(addr: number, length: number) {
|
||||
if (addr < 0 || length < 0 || (addr + length) > memend)
|
||||
die();
|
||||
let buf = pins.createBuffer(length)
|
||||
for (let i = 0; i < length; ++i)
|
||||
buf[i] = readByte(addr + i)
|
||||
return buf
|
||||
}
|
||||
|
||||
export function writeBuffer(addr:number, buf: Buffer) {
|
||||
if (addr < 0 || (addr + buf.length) > memend)
|
||||
die();
|
||||
for (let i = 0; i < buf.length; ++i)
|
||||
writeByte(addr + i, buf[i])
|
||||
}
|
||||
}
|
16
libs/i2c-fram/ftest.ts
Normal file
16
libs/i2c-fram/ftest.ts
Normal file
@ -0,0 +1,16 @@
|
||||
i2c_fram.writeByte(100, 42)
|
||||
i2c_fram.writeByte(101, 108)
|
||||
|
||||
function toBuf(arr: number[]) {
|
||||
let buf = pins.createBuffer(arr.length)
|
||||
for (let i = 0; i < arr.length; ++i)
|
||||
buf[i] = arr[i]
|
||||
return buf
|
||||
}
|
||||
|
||||
i2c_fram.writeBuffer(98, toBuf([1, 2, 3, 4, 5, 6, 7]))
|
||||
|
||||
console.log("100:" + i2c_fram.readByte(100))
|
||||
console.log("101:" + i2c_fram.readByte(101))
|
||||
|
||||
|
16
libs/i2c-fram/pxt.json
Normal file
16
libs/i2c-fram/pxt.json
Normal file
@ -0,0 +1,16 @@
|
||||
{
|
||||
"name": "i2c-fram",
|
||||
"description": "AdaFruit I2C FRAM driver for micro:bit",
|
||||
"files": [
|
||||
"README.md",
|
||||
"fram.ts"
|
||||
],
|
||||
"testFiles": [
|
||||
"ftest.ts"
|
||||
],
|
||||
"public": true,
|
||||
"dependencies": {
|
||||
"microbit": "file:../microbit"
|
||||
},
|
||||
"installedVersion": "hhneqa"
|
||||
}
|
774
libs/lang-test0/lang-test0.ts
Normal file
774
libs/lang-test0/lang-test0.ts
Normal file
@ -0,0 +1,774 @@
|
||||
//
|
||||
// Note that this is supposed to run from command line.
|
||||
// Do not use anything besides basic.pause, control.inBackground, console.log
|
||||
//
|
||||
|
||||
//% shim=pxtrt::panic
|
||||
function panic(code2: number): void { }
|
||||
|
||||
function msg(s: string): void {
|
||||
//console.log(s)
|
||||
//basic.pause(50);
|
||||
}
|
||||
|
||||
function assert(cond: boolean, msg_: string) {
|
||||
if (!cond) {
|
||||
console.log("ASSERT: " + msg_);
|
||||
panic(45);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// start tests
|
||||
//
|
||||
|
||||
var glb1: number;
|
||||
var s2: string;
|
||||
var x: number;
|
||||
var action: Action;
|
||||
var tot: string;
|
||||
var lazyAcc: number;
|
||||
var sum: number;
|
||||
|
||||
var xyz = 12;
|
||||
|
||||
console.log("Starting...")
|
||||
|
||||
//lib.print_17(3);
|
||||
basic.showNumber(0);
|
||||
//assert(lib3.getX() == 17 * 3, "");
|
||||
|
||||
testNums();
|
||||
testStrings();
|
||||
testNumCollection();
|
||||
testStringCollection();
|
||||
testStringOps();
|
||||
testReccoll();
|
||||
inBg();
|
||||
testAction(1);
|
||||
testAction(7);
|
||||
testIter();
|
||||
testActionSave();
|
||||
testLazyOps();
|
||||
testRefLocals();
|
||||
testByRefParams();
|
||||
testFunDecl();
|
||||
testDefaultArgs();
|
||||
testMemoryFree();
|
||||
testMemoryFreeHOF();
|
||||
postPreFix()
|
||||
eqOp()
|
||||
testEnums()
|
||||
testBuffer()
|
||||
|
||||
// test some top-level code
|
||||
let xsum = 0;
|
||||
for (let i = 0; i < 11; ++i) {
|
||||
xsum = xsum + i;
|
||||
}
|
||||
assert(xsum == 55, "mainfor")
|
||||
|
||||
control.inBackground(() => {
|
||||
xsum = xsum + 10;
|
||||
})
|
||||
|
||||
basic.pause(20)
|
||||
assert(xsum == 65, "mainforBg")
|
||||
|
||||
assert(xyz == 12, "init")
|
||||
|
||||
function incrXyz() {
|
||||
xyz++;
|
||||
return 0;
|
||||
}
|
||||
var unusedInit = incrXyz();
|
||||
|
||||
assert(xyz == 13, "init2")
|
||||
|
||||
|
||||
testClass()
|
||||
|
||||
basic.showNumber(1)
|
||||
|
||||
|
||||
console.log("ALL TESTS OK")
|
||||
|
||||
|
||||
function defaultArgs(x: number, y = 3, z = 7) {
|
||||
return x + y + z;
|
||||
}
|
||||
|
||||
function testDefaultArgs() {
|
||||
msg("testDefaultArgs");
|
||||
assert(defaultArgs(1) == 11, "defl0")
|
||||
assert(defaultArgs(1, 4) == 12, "defl1")
|
||||
assert(defaultArgs(1, 4, 8) == 13, "defl2")
|
||||
|
||||
assert(optargs(1) == 1, "opt0");
|
||||
assert(optargs(1, 2) == 3, "opt1");
|
||||
assert(optargs(1, 2, 3) == 3, "opt2");
|
||||
|
||||
assert(optstring(3) == 6, "os0")
|
||||
assert(optstring(3, "7") == 10, "os1")
|
||||
assert(optstring2(3) == 6, "os0")
|
||||
assert(optstring2(3, "7") == 10, "os1")
|
||||
}
|
||||
|
||||
function optargs(x: number, y ?: number, z ?: number) {
|
||||
return x + y;
|
||||
}
|
||||
|
||||
function optstring(x: number, s ?: string) {
|
||||
if (s != null) {
|
||||
return parseInt(s) + x;
|
||||
}
|
||||
return x * 2;
|
||||
}
|
||||
|
||||
function optstring2(x: number, s: string = null) {
|
||||
if (s != null) {
|
||||
return parseInt(s) + x;
|
||||
}
|
||||
return x * 2;
|
||||
}
|
||||
|
||||
function testNums(): void {
|
||||
let x = 40 + 2;
|
||||
assert(x == 42, "add");
|
||||
x = 40 / 2;
|
||||
assert(x == 20, "div");
|
||||
let r = fib(15);
|
||||
msg("FIB" + r);
|
||||
assert(r == 987, "fib");
|
||||
let x3 = doStuff(x, 2);
|
||||
assert(x3 == 10, "call order");
|
||||
glb1 = 5;
|
||||
incrBy_2();
|
||||
assert(glb1 == 7, "glb1");
|
||||
incrBy_2();
|
||||
assert(glb1 == 9, "glb2");
|
||||
assert(Math.abs(-42) == 42, "abs");
|
||||
assert(Math.abs(42) == 42, "abs");
|
||||
assert(Math.sign(42) == 1, "abs");
|
||||
testIf();
|
||||
|
||||
assert((3 & 6) == 2, "&")
|
||||
assert((3 | 6) == 7, "|")
|
||||
assert((3 ^ 6) == 5, "^")
|
||||
assert((-10 >> 2) == -3, ">>")
|
||||
assert((-10 >>> 20) == 4095, ">>>")
|
||||
assert((-10 << 2) == -40, "<<")
|
||||
assert((10 << 2) == 40, "<<+")
|
||||
assert((10 >> 2) == 2, ">>+")
|
||||
assert((10 >>> 2) == 2, ">>>+")
|
||||
assert(1000000 * 1000000 == -727379968, "*")
|
||||
assert(100000001 * 100000001 == 2074919425, "*2")
|
||||
|
||||
assert(105 % 100 == 5, "perc")
|
||||
}
|
||||
|
||||
|
||||
|
||||
function fib(p: number): number {
|
||||
if (p <= 2) {
|
||||
return p;
|
||||
}
|
||||
let p2 = p - 1;
|
||||
return fib(p2) + fib(p - 2);
|
||||
}
|
||||
|
||||
function doStuff(x: number, x2: number): number {
|
||||
let x3 = x / x2;
|
||||
return x3;
|
||||
}
|
||||
|
||||
|
||||
function testIf(): void {
|
||||
let b = false;
|
||||
if (!b) {
|
||||
glb1 = 7;
|
||||
} else {
|
||||
assert(false, "b0");
|
||||
}
|
||||
assert(glb1 == 7, "glb3");
|
||||
if (b) {
|
||||
assert(false, "b1");
|
||||
} else {
|
||||
glb1 = 8;
|
||||
}
|
||||
assert(glb1 == 8, "glb3");
|
||||
}
|
||||
|
||||
|
||||
function incrBy_2(): void {
|
||||
glb1 = glb1 + 2;
|
||||
}
|
||||
|
||||
function testStrings(): void {
|
||||
assert((42).toString() == "42", "42");
|
||||
|
||||
let s = "live";
|
||||
assert(s == "live", "hello eq");
|
||||
s = s + "4OK";
|
||||
s2 = s;
|
||||
assert(s.charCodeAt(4) == 52, "hello eq2");
|
||||
assert(s.charAt(4) == "4", "hello eq2X");
|
||||
assert(s[4] == "4", "hello eq2X");
|
||||
assert(s.length == 7, "len7");
|
||||
s = "";
|
||||
for (let i = 0; i < 10; i++) {
|
||||
s = s + i;
|
||||
}
|
||||
assert(s == "0123456789", "for");
|
||||
let x = 10;
|
||||
s = "";
|
||||
while (x >= 0) {
|
||||
s = s + x;
|
||||
x = x - 1;
|
||||
}
|
||||
assert(s == "109876543210", "while");
|
||||
msg(s);
|
||||
msg(s2);
|
||||
|
||||
s2 = "";
|
||||
// don't leak ref
|
||||
|
||||
x = 21
|
||||
s = "foo"
|
||||
s = `a${ x * 2 }X${ s }X${ s }Z`
|
||||
assert(s == "a42XfooXfoo" + "Z", "`")
|
||||
|
||||
assert("X" + true == "Xt" + "rue", "boolStr")
|
||||
}
|
||||
|
||||
|
||||
function testNumCollection(): void {
|
||||
let collXYZ: number[] =[];
|
||||
assert(collXYZ.length == 0, "");
|
||||
collXYZ.push(42);
|
||||
assert(collXYZ.length == 1, "");
|
||||
collXYZ.push(22);
|
||||
assert(collXYZ[1] == 22, "");
|
||||
collXYZ.splice(0, 1);
|
||||
assert(collXYZ[0] == 22, "");
|
||||
collXYZ.removeElement(22);
|
||||
assert(collXYZ.length == 0, "");
|
||||
for (let i = 0; i < 100; i++) {
|
||||
collXYZ.push(i);
|
||||
}
|
||||
assert(collXYZ.length == 100, "");
|
||||
|
||||
collXYZ =[1, 2, 3];
|
||||
assert(collXYZ.length == 3, "cons");
|
||||
assert(collXYZ[0] == 1, "cons0");
|
||||
assert(collXYZ[1] == 2, "cons1");
|
||||
assert(collXYZ[2] == 3, "cons2");
|
||||
}
|
||||
|
||||
function testStringCollection(): void {
|
||||
let coll = (< string[] >[]);
|
||||
coll.push("foobar");
|
||||
coll.push((12).toString());
|
||||
coll.push(coll[0] + "xx");
|
||||
assert(coll.indexOf("12") == 1, "idx");
|
||||
coll =[
|
||||
"a" + "b",
|
||||
coll[2],
|
||||
]
|
||||
assert(coll[0] == "ab", "")
|
||||
assert(coll[1] == "foob" + "arxx", "")
|
||||
assert(coll.length == 2, "")
|
||||
}
|
||||
|
||||
function testStringOps(): void {
|
||||
assert("foo".concat("bar") == "foobar", "concat");
|
||||
assert("xAb".charCodeAt(1) == 65, "code at");
|
||||
assert("B".charCodeAt(0) == 66, "tcc");
|
||||
assert(parseInt("-123") == -123, "tonum");
|
||||
assert("fo"[1] == "o", "at");
|
||||
assert("fo".length == 2, "count");
|
||||
assert("fo".charCodeAt(17) == 0, "ct oor");
|
||||
}
|
||||
|
||||
class Testrec {
|
||||
str: string;
|
||||
num: number;
|
||||
bool: boolean;
|
||||
str2: string;
|
||||
}
|
||||
|
||||
function recordId(x: Testrec) {
|
||||
lazyAcc++
|
||||
return x
|
||||
}
|
||||
|
||||
function postPreFix() {
|
||||
msg("postPref")
|
||||
let x = new Testrec()
|
||||
lazyAcc = 0
|
||||
recordId(x).num = 12
|
||||
assert(x.num == 12 && lazyAcc == 1, "X0")
|
||||
let y = recordId(x).num++
|
||||
assert(x.num == 13 && lazyAcc == 2, "X1")
|
||||
assert(y == 12, "X2")
|
||||
y = ++recordId(x).num
|
||||
assert(y == 14 && x.num == 14 && lazyAcc == 3, "X2")
|
||||
|
||||
recordId(x).num >>= 1
|
||||
assert(x.num == 7, "X3")
|
||||
assert(lazyAcc == 4, "X4")
|
||||
}
|
||||
|
||||
function eqOp() {
|
||||
msg("eqOp")
|
||||
let x = 12
|
||||
assert((x += 10) == 22, "Y0")
|
||||
assert(x == 22, "Y1")
|
||||
x /= 2
|
||||
assert(x == 11, "Y2")
|
||||
|
||||
let s = ("fo" + 1)
|
||||
let t = ("ba" + 2)
|
||||
s += t
|
||||
assert(s == "fo1b" + "a2", "fb")
|
||||
}
|
||||
|
||||
function testRec0(): Testrec {
|
||||
let testrec = new Testrec();
|
||||
testrec.str2 = "Hello" + " world";
|
||||
testrec.str = testrec.str2;
|
||||
testrec.num = 42;
|
||||
assert(testrec.str == "Hello world", "recstr");
|
||||
assert(testrec.num == 42, "recnum");
|
||||
msg(testrec.str2);
|
||||
let testrec2 = < Testrec > null;
|
||||
assert(testrec2 == null, "isinv");
|
||||
assert(testrec == testrec, "eq");
|
||||
assert(testrec != null, "non inv");
|
||||
return testrec;
|
||||
}
|
||||
|
||||
function testReccoll(): void {
|
||||
let coll: Testrec[] =[];
|
||||
let item = testRec0();
|
||||
msg("in reccoll");
|
||||
coll.push(item);
|
||||
}
|
||||
|
||||
function inBg() {
|
||||
let k = 7
|
||||
let q = 14
|
||||
let rec = new Testrec();
|
||||
glb1 = 0
|
||||
control.inBackground(() => {
|
||||
glb1 = glb1 + 10 + (q - k)
|
||||
rec.str = "foo"
|
||||
})
|
||||
control.inBackground(() => {
|
||||
glb1 = glb1 + 1
|
||||
})
|
||||
basic.pause(50)
|
||||
assert(glb1 == 18, "inbg0")
|
||||
assert(rec.str == "foo", "inbg1")
|
||||
}
|
||||
|
||||
function runTwice(fn: Action): void {
|
||||
msg("r2 start");
|
||||
fn();
|
||||
fn();
|
||||
msg("r2 stop");
|
||||
}
|
||||
|
||||
function iter(max: number, fn: (v: number) => void) {
|
||||
for (var i = 0; i < max; ++i) {
|
||||
fn(i);
|
||||
}
|
||||
}
|
||||
|
||||
function testIter() {
|
||||
x = 0
|
||||
iter(10, v => {
|
||||
x = x + (v + 1)
|
||||
})
|
||||
assert(x == 55, "55")
|
||||
}
|
||||
|
||||
function testAction(p: number): void {
|
||||
let s = "hello" + "1";
|
||||
let coll =[] as number[];
|
||||
let p2 = p * 2;
|
||||
x = 42;
|
||||
runTwice(() => {
|
||||
x = x + p + p2;
|
||||
coll.push(x);
|
||||
msg(s + x);
|
||||
});
|
||||
assert(x == 42 + p * 6, "run2");
|
||||
assert(coll.length == 2, "run2");
|
||||
}
|
||||
|
||||
function add7() {
|
||||
sum = sum + 7;
|
||||
}
|
||||
|
||||
function testFunDecl() {
|
||||
msg("testFunDecl");
|
||||
let x = 12;
|
||||
sum = 0;
|
||||
function addX() {
|
||||
sum = sum + x;
|
||||
}
|
||||
function add10() {
|
||||
sum = sum + 10;
|
||||
}
|
||||
runTwice(addX)
|
||||
assert(sum == 24, "cap")
|
||||
msg("testAdd10");
|
||||
runTwice(add10);
|
||||
msg("end-testAdd10");
|
||||
assert(sum == 44, "nocap");
|
||||
runTwice(add7);
|
||||
assert(sum == 44 + 14, "glb")
|
||||
addX();
|
||||
add10();
|
||||
assert(sum == 44 + 14 + x + 10, "direct");
|
||||
}
|
||||
|
||||
function saveAction(fn: Action): void {
|
||||
action = fn;
|
||||
}
|
||||
|
||||
function saveGlobalAction(): void {
|
||||
let s = "foo" + "42";
|
||||
tot = "";
|
||||
saveAction(() => {
|
||||
tot = tot + s;
|
||||
});
|
||||
}
|
||||
|
||||
function testActionSave(): void {
|
||||
saveGlobalAction();
|
||||
runTwice(action);
|
||||
msg(tot);
|
||||
assert(tot == "foo42foo42", "");
|
||||
tot = "";
|
||||
action = null;
|
||||
}
|
||||
|
||||
function testLazyOps(): void {
|
||||
lazyAcc = 0;
|
||||
if (incrLazyAcc(10, false) && incrLazyAcc(1, true)) {
|
||||
assert(false, "");
|
||||
} else {
|
||||
assert(lazyAcc == 10, "lazy1");
|
||||
}
|
||||
assert(lazyAcc == 10, "lazy2");
|
||||
if (incrLazyAcc(100, true) && incrLazyAcc(1, false)) {
|
||||
assert(false, "");
|
||||
} else {
|
||||
assert(lazyAcc == 111, "lazy4");
|
||||
}
|
||||
lazyAcc = 0;
|
||||
if (incrLazyAcc(100, true) && incrLazyAcc(8, true)) {
|
||||
assert(lazyAcc == 108, "lazy5");
|
||||
} else {
|
||||
assert(false, "");
|
||||
}
|
||||
lazyAcc = 0;
|
||||
if (incrLazyAcc(10, true) || incrLazyAcc(1, true)) {
|
||||
assert(lazyAcc == 10, "lazy1b");
|
||||
} else {
|
||||
assert(false, "");
|
||||
}
|
||||
assert(lazyAcc == 10, "lazy2xx");
|
||||
if (incrLazyAcc(100, false) || incrLazyAcc(1, false)) {
|
||||
assert(false, "");
|
||||
} else {
|
||||
assert(lazyAcc == 111, "lazy4x");
|
||||
}
|
||||
lazyAcc = 0;
|
||||
if (incrLazyAcc(100, false) || incrLazyAcc(8, true)) {
|
||||
assert(lazyAcc == 108, "lazy5");
|
||||
} else {
|
||||
assert(false, "");
|
||||
}
|
||||
lazyAcc = 0;
|
||||
if (incrLazyAcc(10, true) && incrLazyAcc(1, true) && incrLazyAcc(100, false)) {
|
||||
assert(false, "");
|
||||
} else {
|
||||
assert(lazyAcc == 111, "lazy10");
|
||||
}
|
||||
lazyAcc = 0;
|
||||
if (incrLazyAcc(10, true) && incrLazyAcc(1, true) || incrLazyAcc(100, false)) {
|
||||
assert(lazyAcc == 11, "lazy101");
|
||||
} else {
|
||||
assert(false, "");
|
||||
}
|
||||
|
||||
lazyAcc = 0;
|
||||
assert((true ? incrLazyNum(1, 42): incrLazyNum(10, 36)) == 42, "?:")
|
||||
assert(lazyAcc == 1, "?:0");
|
||||
assert((false ? incrLazyNum(1, 42): incrLazyNum(10, 36)) == 36, "?:1")
|
||||
assert(lazyAcc == 11, "?:2");
|
||||
}
|
||||
|
||||
function incrLazyAcc(delta: number, res: boolean): boolean {
|
||||
lazyAcc = lazyAcc + delta;
|
||||
return res;
|
||||
}
|
||||
|
||||
function incrLazyNum(delta: number, res: number) {
|
||||
lazyAcc = lazyAcc + delta;
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
function testRefLocals(): void {
|
||||
msg("start test ref locals");
|
||||
let s = "";
|
||||
// For 4 or more it runs out of memory
|
||||
for (let i = 0; i < 3; i++) {
|
||||
msg(i + "");
|
||||
let copy = i;
|
||||
control.inBackground(() => {
|
||||
basic.pause(10 * i);
|
||||
copy = copy + 10;
|
||||
});
|
||||
control.inBackground(() => {
|
||||
basic.pause(20 * i);
|
||||
s = s + copy;
|
||||
});
|
||||
}
|
||||
basic.pause(200);
|
||||
assert(s == "101112", "reflocals");
|
||||
}
|
||||
|
||||
function byRefParam_0(p: number): void {
|
||||
control.inBackground(() => {
|
||||
basic.pause(1);
|
||||
sum = sum + p;
|
||||
});
|
||||
p = p + 1;
|
||||
}
|
||||
|
||||
function byRefParam_2(pxx: number): void {
|
||||
pxx = pxx + 1;
|
||||
control.inBackground(() => {
|
||||
basic.pause(1);
|
||||
sum = sum + pxx;
|
||||
});
|
||||
}
|
||||
|
||||
function testByRefParams(): void {
|
||||
msg("testByRefParams");
|
||||
refparamWrite("a" + "b");
|
||||
refparamWrite2(new Testrec());
|
||||
refparamWrite3(new Testrec());
|
||||
sum = 0;
|
||||
let x = 1;
|
||||
control.inBackground(() => {
|
||||
basic.pause(1);
|
||||
sum = sum + x;
|
||||
});
|
||||
x = 2;
|
||||
byRefParam_0(4);
|
||||
byRefParam_2(10);
|
||||
basic.pause(30);
|
||||
assert(sum == 18, "by ref");
|
||||
}
|
||||
|
||||
function refparamWrite(s: string): void {
|
||||
s = s + "c";
|
||||
assert(s == "abc", "abc");
|
||||
}
|
||||
|
||||
function refparamWrite2(testrec: Testrec): void {
|
||||
testrec = new Testrec();
|
||||
assert(testrec.bool == false, "");
|
||||
}
|
||||
|
||||
function refparamWrite3(testrecX: Testrec): void {
|
||||
control.inBackground(() => {
|
||||
basic.pause(1);
|
||||
assert(testrecX.str == "foo", "ff");
|
||||
testrecX.str = testrecX.str + "x";
|
||||
});
|
||||
testrecX = new Testrec();
|
||||
testrecX.str = "foo";
|
||||
basic.pause(30);
|
||||
assert(testrecX.str == "foox", "ff2");
|
||||
}
|
||||
|
||||
function testMemoryFree(): void {
|
||||
msg("testMemoryFree");
|
||||
for (let i = 0; i < 1000; i++) {
|
||||
allocImage();
|
||||
}
|
||||
}
|
||||
|
||||
function runOnce(fn: Action): void {
|
||||
fn();
|
||||
}
|
||||
|
||||
function createObj() {
|
||||
return new Testrec();
|
||||
}
|
||||
|
||||
function testMemoryFreeHOF(): void {
|
||||
msg("testMemoryFreeHOF");
|
||||
for (let i = 0; i < 1000; i++) {
|
||||
runOnce(() => {
|
||||
let tmp = createObj();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function allocImage(): void {
|
||||
let tmp = createObj();
|
||||
}
|
||||
|
||||
class Foo {
|
||||
pin: number;
|
||||
buf: number[];
|
||||
|
||||
constructor(k: number, l: number) {
|
||||
this.pin = k - l
|
||||
}
|
||||
|
||||
setPin(p: number) {
|
||||
this.pin = p
|
||||
}
|
||||
|
||||
getPin() {
|
||||
return this.pin
|
||||
}
|
||||
|
||||
init() {
|
||||
this.buf =[1, 2]
|
||||
}
|
||||
}
|
||||
|
||||
function testClass() {
|
||||
let f = new Foo(272, 100);
|
||||
assert(f.getPin() == 172, "ctor")
|
||||
f.setPin(42)
|
||||
assert(f.getPin() == 42, "getpin")
|
||||
}
|
||||
|
||||
enum En {
|
||||
A,
|
||||
B,
|
||||
C,
|
||||
D = 4200,
|
||||
E,
|
||||
}
|
||||
|
||||
enum En2 {
|
||||
D0 = En.D,
|
||||
D1,
|
||||
D2 = 1,
|
||||
}
|
||||
|
||||
|
||||
function testEnums() {
|
||||
msg("enums")
|
||||
|
||||
let k = En.C as number
|
||||
assert(k == 2, "e0")
|
||||
k = En.D as number
|
||||
assert(k == 4200, "e1")
|
||||
k = En.E as number
|
||||
assert(k == 4201, "e43")
|
||||
|
||||
k = En2.D0 as number
|
||||
assert(k == 4200, "eX0")
|
||||
k = En2.D1 as number
|
||||
assert(k == 4201, "eX1")
|
||||
|
||||
msg("enums0")
|
||||
assert(switchA(En.A) == 7, "s1")
|
||||
assert(switchA(En.B) == 7, "s2")
|
||||
assert(switchA(En.C) == 12, "s3")
|
||||
assert(switchA(En.D) == 13, "s4")
|
||||
assert(switchA(En.E) == 12, "s5")
|
||||
assert(switchA(-3 as En) == 12, "s6")
|
||||
|
||||
msg("enums1")
|
||||
assert(switchB(En.A) == 7, "x1")
|
||||
assert(switchB(En.B) == 7, "x2")
|
||||
assert(switchB(En.C) == 17, "x3")
|
||||
assert(switchB(En.D) == 13, "x4")
|
||||
assert(switchB(En.E) == 14, "x5")
|
||||
}
|
||||
|
||||
|
||||
function switchA(e: En) {
|
||||
let r = 12;
|
||||
switch (e) {
|
||||
case En.A:
|
||||
case En.B: return 7;
|
||||
case En.D: r = 13; break;
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
function switchB(e: En) {
|
||||
let r = 33;
|
||||
switch (e) {
|
||||
case En.A:
|
||||
case En.B: return 7;
|
||||
case En.D: r = 13; break;
|
||||
case En.E: r = 14; break;
|
||||
default: return 17;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
function bufferIs(b:Buffer, a:number[]) {
|
||||
assert(b.length == a.length, "bis-len")
|
||||
for (let i = 0; i < a.length; ++i) {
|
||||
if (a[i] != b[i]) {
|
||||
assert(false, `bufferIs: buf[${i}]:${b[i]} != ${a[i]}`)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function testBuffer() {
|
||||
let b = pins.createBuffer(3);
|
||||
assert(b[0] == 0, "buf0");
|
||||
assert(b[1] == 0, "buf0");
|
||||
assert(b[2] == 0, "buf0");
|
||||
assert(b[-100000] == 0, "bufM");
|
||||
assert(b[100000] == 0, "bufM");
|
||||
|
||||
b[0] = 42;
|
||||
bufferIs(b, [42, 0, 0]);
|
||||
b[2] = 41;
|
||||
bufferIs(b, [42, 0, 41]);
|
||||
|
||||
b.rotate(1)
|
||||
bufferIs(b, [0, 41, 42]);
|
||||
b.rotate(-2)
|
||||
bufferIs(b, [41, 42, 0]);
|
||||
b.shift(1)
|
||||
bufferIs(b, [42, 0, 0]);
|
||||
b.rotate(9)
|
||||
bufferIs(b, [42, 0, 0]);
|
||||
b.rotate(-9)
|
||||
bufferIs(b, [42, 0, 0]);
|
||||
|
||||
b.fill(4);
|
||||
bufferIs(b, [4, 4, 4]);
|
||||
|
||||
b.fill(12, 1, 1);
|
||||
bufferIs(b, [4, 12, 4]);
|
||||
|
||||
b.fill(13, 1, -1);
|
||||
bufferIs(b, [4, 13, 13]);
|
||||
|
||||
b.fill(100, -1, -1);
|
||||
bufferIs(b, [4, 13, 13]);
|
||||
|
||||
b.shift(-1)
|
||||
bufferIs(b, [0, 4, 13]);
|
||||
}
|
12
libs/lang-test0/pxt.json
Normal file
12
libs/lang-test0/pxt.json
Normal file
@ -0,0 +1,12 @@
|
||||
{
|
||||
"name": "lang-test0",
|
||||
"description": "Test for the TypeScript -> HEX compiler",
|
||||
"installedVersion": "file:.",
|
||||
"files": [
|
||||
"lang-test0.ts"
|
||||
],
|
||||
"public": true,
|
||||
"dependencies": {
|
||||
"microbit": "file:../microbit"
|
||||
}
|
||||
}
|
216
libs/microbit-devices/devices.cpp
Normal file
216
libs/microbit-devices/devices.cpp
Normal file
@ -0,0 +1,216 @@
|
||||
#include "pxt.h"
|
||||
#include "MESEvents.h"
|
||||
|
||||
using namespace pxt;
|
||||
|
||||
enum class MesCameraEvent {
|
||||
//% block="take photo"
|
||||
TakePhoto = MES_CAMERA_EVT_TAKE_PHOTO,
|
||||
//% block="start video capture"
|
||||
StartVideoCapture = MES_CAMERA_EVT_START_VIDEO_CAPTURE,
|
||||
//% block="stop video capture"
|
||||
StopVideoCapture = MES_CAMERA_EVT_STOP_VIDEO_CAPTURE,
|
||||
//% block="toggle front-rear"
|
||||
ToggleFrontRear = MES_CAMERA_EVT_TOGGLE_FRONT_REAR,
|
||||
//% block="launch photo mode"
|
||||
LaunchPhotoMode = MES_CAMERA_EVT_LAUNCH_PHOTO_MODE,
|
||||
//% block="launch video mode"
|
||||
LaunchVideoMode = MES_CAMERA_EVT_LAUNCH_VIDEO_MODE,
|
||||
//% block="stop photo mode"
|
||||
StopPhotoMode = MES_CAMERA_EVT_STOP_PHOTO_MODE,
|
||||
//% block="stop video mode"
|
||||
StopVideoMode = MES_CAMERA_EVT_STOP_VIDEO_MODE,
|
||||
};
|
||||
|
||||
enum class MesAlertEvent {
|
||||
//% block="display toast"
|
||||
DisplayToast = MES_ALERT_EVT_DISPLAY_TOAST,
|
||||
//% block="vibrate"
|
||||
Vibrate = MES_ALERT_EVT_VIBRATE,
|
||||
//% block="play sound"
|
||||
PlaySound = MES_ALERT_EVT_PLAY_SOUND,
|
||||
//% block="play ring tone"
|
||||
PlayRingtone = MES_ALERT_EVT_PLAY_RINGTONE,
|
||||
//% block="find my phone"
|
||||
FindMyPhone = MES_ALERT_EVT_FIND_MY_PHONE,
|
||||
//% block="ring alarm"
|
||||
RingAlarm = MES_ALERT_EVT_ALARM1,
|
||||
//% block="ring alarm 2"
|
||||
RingAlarm2 = MES_ALERT_EVT_ALARM2,
|
||||
//% block="ring alarm 3"
|
||||
RingAlarm3 = MES_ALERT_EVT_ALARM3,
|
||||
//% block="ring alarm 4"
|
||||
RingAlarm4 = MES_ALERT_EVT_ALARM4,
|
||||
//% block="ring alarm 5"
|
||||
RingAlarm5 = MES_ALERT_EVT_ALARM5,
|
||||
//% block="ring alarm 6"
|
||||
RingAlarm6 = MES_ALERT_EVT_ALARM6,
|
||||
};
|
||||
|
||||
enum class MesDeviceInfo {
|
||||
//% block="incoming call"
|
||||
IncomingCall = MES_DEVICE_INCOMING_CALL,
|
||||
//% block="incoming message"
|
||||
IncomingMessage = MES_DEVICE_INCOMING_MESSAGE,
|
||||
//% block="orientation landscape"
|
||||
OrientationLandscape = MES_DEVICE_ORIENTATION_LANDSCAPE,
|
||||
//% block="orientation portrait"
|
||||
OrientationPortrait = MES_DEVICE_ORIENTATION_PORTRAIT,
|
||||
//% block="shaken"
|
||||
Shaken = MES_DEVICE_GESTURE_DEVICE_SHAKEN,
|
||||
//% block="display off"
|
||||
DisplayOff = MES_DEVICE_DISPLAY_OFF,
|
||||
//% block="display on"
|
||||
DisplayOn = MES_DEVICE_DISPLAY_ON,
|
||||
};
|
||||
|
||||
enum class MesRemoteControlEvent {
|
||||
//% block="play"
|
||||
play = MES_REMOTE_CONTROL_EVT_PLAY,
|
||||
//% block="pause"
|
||||
pause = MES_REMOTE_CONTROL_EVT_PAUSE,
|
||||
//% block="stop"
|
||||
stop = MES_REMOTE_CONTROL_EVT_STOP,
|
||||
//% block="next track"
|
||||
nextTrack = MES_REMOTE_CONTROL_EVT_NEXTTRACK,
|
||||
//% block="previous track"
|
||||
previousTrack = MES_REMOTE_CONTROL_EVT_PREVTRACK,
|
||||
//% block="forward"
|
||||
forward = MES_REMOTE_CONTROL_EVT_FORWARD,
|
||||
//% block="rewind"
|
||||
rewind = MES_REMOTE_CONTROL_EVT_REWIND,
|
||||
//% block="volume up"
|
||||
volumeUp = MES_REMOTE_CONTROL_EVT_VOLUMEUP,
|
||||
//% block="volume down"
|
||||
volumeDown = MES_REMOTE_CONTROL_EVT_VOLUMEDOWN,
|
||||
};
|
||||
|
||||
enum class MesDpadButtonInfo {
|
||||
//% block="A down"
|
||||
ADown = MES_DPAD_BUTTON_A_DOWN,
|
||||
//% block="A up"
|
||||
AUp = MES_DPAD_BUTTON_A_UP,
|
||||
//% block="B down"
|
||||
BDown = MES_DPAD_BUTTON_B_DOWN,
|
||||
//% block="B up"
|
||||
BUp = MES_DPAD_BUTTON_B_UP,
|
||||
//% block="C down"
|
||||
CDown = MES_DPAD_BUTTON_C_DOWN,
|
||||
//% block="C up"
|
||||
CUp = MES_DPAD_BUTTON_C_UP,
|
||||
//% block="D down"
|
||||
DDown = MES_DPAD_BUTTON_D_DOWN,
|
||||
//% block="D up"
|
||||
DUp = MES_DPAD_BUTTON_D_UP,
|
||||
//% block="1 down"
|
||||
_1Down = MES_DPAD_BUTTON_1_UP,
|
||||
//% block="1 up"
|
||||
_1Up = MES_DPAD_BUTTON_1_DOWN,
|
||||
//% block="2 down"
|
||||
_2Down = MES_DPAD_BUTTON_2_DOWN,
|
||||
//% block="2 up"
|
||||
_2Up = MES_DPAD_BUTTON_2_UP,
|
||||
//% block="3 down"
|
||||
_3Down = MES_DPAD_BUTTON_3_DOWN,
|
||||
//% block="3 up"
|
||||
_3Up = MES_DPAD_BUTTON_3_UP,
|
||||
//% block="4 down"
|
||||
_4Down = MES_DPAD_BUTTON_4_DOWN,
|
||||
//% block="4 up"
|
||||
_4Up = MES_DPAD_BUTTON_4_UP,
|
||||
};
|
||||
|
||||
|
||||
//% color=156 weight=80
|
||||
namespace devices {
|
||||
static void genEvent(int id, int event) {
|
||||
MicroBitEvent e(id, event);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a ``camera`` command to the parent device.
|
||||
* @param event TODO
|
||||
*/
|
||||
//% weight=30 help=devices/tell-camera-to
|
||||
//% blockId=devices_camera icon="\uf030" block="tell camera to|%property" blockGap=8
|
||||
void tellCameraTo(MesCameraEvent event) {
|
||||
genEvent(MES_CAMERA_ID, (int)event);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a ``remote control`` command to the parent device.
|
||||
* @param event TODO
|
||||
*/
|
||||
//% weight=29 help=devices/tell-remote-control-to
|
||||
//% blockId=devices_remote_control block="tell remote control to|%property" blockGap=14 icon="\uf144"
|
||||
void tellRemoteControlTo(MesRemoteControlEvent event) {
|
||||
genEvent(MES_REMOTE_CONTROL_ID, (int)event);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends an ``alert`` command to the parent device.
|
||||
* @param event TODO
|
||||
*/
|
||||
//% weight=27 help=devices/raise-alert-to
|
||||
//% blockId=devices_alert block="raise alert to|%property" icon="\uf0f3"
|
||||
void raiseAlertTo(MesAlertEvent event) {
|
||||
genEvent(MES_ALERTS_ID, (int)event);
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers code to run when the device notifies about a particular event.
|
||||
* @param event TODO
|
||||
* @param body TODO
|
||||
*/
|
||||
//% help=devices/on-notified weight=26
|
||||
//% blockId=devices_device_info_event block="on notified" icon="\uf10a"
|
||||
void onNotified(MesDeviceInfo event, Action body) {
|
||||
registerWithDal(MES_DEVICE_INFO_ID, (int)event, body);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register code to run when the micro:bit receives a command from the paired gamepad.
|
||||
* @param name TODO
|
||||
* @param body TODO
|
||||
*/
|
||||
//% help=devices/on-gamepad-button weight=40
|
||||
//% weight=25
|
||||
//% blockId=devices_gamepad_event block="on gamepad button|%NAME" icon="\uf11b"
|
||||
void onGamepadButton(MesDpadButtonInfo name, Action body) {
|
||||
registerWithDal(MES_DPAD_CONTROLLER_ID, (int)name, body);
|
||||
}
|
||||
|
||||
static int _signalStrength = -1;
|
||||
static void signalStrengthHandler(MicroBitEvent ev) {
|
||||
// keep in sync with MESEvents.h
|
||||
_signalStrength = ev.value - 1;
|
||||
}
|
||||
static void initSignalStrength() {
|
||||
if (_signalStrength < 0) {
|
||||
_signalStrength = 0;
|
||||
uBit.MessageBus.listen(MES_SIGNAL_STRENGTH_ID, MICROBIT_EVT_ANY, signalStrengthHandler);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the last signal strength reported by the paired device.
|
||||
*/
|
||||
//% help=devices/signal-strength weight=24
|
||||
//% blockId=devices_signal_strength block="signal strength" blockGap=14 icon="\uf012" blockGap=14
|
||||
int signalStrength() {
|
||||
initSignalStrength();
|
||||
return _signalStrength;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers code to run when the device notifies about a change of signal strength.
|
||||
* @param body TODO
|
||||
*/
|
||||
//% weight=23 help=devices/on-signal-strength-changed
|
||||
//% blockId=devices_signal_strength_changed_event block="on signal strength changed" icon="\uf012"
|
||||
void onSignalStrengthChanged(Action body) {
|
||||
initSignalStrength();
|
||||
registerWithDal(MES_SIGNAL_STRENGTH_ID, MICROBIT_EVT_ANY, body);
|
||||
}
|
||||
}
|
||||
|
@ -1,181 +0,0 @@
|
||||
enum MesCameraEvent {
|
||||
//% enumval=MES_CAMERA_EVT_TAKE_PHOTO block="take photo"
|
||||
TakePhoto,
|
||||
//% enumval=MES_CAMERA_EVT_START_VIDEO_CAPTURE block="start video capture"
|
||||
StartVideoCapture,
|
||||
//% enumval=MES_CAMERA_EVT_STOP_VIDEO_CAPTURE block="stop video capture"
|
||||
StopVideoCapture,
|
||||
//% enumval=MES_CAMERA_EVT_TOGGLE_FRONT_REAR block="toggle front-rear"
|
||||
ToggleFrontRear,
|
||||
//% enumval=MES_CAMERA_EVT_LAUNCH_PHOTO_MODE block="launch photo mode"
|
||||
LaunchPhotoMode,
|
||||
//% enumval=MES_CAMERA_EVT_LAUNCH_VIDEO_MODE block="launch video mode"
|
||||
LaunchVideoMode,
|
||||
//% enumval=MES_CAMERA_EVT_STOP_PHOTO_MODE block="stop photo mode"
|
||||
StopPhotoMode,
|
||||
//% enumval=MES_CAMERA_EVT_STOP_VIDEO_MODE block="stop video mode"
|
||||
StopVideoMode,
|
||||
}
|
||||
|
||||
enum MesAlertEvent {
|
||||
//% enumval=MES_ALERT_EVT_DISPLAY_TOAST block="display toast"
|
||||
DisplayToast,
|
||||
//% enumval=MES_ALERT_EVT_VIBRATE block="vibrate"
|
||||
Vibrate,
|
||||
//% enumval=MES_ALERT_EVT_PLAY_SOUND block="play sound"
|
||||
PlaySound,
|
||||
//% enumval=MES_ALERT_EVT_PLAY_RINGTONE block="play ring tone"
|
||||
PlayRingtone,
|
||||
//% enumval=MES_ALERT_EVT_FIND_MY_PHONE block="find my phone"
|
||||
FindMyPhone,
|
||||
//% enumval=MES_ALERT_EVT_ALARM1 block="ring alarm"
|
||||
RingAlarm,
|
||||
//% enumval=MES_ALERT_EVT_ALARM2 block="ring alarm 2"
|
||||
RingAlarm2,
|
||||
//% enumval=MES_ALERT_EVT_ALARM3 block="ring alarm 3"
|
||||
RingAlarm3,
|
||||
//% enumval=MES_ALERT_EVT_ALARM4 block="ring alarm 4"
|
||||
RingAlarm4,
|
||||
//% enumval=MES_ALERT_EVT_ALARM5 block="ring alarm 5"
|
||||
RingAlarm5,
|
||||
//% enumval=MES_ALERT_EVT_ALARM6 block="ring alarm 6"
|
||||
RingAlarm6,
|
||||
}
|
||||
|
||||
enum MesDeviceInfo {
|
||||
//% enumval=MES_DEVICE_INCOMING_CALL block="incoming call"
|
||||
IncomingCall,
|
||||
//% enumval=MES_DEVICE_INCOMING_MESSAGE block="incoming message"
|
||||
IncomingMessage,
|
||||
//% enumval=MES_DEVICE_ORIENTATION_LANDSCAPE block="orientation landscape"
|
||||
OrientationLandscape,
|
||||
//% enumval=MES_DEVICE_ORIENTATION_PORTRAIT block="orientation portrait"
|
||||
OrientationPortrait,
|
||||
//% enumval=MES_DEVICE_GESTURE_DEVICE_SHAKEN block="shaken"
|
||||
Shaken,
|
||||
//% enumval=MES_DEVICE_DISPLAY_OFF block="display off"
|
||||
DisplayOff,
|
||||
//% enumval=MES_DEVICE_DISPLAY_ON block="display on"
|
||||
DisplayOn,
|
||||
}
|
||||
|
||||
enum MesRemoteControlEvent {
|
||||
//% enumval=MES_REMOTE_CONTROL_EVT_PLAY block="play"
|
||||
play,
|
||||
//% enumval=MES_REMOTE_CONTROL_EVT_PAUSE block="pause"
|
||||
pause,
|
||||
//% enumval=MES_REMOTE_CONTROL_EVT_STOP block="stop"
|
||||
stop,
|
||||
//% enumval=MES_REMOTE_CONTROL_EVT_NEXTTRACK block="next track"
|
||||
nextTrack,
|
||||
//% enumval=MES_REMOTE_CONTROL_EVT_PREVTRACK block="previous track"
|
||||
previousTrack,
|
||||
//% enumval=MES_REMOTE_CONTROL_EVT_FORWARD block="forward"
|
||||
forward,
|
||||
//% enumval=MES_REMOTE_CONTROL_EVT_REWIND block="rewind"
|
||||
rewind,
|
||||
//% enumval=MES_REMOTE_CONTROL_EVT_VOLUMEUP block="volume up"
|
||||
volumeUp,
|
||||
//% enumval=MES_REMOTE_CONTROL_EVT_VOLUMEDOWN block="volume down"
|
||||
volumeDown,
|
||||
}
|
||||
|
||||
enum MesDpadButtonInfo {
|
||||
//% enumval=MES_DPAD_BUTTON_A_DOWN block="A down"
|
||||
ADown,
|
||||
//% enumval=MES_DPAD_BUTTON_A_UP block="A up"
|
||||
AUp,
|
||||
//% enumval=MES_DPAD_BUTTON_B_DOWN block="B down"
|
||||
BDown,
|
||||
//% enumval=MES_DPAD_BUTTON_B_UP block="B up"
|
||||
BUp,
|
||||
//% enumval=MES_DPAD_BUTTON_C_DOWN block="C down"
|
||||
CDown,
|
||||
//% enumval=MES_DPAD_BUTTON_C_UP block="C up"
|
||||
CUp,
|
||||
//% enumval=MES_DPAD_BUTTON_D_DOWN block="D down"
|
||||
DDown,
|
||||
//% enumval=MES_DPAD_BUTTON_D_UP block="D up"
|
||||
DUp,
|
||||
//% enumval=MES_DPAD_BUTTON_1_UP block="1 down"
|
||||
_1Down,
|
||||
//% enumval=MES_DPAD_BUTTON_1_DOWN block="1 up"
|
||||
_1Up,
|
||||
//% enumval=MES_DPAD_BUTTON_2_DOWN block="2 down"
|
||||
_2Down,
|
||||
//% enumval=MES_DPAD_BUTTON_2_UP block="2 up"
|
||||
_2Up,
|
||||
//% enumval=MES_DPAD_BUTTON_3_DOWN block="3 down"
|
||||
_3Down,
|
||||
//% enumval=MES_DPAD_BUTTON_3_UP block="3 up"
|
||||
_3Up,
|
||||
//% enumval=MES_DPAD_BUTTON_4_DOWN block="4 down"
|
||||
_4Down,
|
||||
//% enumval=MES_DPAD_BUTTON_4_UP block="4 up"
|
||||
_4Up,
|
||||
}
|
||||
|
||||
//% color=156 weight=80
|
||||
namespace devices {
|
||||
/**
|
||||
* Sends a ``camera`` command to the parent device.
|
||||
* @param event TODO
|
||||
*/
|
||||
//% weight=30 help=devices/tell-camera-to shim=micro_bit::devices::camera
|
||||
//% blockId=devices_camera icon="\uf030" block="tell camera to|%property" blockGap=8
|
||||
export function tellCameraTo(event: MesCameraEvent): void { }
|
||||
|
||||
/**
|
||||
* Sends a ``remote control`` command to the parent device.
|
||||
* @param event TODO
|
||||
*/
|
||||
//% weight=29 help=devices/tell-remote-control-to shim=micro_bit::devices::remote_control
|
||||
//% blockId=devices_remote_control block="tell remote control to|%property" blockGap=14 icon="\uf144"
|
||||
export function tellRemoteControlTo(event: MesRemoteControlEvent): void { }
|
||||
|
||||
/**
|
||||
* Sends an ``alert`` command to the parent device.
|
||||
* @param event TODO
|
||||
*/
|
||||
//% weight=27 help=devices/raise-alert-to shim=micro_bit::devices::alert
|
||||
//% blockId=devices_alert block="raise alert to|%property" icon="\uf0f3"
|
||||
export function raiseAlertTo(event: MesAlertEvent): void { }
|
||||
|
||||
/**
|
||||
* Registers code to run when the device notifies about a particular event.
|
||||
* @param event TODO
|
||||
* @param body TODO
|
||||
*/
|
||||
//% shim=micro_bit::onDeviceInfo help=devices/on-notified
|
||||
//% weight=26
|
||||
//% blockId=devices_device_info_event block="on notified" icon="\uf10a"
|
||||
export function onNotified(event: MesDeviceInfo, body: Action): void { }
|
||||
|
||||
/**
|
||||
* Register code to run when the micro:bit receives a command from the paired gamepad.
|
||||
* @param name TODO
|
||||
* @param body TODO
|
||||
*/
|
||||
//% help=devices/on-gamepad-button weight=40 shim=micro_bit::onGamepadButton
|
||||
//% weight=25
|
||||
//% blockId=devices_gamepad_event block="on gamepad button|%NAME" icon="\uf11b"
|
||||
export function onGamepadButton(name: MesDpadButtonInfo, body: Action): void { }
|
||||
|
||||
/**
|
||||
* Returns the last signal strength reported by the paired device.
|
||||
*/
|
||||
//% help=devices/signal-strength weight=24 shim=micro_bit::signalStrength
|
||||
//% blockId=devices_signal_strength block="signal strength" blockGap=14 icon="\uf012" blockGap=14
|
||||
export function signalStrength(): number {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers code to run when the device notifies about a change of signal strength.
|
||||
* @param body TODO
|
||||
*/
|
||||
//% shim=micro_bit::onSignalStrengthChanged weight=23 help=devices/on-signal-strength-changed
|
||||
//% blockId=devices_signal_strength_changed_event block="on signal strength changed" icon="\uf012"
|
||||
export function onSignalStrengthChanged(body: Action): void { }
|
||||
}
|
||||
|
127
libs/microbit-devices/enums.d.ts
vendored
Normal file
127
libs/microbit-devices/enums.d.ts
vendored
Normal file
@ -0,0 +1,127 @@
|
||||
// Auto-generated. Do not edit.
|
||||
|
||||
|
||||
declare enum MesCameraEvent {
|
||||
//% block="take photo"
|
||||
TakePhoto = 3, // MES_CAMERA_EVT_TAKE_PHOTO
|
||||
//% block="start video capture"
|
||||
StartVideoCapture = 4, // MES_CAMERA_EVT_START_VIDEO_CAPTURE
|
||||
//% block="stop video capture"
|
||||
StopVideoCapture = 5, // MES_CAMERA_EVT_STOP_VIDEO_CAPTURE
|
||||
//% block="toggle front-rear"
|
||||
ToggleFrontRear = 8, // MES_CAMERA_EVT_TOGGLE_FRONT_REAR
|
||||
//% block="launch photo mode"
|
||||
LaunchPhotoMode = 1, // MES_CAMERA_EVT_LAUNCH_PHOTO_MODE
|
||||
//% block="launch video mode"
|
||||
LaunchVideoMode = 2, // MES_CAMERA_EVT_LAUNCH_VIDEO_MODE
|
||||
//% block="stop photo mode"
|
||||
StopPhotoMode = 6, // MES_CAMERA_EVT_STOP_PHOTO_MODE
|
||||
//% block="stop video mode"
|
||||
StopVideoMode = 7, // MES_CAMERA_EVT_STOP_VIDEO_MODE
|
||||
}
|
||||
|
||||
|
||||
declare enum MesAlertEvent {
|
||||
//% block="display toast"
|
||||
DisplayToast = 1, // MES_ALERT_EVT_DISPLAY_TOAST
|
||||
//% block="vibrate"
|
||||
Vibrate = 2, // MES_ALERT_EVT_VIBRATE
|
||||
//% block="play sound"
|
||||
PlaySound = 3, // MES_ALERT_EVT_PLAY_SOUND
|
||||
//% block="play ring tone"
|
||||
PlayRingtone = 4, // MES_ALERT_EVT_PLAY_RINGTONE
|
||||
//% block="find my phone"
|
||||
FindMyPhone = 5, // MES_ALERT_EVT_FIND_MY_PHONE
|
||||
//% block="ring alarm"
|
||||
RingAlarm = 6, // MES_ALERT_EVT_ALARM1
|
||||
//% block="ring alarm 2"
|
||||
RingAlarm2 = 7, // MES_ALERT_EVT_ALARM2
|
||||
//% block="ring alarm 3"
|
||||
RingAlarm3 = 8, // MES_ALERT_EVT_ALARM3
|
||||
//% block="ring alarm 4"
|
||||
RingAlarm4 = 9, // MES_ALERT_EVT_ALARM4
|
||||
//% block="ring alarm 5"
|
||||
RingAlarm5 = 10, // MES_ALERT_EVT_ALARM5
|
||||
//% block="ring alarm 6"
|
||||
RingAlarm6 = 11, // MES_ALERT_EVT_ALARM6
|
||||
}
|
||||
|
||||
|
||||
declare enum MesDeviceInfo {
|
||||
//% block="incoming call"
|
||||
IncomingCall = 7, // MES_DEVICE_INCOMING_CALL
|
||||
//% block="incoming message"
|
||||
IncomingMessage = 8, // MES_DEVICE_INCOMING_MESSAGE
|
||||
//% block="orientation landscape"
|
||||
OrientationLandscape = 1, // MES_DEVICE_ORIENTATION_LANDSCAPE
|
||||
//% block="orientation portrait"
|
||||
OrientationPortrait = 2, // MES_DEVICE_ORIENTATION_PORTRAIT
|
||||
//% block="shaken"
|
||||
Shaken = 4, // MES_DEVICE_GESTURE_DEVICE_SHAKEN
|
||||
//% block="display off"
|
||||
DisplayOff = 5, // MES_DEVICE_DISPLAY_OFF
|
||||
//% block="display on"
|
||||
DisplayOn = 6, // MES_DEVICE_DISPLAY_ON
|
||||
}
|
||||
|
||||
|
||||
declare enum MesRemoteControlEvent {
|
||||
//% block="play"
|
||||
play = 1, // MES_REMOTE_CONTROL_EVT_PLAY
|
||||
//% block="pause"
|
||||
pause = 2, // MES_REMOTE_CONTROL_EVT_PAUSE
|
||||
//% block="stop"
|
||||
stop = 3, // MES_REMOTE_CONTROL_EVT_STOP
|
||||
//% block="next track"
|
||||
nextTrack = 4, // MES_REMOTE_CONTROL_EVT_NEXTTRACK
|
||||
//% block="previous track"
|
||||
previousTrack = 5, // MES_REMOTE_CONTROL_EVT_PREVTRACK
|
||||
//% block="forward"
|
||||
forward = 6, // MES_REMOTE_CONTROL_EVT_FORWARD
|
||||
//% block="rewind"
|
||||
rewind = 7, // MES_REMOTE_CONTROL_EVT_REWIND
|
||||
//% block="volume up"
|
||||
volumeUp = 8, // MES_REMOTE_CONTROL_EVT_VOLUMEUP
|
||||
//% block="volume down"
|
||||
volumeDown = 9, // MES_REMOTE_CONTROL_EVT_VOLUMEDOWN
|
||||
}
|
||||
|
||||
|
||||
declare enum MesDpadButtonInfo {
|
||||
//% block="A down"
|
||||
ADown = 1, // MES_DPAD_BUTTON_A_DOWN
|
||||
//% block="A up"
|
||||
AUp = 2, // MES_DPAD_BUTTON_A_UP
|
||||
//% block="B down"
|
||||
BDown = 3, // MES_DPAD_BUTTON_B_DOWN
|
||||
//% block="B up"
|
||||
BUp = 4, // MES_DPAD_BUTTON_B_UP
|
||||
//% block="C down"
|
||||
CDown = 5, // MES_DPAD_BUTTON_C_DOWN
|
||||
//% block="C up"
|
||||
CUp = 6, // MES_DPAD_BUTTON_C_UP
|
||||
//% block="D down"
|
||||
DDown = 7, // MES_DPAD_BUTTON_D_DOWN
|
||||
//% block="D up"
|
||||
DUp = 8, // MES_DPAD_BUTTON_D_UP
|
||||
//% block="1 down"
|
||||
_1Down = 10, // MES_DPAD_BUTTON_1_UP
|
||||
//% block="1 up"
|
||||
_1Up = 9, // MES_DPAD_BUTTON_1_DOWN
|
||||
//% block="2 down"
|
||||
_2Down = 11, // MES_DPAD_BUTTON_2_DOWN
|
||||
//% block="2 up"
|
||||
_2Up = 12, // MES_DPAD_BUTTON_2_UP
|
||||
//% block="3 down"
|
||||
_3Down = 13, // MES_DPAD_BUTTON_3_DOWN
|
||||
//% block="3 up"
|
||||
_3Up = 14, // MES_DPAD_BUTTON_3_UP
|
||||
//% block="4 down"
|
||||
_4Down = 15, // MES_DPAD_BUTTON_4_DOWN
|
||||
//% block="4 up"
|
||||
_4Up = 16, // MES_DPAD_BUTTON_4_UP
|
||||
}
|
||||
declare namespace devices {
|
||||
}
|
||||
|
||||
// Auto-generated. Do not edit. Really.
|
@ -3,11 +3,18 @@
|
||||
"description": "The BLE specific services",
|
||||
"files": [
|
||||
"README.md",
|
||||
"devices.ts"
|
||||
"enums.d.ts",
|
||||
"shims.d.ts",
|
||||
"devices.cpp"
|
||||
],
|
||||
"public": true,
|
||||
"dependencies": {
|
||||
"microbit": "file:../microbit"
|
||||
},
|
||||
"microbit": {
|
||||
"config": {
|
||||
"MICROBIT_BLE_ENABLED": "1"
|
||||
}
|
||||
},
|
||||
"installedVersion": "zakvul"
|
||||
}
|
67
libs/microbit-devices/shims.d.ts
vendored
Normal file
67
libs/microbit-devices/shims.d.ts
vendored
Normal file
@ -0,0 +1,67 @@
|
||||
// Auto-generated. Do not edit.
|
||||
|
||||
|
||||
|
||||
//% color=156 weight=80
|
||||
declare namespace devices {
|
||||
|
||||
/**
|
||||
* Sends a ``camera`` command to the parent device.
|
||||
* @param event TODO
|
||||
*/
|
||||
//% weight=30 help=devices/tell-camera-to
|
||||
//% blockId=devices_camera icon="\uf030" block="tell camera to|%property" blockGap=8 shim=devices::tellCameraTo
|
||||
function tellCameraTo(event: MesCameraEvent): void;
|
||||
|
||||
/**
|
||||
* Sends a ``remote control`` command to the parent device.
|
||||
* @param event TODO
|
||||
*/
|
||||
//% weight=29 help=devices/tell-remote-control-to
|
||||
//% blockId=devices_remote_control block="tell remote control to|%property" blockGap=14 icon="\uf144" shim=devices::tellRemoteControlTo
|
||||
function tellRemoteControlTo(event: MesRemoteControlEvent): void;
|
||||
|
||||
/**
|
||||
* Sends an ``alert`` command to the parent device.
|
||||
* @param event TODO
|
||||
*/
|
||||
//% weight=27 help=devices/raise-alert-to
|
||||
//% blockId=devices_alert block="raise alert to|%property" icon="\uf0f3" shim=devices::raiseAlertTo
|
||||
function raiseAlertTo(event: MesAlertEvent): void;
|
||||
|
||||
/**
|
||||
* Registers code to run when the device notifies about a particular event.
|
||||
* @param event TODO
|
||||
* @param body TODO
|
||||
*/
|
||||
//% help=devices/on-notified weight=26
|
||||
//% blockId=devices_device_info_event block="on notified" icon="\uf10a" shim=devices::onNotified
|
||||
function onNotified(event: MesDeviceInfo, body: () => void): void;
|
||||
|
||||
/**
|
||||
* Register code to run when the micro:bit receives a command from the paired gamepad.
|
||||
* @param name TODO
|
||||
* @param body TODO
|
||||
*/
|
||||
//% help=devices/on-gamepad-button weight=40
|
||||
//% weight=25
|
||||
//% blockId=devices_gamepad_event block="on gamepad button|%NAME" icon="\uf11b" shim=devices::onGamepadButton
|
||||
function onGamepadButton(name: MesDpadButtonInfo, body: () => void): void;
|
||||
|
||||
/**
|
||||
* Returns the last signal strength reported by the paired device.
|
||||
*/
|
||||
//% help=devices/signal-strength weight=24
|
||||
//% blockId=devices_signal_strength block="signal strength" blockGap=14 icon="\uf012" blockGap=14 shim=devices::signalStrength
|
||||
function signalStrength(): number;
|
||||
|
||||
/**
|
||||
* Registers code to run when the device notifies about a change of signal strength.
|
||||
* @param body TODO
|
||||
*/
|
||||
//% weight=23 help=devices/on-signal-strength-changed
|
||||
//% blockId=devices_signal_strength_changed_event block="on signal strength changed" icon="\uf012" shim=devices::onSignalStrengthChanged
|
||||
function onSignalStrengthChanged(body: () => void): void;
|
||||
}
|
||||
|
||||
// Auto-generated. Do not edit. Really.
|
5
libs/microbit-radio/enums.d.ts
vendored
Normal file
5
libs/microbit-radio/enums.d.ts
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
// Auto-generated. Do not edit.
|
||||
declare namespace radio {
|
||||
}
|
||||
|
||||
// Auto-generated. Do not edit. Really.
|
@ -3,11 +3,19 @@
|
||||
"description": "The radio services",
|
||||
"files": [
|
||||
"README.md",
|
||||
"shims.d.ts",
|
||||
"enums.d.ts",
|
||||
"radio.cpp",
|
||||
"radio.ts"
|
||||
],
|
||||
"public": true,
|
||||
"dependencies": {
|
||||
"microbit": "file:../microbit"
|
||||
},
|
||||
"microbit": {
|
||||
"config": {
|
||||
"MICROBIT_BLE_ENABLED": "0"
|
||||
}
|
||||
},
|
||||
"installedVersion": "rlfgis"
|
||||
}
|
124
libs/microbit-radio/radio.cpp
Normal file
124
libs/microbit-radio/radio.cpp
Normal file
@ -0,0 +1,124 @@
|
||||
#include "pxt.h"
|
||||
|
||||
using namespace pxt;
|
||||
|
||||
//% color=270 weight=34
|
||||
namespace radio {
|
||||
|
||||
// -------------------------------------------------------------------------
|
||||
// Radio
|
||||
// -------------------------------------------------------------------------
|
||||
bool radioEnabled = false;
|
||||
PacketBuffer packet;
|
||||
|
||||
int radioEnable() {
|
||||
int r = uBit.radio.enable();
|
||||
if (r != MICROBIT_OK) return r;
|
||||
if (!radioEnabled) {
|
||||
uBit.radio.setGroup(pxt::programHash());
|
||||
radioEnabled = true;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
void broadcastMessage(int message) {
|
||||
if (radioEnable() != MICROBIT_OK) return;
|
||||
uBit.radio.event.eventReceived(MicroBitEvent(MES_BROADCAST_GENERAL_ID, message, CREATE_ONLY));
|
||||
}
|
||||
|
||||
void onBroadcastMessageReceived(int message, Action f) {
|
||||
if (radioEnable() != MICROBIT_OK) return;
|
||||
registerWithDal(MES_BROADCAST_GENERAL_ID, message, f);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Broadcasts 4 numbers over radio to any connected micro:bit in the group.
|
||||
*/
|
||||
//% help=radio/send-numbers
|
||||
//% weight=59
|
||||
//% blockId=radio_datagram_send_numbers block="send numbers|0: %VALUE0|1: %VALUE1|2: %VALUE2|3: %VALUE3"
|
||||
void sendNumbers(int value_0, int value_1, int value_2, int value_3) {
|
||||
if (radioEnable() != MICROBIT_OK) return;
|
||||
int buf[] = { value_0, value_1, value_2, value_3 };
|
||||
uBit.radio.datagram.send((uint8_t*)buf, 4*sizeof(int));
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers code to run when a packet is received over radio.
|
||||
*/
|
||||
//% help=radio/on-data-received
|
||||
//% weight=50
|
||||
//% blockId=radio_datagram_received_event block="on data received" blockGap=8
|
||||
void onDataReceived(Action body) {
|
||||
if (radioEnable() != MICROBIT_OK) return;
|
||||
registerWithDal(MICROBIT_ID_RADIO, MICROBIT_RADIO_EVT_DATAGRAM, body);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a number at a given index, between ``0`` and ``3``, from the packet received by ``receive number``. Not supported in simulator.
|
||||
* @param index index of the number to read from 0 to 3. 1 eg
|
||||
*/
|
||||
//% help=radio/received-number-at
|
||||
//% weight=45
|
||||
//% blockId=radio_datagram_received_number_at block="receive number|at %VALUE" blockGap=8
|
||||
int receivedNumberAt(int index) {
|
||||
if (radioEnable() != MICROBIT_OK) return 0;
|
||||
if (0 <= index && index < packet.length() / 4) {
|
||||
// packet.getBytes() is not aligned
|
||||
int r;
|
||||
memcpy(&r, packet.getBytes() + index * 4, 4);
|
||||
return r;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads the next packet as a number from the radio queue.
|
||||
*/
|
||||
//% help=radio/receive-number
|
||||
//% weight=46
|
||||
//% blockId=radio_datagram_receive block="receive number" blockGap=8
|
||||
int receiveNumber()
|
||||
{
|
||||
if (radioEnable() != MICROBIT_OK) return 0;
|
||||
packet = uBit.radio.datagram.recv();
|
||||
return receivedNumberAt(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the received signal strength indicator (RSSI) from the packet received by ``receive number``. Not supported in simulator.
|
||||
* namespace=radio
|
||||
*/
|
||||
//% help=radio/received-signal-strength
|
||||
//% weight=40
|
||||
//% blockId=radio_datagram_rssi block="received signal strength"
|
||||
int receivedSignalStrength() {
|
||||
if (radioEnable() != MICROBIT_OK) return 0;
|
||||
return packet.getRSSI();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the group id for radio communications. A micro:bit can only listen to one group ID at any time.
|
||||
* @ param id the group id between ``0`` and ``255``, 1 eg
|
||||
*/
|
||||
//% help=radio/set-group
|
||||
//% weight=10
|
||||
//% blockId=radio_set_group block="set group %ID"
|
||||
void setGroup(int id) {
|
||||
if (radioEnable() != MICROBIT_OK) return;
|
||||
uBit.radio.setGroup(id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Change the output power level of the transmitter to the given value.
|
||||
* @param power a value in the range 0..7, where 0 is the lowest power and 7 is the highest, 7 eg
|
||||
*/
|
||||
//% help=radio/set-transmit-power
|
||||
//% weight=9
|
||||
//% blockId=radio_set_transmit_power block="set transmit power %power"
|
||||
void setTransmitPower(int power) {
|
||||
if (radioEnable() != MICROBIT_OK) return;
|
||||
uBit.radio.setTransmitPower(power);
|
||||
}
|
||||
}
|
@ -1,3 +1,6 @@
|
||||
/**
|
||||
* Communicate data using radio packets
|
||||
*/
|
||||
//% color=270 weight=34
|
||||
namespace radio {
|
||||
/**
|
||||
@ -9,89 +12,4 @@ namespace radio {
|
||||
export function sendNumber(value: number) : void {
|
||||
sendNumbers(value, 0, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Broadcasts 4 numbers over radio to any connected micro:bit in the group.
|
||||
*/
|
||||
//% help=radio/send-numbers
|
||||
//% shim=micro_bit::datagramSendNumbers
|
||||
//% weight=59
|
||||
//% blockId=radio_datagram_send_numbers block="send numbers|0: %VALUE0|1: %VALUE1|2: %VALUE2|3: %VALUE3"
|
||||
export function sendNumbers(value_0: number, value_1: number, value_2: number, value_3: number) : void {
|
||||
// noBleWarning();
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers code to run when a packet is received over radio.
|
||||
*/
|
||||
//% help=radio/on-data-received
|
||||
//% shim=micro_bit::onDatagramReceived
|
||||
//% weight=50
|
||||
//% blockId=radio_datagram_received_event block="on data received" blockGap=8
|
||||
export function onDataReceived(body:Action) : void {
|
||||
// noBleWarning();
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads the next packet as a number from the radio queue.
|
||||
*/
|
||||
//% help=radio/receive-number
|
||||
//% shim=micro_bit::datagramReceiveNumber
|
||||
//% weight=46
|
||||
//% blockId=radio_datagram_receive block="receive number" blockGap=8
|
||||
export function receiveNumber() : number
|
||||
{
|
||||
//noBleWarning();
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a number at a given index, between ``0`` and ``3``, from the packet received by ``receive number``. Not supported in simulator.
|
||||
* @param index index of the number to read from 0 to 3. eg: 1
|
||||
*/
|
||||
//% help=radio/received-number-at
|
||||
//% shim=micro_bit::datagramGetNumber
|
||||
//% weight=45
|
||||
//% blockId=radio_datagram_received_number_at block="receive number|at %VALUE" blockGap=8
|
||||
export function receivedNumberAt(index: number) : number {
|
||||
/* if (index < 0 || index >= 4) {
|
||||
TD.simulator.warning("index should be between ``0`` and ``3``.");
|
||||
}*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the received signal strength indicator (RSSI) from the packet received by ``receive number``. Not supported in simulator.
|
||||
* namespace=radio
|
||||
*/
|
||||
//% help=radio/received-signal-strength
|
||||
//% shim=micro_bit::datagramGetRSSI
|
||||
//% weight=40
|
||||
//% blockId=radio_datagram_rssi block="received signal strength"
|
||||
export function receivedSignalStrength() : number {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the group id for radio communications. A micro:bit can only listen to one group ID at any time.
|
||||
* @ param id the group id between ``0`` and ``255``, eg: 1
|
||||
*/
|
||||
//% help=radio/set-group
|
||||
//% shim=micro_bit::setGroup
|
||||
//% weight=10
|
||||
//% blockId=radio_set_group block="set group %ID"
|
||||
export function setGroup(id: number) : void {
|
||||
}
|
||||
|
||||
/**
|
||||
* Change the output power level of the transmitter to the given value.
|
||||
* @param power a value in the range 0..7, where 0 is the lowest power and 7 is the highest, eg: 7
|
||||
*/
|
||||
//% help=radio/set-transmit-power
|
||||
//% shim=micro_bit::setTransmitPower
|
||||
//% weight=9
|
||||
//% blockId=radio_set_transmit_power block="set transmit power %power"
|
||||
export function setTransmitPower(power:number) {
|
||||
|
||||
}
|
||||
}
|
||||
|
69
libs/microbit-radio/shims.d.ts
vendored
Normal file
69
libs/microbit-radio/shims.d.ts
vendored
Normal file
@ -0,0 +1,69 @@
|
||||
// Auto-generated. Do not edit.
|
||||
|
||||
|
||||
|
||||
//% color=270 weight=34
|
||||
declare namespace radio {
|
||||
|
||||
/**
|
||||
* Broadcasts 4 numbers over radio to any connected micro:bit in the group.
|
||||
*/
|
||||
//% help=radio/send-numbers
|
||||
//% weight=59
|
||||
//% blockId=radio_datagram_send_numbers block="send numbers|0: %VALUE0|1: %VALUE1|2: %VALUE2|3: %VALUE3" shim=radio::sendNumbers
|
||||
function sendNumbers(value_0: number, value_1: number, value_2: number, value_3: number): void;
|
||||
|
||||
/**
|
||||
* Registers code to run when a packet is received over radio.
|
||||
*/
|
||||
//% help=radio/on-data-received
|
||||
//% weight=50
|
||||
//% blockId=radio_datagram_received_event block="on data received" blockGap=8 shim=radio::onDataReceived
|
||||
function onDataReceived(body: () => void): void;
|
||||
|
||||
/**
|
||||
* Reads a number at a given index, between ``0`` and ``3``, from the packet received by ``receive number``. Not supported in simulator.
|
||||
* @param index index of the number to read from 0 to 3. 1 eg
|
||||
*/
|
||||
//% help=radio/received-number-at
|
||||
//% weight=45
|
||||
//% blockId=radio_datagram_received_number_at block="receive number|at %VALUE" blockGap=8 shim=radio::receivedNumberAt
|
||||
function receivedNumberAt(index: number): number;
|
||||
|
||||
/**
|
||||
* Reads the next packet as a number from the radio queue.
|
||||
*/
|
||||
//% help=radio/receive-number
|
||||
//% weight=46
|
||||
//% blockId=radio_datagram_receive block="receive number" blockGap=8 shim=radio::receiveNumber
|
||||
function receiveNumber(): number;
|
||||
|
||||
/**
|
||||
* Gets the received signal strength indicator (RSSI) from the packet received by ``receive number``. Not supported in simulator.
|
||||
* namespace=radio
|
||||
*/
|
||||
//% help=radio/received-signal-strength
|
||||
//% weight=40
|
||||
//% blockId=radio_datagram_rssi block="received signal strength" shim=radio::receivedSignalStrength
|
||||
function receivedSignalStrength(): number;
|
||||
|
||||
/**
|
||||
* Sets the group id for radio communications. A micro:bit can only listen to one group ID at any time.
|
||||
* @ param id the group id between ``0`` and ``255``, 1 eg
|
||||
*/
|
||||
//% help=radio/set-group
|
||||
//% weight=10
|
||||
//% blockId=radio_set_group block="set group %ID" shim=radio::setGroup
|
||||
function setGroup(id: number): void;
|
||||
|
||||
/**
|
||||
* Change the output power level of the transmitter to the given value.
|
||||
* @param power a value in the range 0..7, where 0 is the lowest power and 7 is the highest, 7 eg
|
||||
*/
|
||||
//% help=radio/set-transmit-power
|
||||
//% weight=9
|
||||
//% blockId=radio_set_transmit_power block="set transmit power %power" shim=radio::setTransmitPower
|
||||
function setTransmitPower(power: number): void;
|
||||
}
|
||||
|
||||
// Auto-generated. Do not edit. Really.
|
@ -1,4 +1,4 @@
|
||||
#include "BitVM.h"
|
||||
#include "ksbit.h"
|
||||
|
||||
|
||||
/**
|
||||
@ -38,7 +38,7 @@ namespace basic {
|
||||
//% blockId=device_show_leds
|
||||
//% block="show leds" icon="\uf00a"
|
||||
void showLeds(ImageLiteral leds, int interval = 400) {
|
||||
uBit.display.print(MicroBitImage(getbytes(leds)), 0, 0, 0, interval);
|
||||
uBit.display.print(MicroBitImage(imageBytes(leds)), 0, 0, 0, interval);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -80,24 +80,24 @@ namespace basic {
|
||||
* @param leds TODO
|
||||
* @param interval TODO
|
||||
*/
|
||||
//% help=basic/show-animation shim=micro_bit::showAnimation imageLiteral=1 async
|
||||
//% help=basic/show-animation imageLiteral=1 async
|
||||
void showAnimation(ImageLiteral leds, int interval = 400) {
|
||||
uBit.display.animate(MicroBitImage(getbytes(leds)), interval, 5, 0);
|
||||
uBit.display.animate(MicroBitImage(imageBytes(leds)), interval, 5, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws an image on the LED screen.
|
||||
* @param leds TODO
|
||||
*/
|
||||
//% help=basic/plot-leds weight=80 shim=micro_bit::plotLeds
|
||||
//% help=basic/plot-leds weight=80
|
||||
void plotLeds(ImageLiteral leds) {
|
||||
MicroBitImage i(getbytes(leds));
|
||||
MicroBitImage i(imageBytes(leds));
|
||||
uBit.display.print(i, 0, 0, 0, 0);
|
||||
}
|
||||
|
||||
void forever_stub(void *a) {
|
||||
while (true) {
|
||||
action::run((Action)a);
|
||||
runAction0((Action)a);
|
||||
uBit.sleep(20);
|
||||
}
|
||||
}
|
||||
|
155
libs/microbit/buffer.cpp
Normal file
155
libs/microbit/buffer.cpp
Normal file
@ -0,0 +1,155 @@
|
||||
#include "ksbit.h"
|
||||
|
||||
enum class NumberFormat {
|
||||
Int8LE = 1,
|
||||
UInt8LE,
|
||||
Int16LE,
|
||||
UInt16LE,
|
||||
Int32LE,
|
||||
Int8BE,
|
||||
UInt8BE,
|
||||
Int16BE,
|
||||
UInt16BE,
|
||||
Int32BE,
|
||||
// UInt32,
|
||||
};
|
||||
|
||||
//% indexerGet=BufferMethods::getByte indexerSet=BufferMethods::setByte
|
||||
namespace BufferMethods {
|
||||
//%
|
||||
int getByte(Buffer buf, int off) {
|
||||
return max(ManagedBuffer(buf).getByte(off), 0);
|
||||
}
|
||||
|
||||
//%
|
||||
void setByte(Buffer buf, int off, int v) {
|
||||
ManagedBuffer(buf).setByte(off, v);
|
||||
}
|
||||
|
||||
//%
|
||||
uint8_t *getBytes(Buffer buf) {
|
||||
return buf->payload;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write a number in specified format in the buffer.
|
||||
*/
|
||||
//%
|
||||
void setNumber(Buffer buf, NumberFormat format, int offset, int value)
|
||||
{
|
||||
int8_t i8;
|
||||
uint8_t u8;
|
||||
int16_t i16;
|
||||
uint16_t u16;
|
||||
int32_t i32;
|
||||
|
||||
ManagedBuffer b(buf);
|
||||
|
||||
// Assume little endian
|
||||
#define WRITEBYTES(isz, swap) isz = value; b.writeBytes(offset, (uint8_t*)&isz, sizeof(isz), swap); break
|
||||
|
||||
switch (format) {
|
||||
case NumberFormat::Int8LE: WRITEBYTES(i8, false);
|
||||
case NumberFormat::UInt8LE: WRITEBYTES(u8, false);
|
||||
case NumberFormat::Int16LE: WRITEBYTES(i16, false);
|
||||
case NumberFormat::UInt16LE: WRITEBYTES(u16, false);
|
||||
case NumberFormat::Int32LE: WRITEBYTES(i32, false);
|
||||
case NumberFormat::Int8BE: WRITEBYTES(i8, true);
|
||||
case NumberFormat::UInt8BE: WRITEBYTES(u8, true);
|
||||
case NumberFormat::Int16BE: WRITEBYTES(i16, true);
|
||||
case NumberFormat::UInt16BE: WRITEBYTES(u16, true);
|
||||
case NumberFormat::Int32BE: WRITEBYTES(i32, true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read a number in specified format from the buffer.
|
||||
*/
|
||||
//%
|
||||
int getNumber(Buffer buf, NumberFormat format, int offset)
|
||||
{
|
||||
int8_t i8;
|
||||
uint8_t u8;
|
||||
int16_t i16;
|
||||
uint16_t u16;
|
||||
int32_t i32;
|
||||
|
||||
ManagedBuffer b(buf);
|
||||
|
||||
// Assume little endian
|
||||
#define READBYTES(isz, swap) b.readBytes((uint8_t*)&isz, offset, sizeof(isz), swap); return isz
|
||||
|
||||
switch (format) {
|
||||
case NumberFormat::Int8LE: READBYTES(i8, false);
|
||||
case NumberFormat::UInt8LE: READBYTES(u8, false);
|
||||
case NumberFormat::Int16LE: READBYTES(i16, false);
|
||||
case NumberFormat::UInt16LE: READBYTES(u16, false);
|
||||
case NumberFormat::Int32LE: READBYTES(i32, false);
|
||||
case NumberFormat::Int8BE: READBYTES(i8, true);
|
||||
case NumberFormat::UInt8BE: READBYTES(u8, true);
|
||||
case NumberFormat::Int16BE: READBYTES(i16, true);
|
||||
case NumberFormat::UInt16BE: READBYTES(u16, true);
|
||||
case NumberFormat::Int32BE: READBYTES(i32, true);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** Returns the length of a Buffer object. */
|
||||
//% property
|
||||
int length(Buffer s) {
|
||||
return s->length;
|
||||
}
|
||||
|
||||
/**
|
||||
* Fill (a fragment) of the buffer with given value.
|
||||
*/
|
||||
//%
|
||||
void fill(Buffer buf, int value, int offset = 0, int length = -1)
|
||||
{
|
||||
ManagedBuffer(buf).fill(value, offset, length);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a copy of a fragment of a buffer.
|
||||
*/
|
||||
//%
|
||||
Buffer slice(Buffer buf, int offset = 0, int length = -1)
|
||||
{
|
||||
return ManagedBuffer(buf).slice(offset, length).leakData();
|
||||
}
|
||||
|
||||
/**
|
||||
* Shift buffer left in place, with zero padding.
|
||||
* @param offset number of bytes to shift; use negative value to shift right
|
||||
*/
|
||||
//%
|
||||
void shift(Buffer buf, int offset)
|
||||
{
|
||||
ManagedBuffer(buf).shift(offset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Rotate buffer left in place.
|
||||
* @param offset number of bytes to shift; use negative value to shift right
|
||||
*/
|
||||
//%
|
||||
void rotate(Buffer buf, int offset)
|
||||
{
|
||||
ManagedBuffer(buf).rotate(offset);
|
||||
}
|
||||
|
||||
// int readBytes(uint8_t *dst, int offset, int length, bool swapBytes = false) const;
|
||||
// int writeBytes(int dstOffset, uint8_t *src, int length, bool swapBytes = false);
|
||||
|
||||
/**
|
||||
* Write contents of `src` at `dstOffset` in current buffer.
|
||||
*/
|
||||
//%
|
||||
void write(Buffer buf, int dstOffset, Buffer src)
|
||||
{
|
||||
//Not supported, we only do up to 4 args :/
|
||||
//void write(Buffer buf, int dstOffset, Buffer src, int srcOffset = 0, int length = -1)
|
||||
ManagedBuffer(buf).writeBuffer(dstOffset, ManagedBuffer(src), 0, -1);
|
||||
}
|
||||
}
|
@ -1,5 +1,119 @@
|
||||
#include "BitVM.h"
|
||||
#include "ksbit.h"
|
||||
|
||||
/**
|
||||
* How to create the event.
|
||||
*/
|
||||
enum class EventCreationMode {
|
||||
/**
|
||||
* MicroBitEvent is initialised, and no further processing takes place.
|
||||
*/
|
||||
CreateOnly = CREATE_ONLY,
|
||||
/**
|
||||
* MicroBitEvent is initialised, and queued on the MicroBitMessageBus.
|
||||
*/
|
||||
CreateAndQueue = CREATE_AND_QUEUE,
|
||||
/**
|
||||
* MicroBitEvent is initialised, and its event handlers are immediately fired (not suitable for use in interrupts!).
|
||||
*/
|
||||
CreateAndFire = CREATE_AND_FIRE,
|
||||
};
|
||||
|
||||
// note the trailing '_' in names - otherwise we get conflict with the pre-processor
|
||||
// this trailing underscore is removed by enums.d.ts generation process
|
||||
|
||||
// TODO shouldn't these be renamed to something more sensible anyways?
|
||||
|
||||
enum EventBusSource {
|
||||
MICROBIT_ID_BUTTON_A_ = MICROBIT_ID_BUTTON_A,
|
||||
MICROBIT_ID_BUTTON_B_ = MICROBIT_ID_BUTTON_B,
|
||||
MICROBIT_ID_BUTTON_AB_ = MICROBIT_ID_BUTTON_AB,
|
||||
MICROBIT_ID_RADIO_ = MICROBIT_ID_RADIO,
|
||||
MICROBIT_ID_GESTURE_ = MICROBIT_ID_GESTURE,
|
||||
MICROBIT_ID_ACCELEROMETER_ = MICROBIT_ID_ACCELEROMETER,
|
||||
MICROBIT_ID_IO_P0_ = MICROBIT_ID_IO_P0,
|
||||
MICROBIT_ID_IO_P1_ = MICROBIT_ID_IO_P1,
|
||||
MICROBIT_ID_IO_P2_ = MICROBIT_ID_IO_P2,
|
||||
MICROBIT_ID_IO_P3_ = MICROBIT_ID_IO_P3,
|
||||
MICROBIT_ID_IO_P4_ = MICROBIT_ID_IO_P4,
|
||||
MICROBIT_ID_IO_P5_ = MICROBIT_ID_IO_P5,
|
||||
MICROBIT_ID_IO_P6_ = MICROBIT_ID_IO_P6,
|
||||
MICROBIT_ID_IO_P7_ = MICROBIT_ID_IO_P7,
|
||||
MICROBIT_ID_IO_P8_ = MICROBIT_ID_IO_P8,
|
||||
MICROBIT_ID_IO_P9_ = MICROBIT_ID_IO_P9,
|
||||
MICROBIT_ID_IO_P10_ = MICROBIT_ID_IO_P10,
|
||||
MICROBIT_ID_IO_P11_ = MICROBIT_ID_IO_P11,
|
||||
MICROBIT_ID_IO_P12_ = MICROBIT_ID_IO_P12,
|
||||
MICROBIT_ID_IO_P13_ = MICROBIT_ID_IO_P13,
|
||||
MICROBIT_ID_IO_P14_ = MICROBIT_ID_IO_P14,
|
||||
MICROBIT_ID_IO_P15_ = MICROBIT_ID_IO_P15,
|
||||
MICROBIT_ID_IO_P16_ = MICROBIT_ID_IO_P16,
|
||||
MICROBIT_ID_IO_P19_ = MICROBIT_ID_IO_P19,
|
||||
MICROBIT_ID_IO_P20_ = MICROBIT_ID_IO_P20,
|
||||
MES_DEVICE_INFO_ID_ = MES_DEVICE_INFO_ID,
|
||||
MES_SIGNAL_STRENGTH_ID_ = MES_SIGNAL_STRENGTH_ID,
|
||||
MES_DPAD_CONTROLLER_ID_ = MES_DPAD_CONTROLLER_ID,
|
||||
MES_BROADCAST_GENERAL_ID_ = MES_BROADCAST_GENERAL_ID,
|
||||
};
|
||||
|
||||
enum EventBusValue {
|
||||
MICROBIT_EVT_ANY_ = MICROBIT_EVT_ANY,
|
||||
MICROBIT_BUTTON_EVT_CLICK_ = MICROBIT_BUTTON_EVT_CLICK,
|
||||
MICROBIT_RADIO_EVT_DATAGRAM_ = MICROBIT_RADIO_EVT_DATAGRAM,
|
||||
MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE_ = MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE,
|
||||
MES_ALERT_EVT_ALARM1_ = MES_ALERT_EVT_ALARM1,
|
||||
MES_ALERT_EVT_ALARM2_ = MES_ALERT_EVT_ALARM2,
|
||||
MES_ALERT_EVT_ALARM3_ = MES_ALERT_EVT_ALARM3,
|
||||
MES_ALERT_EVT_ALARM4_ = MES_ALERT_EVT_ALARM4,
|
||||
MES_ALERT_EVT_ALARM5_ = MES_ALERT_EVT_ALARM5,
|
||||
MES_ALERT_EVT_ALARM6_ = MES_ALERT_EVT_ALARM6,
|
||||
MES_ALERT_EVT_DISPLAY_TOAST_ = MES_ALERT_EVT_DISPLAY_TOAST,
|
||||
MES_ALERT_EVT_FIND_MY_PHONE_ = MES_ALERT_EVT_FIND_MY_PHONE,
|
||||
MES_ALERT_EVT_PLAY_RINGTONE_ = MES_ALERT_EVT_PLAY_RINGTONE,
|
||||
MES_ALERT_EVT_PLAY_SOUND_ = MES_ALERT_EVT_PLAY_SOUND,
|
||||
MES_ALERT_EVT_VIBRATE_ = MES_ALERT_EVT_VIBRATE,
|
||||
MES_CAMERA_EVT_LAUNCH_PHOTO_MODE_ = MES_CAMERA_EVT_LAUNCH_PHOTO_MODE,
|
||||
MES_CAMERA_EVT_LAUNCH_VIDEO_MODE_ = MES_CAMERA_EVT_LAUNCH_VIDEO_MODE,
|
||||
MES_CAMERA_EVT_START_VIDEO_CAPTURE_ = MES_CAMERA_EVT_START_VIDEO_CAPTURE,
|
||||
MES_CAMERA_EVT_STOP_PHOTO_MODE_ = MES_CAMERA_EVT_STOP_PHOTO_MODE,
|
||||
MES_CAMERA_EVT_STOP_VIDEO_CAPTURE_ = MES_CAMERA_EVT_STOP_VIDEO_CAPTURE,
|
||||
MES_CAMERA_EVT_STOP_VIDEO_MODE_ = MES_CAMERA_EVT_STOP_VIDEO_MODE,
|
||||
MES_CAMERA_EVT_TAKE_PHOTO_ = MES_CAMERA_EVT_TAKE_PHOTO,
|
||||
MES_CAMERA_EVT_TOGGLE_FRONT_REAR_ = MES_CAMERA_EVT_TOGGLE_FRONT_REAR,
|
||||
MES_DEVICE_DISPLAY_OFF_ = MES_DEVICE_DISPLAY_OFF,
|
||||
MES_DEVICE_DISPLAY_ON_ = MES_DEVICE_DISPLAY_ON,
|
||||
MES_DEVICE_GESTURE_DEVICE_SHAKEN_ = MES_DEVICE_GESTURE_DEVICE_SHAKEN,
|
||||
MES_DEVICE_INCOMING_CALL_ = MES_DEVICE_INCOMING_CALL,
|
||||
MES_DEVICE_INCOMING_MESSAGE_ = MES_DEVICE_INCOMING_MESSAGE,
|
||||
MES_DEVICE_ORIENTATION_LANDSCAPE_ = MES_DEVICE_ORIENTATION_LANDSCAPE,
|
||||
MES_DEVICE_ORIENTATION_PORTRAIT_ = MES_DEVICE_ORIENTATION_PORTRAIT,
|
||||
MES_DPAD_BUTTON_1_DOWN_ = MES_DPAD_BUTTON_1_DOWN,
|
||||
MES_DPAD_BUTTON_1_UP_ = MES_DPAD_BUTTON_1_UP,
|
||||
MES_DPAD_BUTTON_2_DOWN_ = MES_DPAD_BUTTON_2_DOWN,
|
||||
MES_DPAD_BUTTON_2_UP_ = MES_DPAD_BUTTON_2_UP,
|
||||
MES_DPAD_BUTTON_3_DOWN_ = MES_DPAD_BUTTON_3_DOWN,
|
||||
MES_DPAD_BUTTON_3_UP_ = MES_DPAD_BUTTON_3_UP,
|
||||
MES_DPAD_BUTTON_4_DOWN_ = MES_DPAD_BUTTON_4_DOWN,
|
||||
MES_DPAD_BUTTON_4_UP_ = MES_DPAD_BUTTON_4_UP,
|
||||
MES_DPAD_BUTTON_A_DOWN_ = MES_DPAD_BUTTON_A_DOWN,
|
||||
MES_DPAD_BUTTON_A_UP_ = MES_DPAD_BUTTON_A_UP,
|
||||
MES_DPAD_BUTTON_B_DOWN_ = MES_DPAD_BUTTON_B_DOWN,
|
||||
MES_DPAD_BUTTON_B_UP_ = MES_DPAD_BUTTON_B_UP,
|
||||
MES_DPAD_BUTTON_C_DOWN_ = MES_DPAD_BUTTON_C_DOWN,
|
||||
MES_DPAD_BUTTON_C_UP_ = MES_DPAD_BUTTON_C_UP,
|
||||
MES_DPAD_BUTTON_D_DOWN_ = MES_DPAD_BUTTON_D_DOWN,
|
||||
MES_DPAD_BUTTON_D_UP_ = MES_DPAD_BUTTON_D_UP,
|
||||
MES_REMOTE_CONTROL_EVT_FORWARD_ = MES_REMOTE_CONTROL_EVT_FORWARD,
|
||||
MES_REMOTE_CONTROL_EVT_NEXTTRACK_ = MES_REMOTE_CONTROL_EVT_NEXTTRACK,
|
||||
MES_REMOTE_CONTROL_EVT_PAUSE_ = MES_REMOTE_CONTROL_EVT_PAUSE,
|
||||
MES_REMOTE_CONTROL_EVT_PLAY_ = MES_REMOTE_CONTROL_EVT_PLAY,
|
||||
MES_REMOTE_CONTROL_EVT_PREVTRACK_ = MES_REMOTE_CONTROL_EVT_PREVTRACK,
|
||||
MES_REMOTE_CONTROL_EVT_REWIND_ = MES_REMOTE_CONTROL_EVT_REWIND,
|
||||
MES_REMOTE_CONTROL_EVT_STOP_ = MES_REMOTE_CONTROL_EVT_STOP,
|
||||
MES_REMOTE_CONTROL_EVT_VOLUMEDOWN_ = MES_REMOTE_CONTROL_EVT_VOLUMEDOWN,
|
||||
MES_REMOTE_CONTROL_EVT_VOLUMEUP_ = MES_REMOTE_CONTROL_EVT_VOLUMEUP,
|
||||
};
|
||||
|
||||
//% weight=1 color="#333333"
|
||||
namespace control {
|
||||
void fiberDone(void *a)
|
||||
{
|
||||
@ -13,10 +127,7 @@ namespace control {
|
||||
//% help=control/in-background
|
||||
//% blockId="control_in_background" block="run in background" blockGap=8
|
||||
void inBackground(Action a) {
|
||||
if (a != 0) {
|
||||
incr(a);
|
||||
create_fiber((void(*)(void*))action::run, (void*)a, fiberDone);
|
||||
}
|
||||
runInBackground(a);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -27,4 +138,25 @@ namespace control {
|
||||
void reset() {
|
||||
uBit.reset();
|
||||
}
|
||||
|
||||
/**
|
||||
* Raises an event in the event bus.
|
||||
* @param src ID of the MicroBit Component that generated the event e.g. MICROBIT_ID_BUTTON_A.
|
||||
* @param value Component specific code indicating the cause of the event.
|
||||
* @param mode optional definition of how the event should be processed after construction (default is CREATE_AND_QUEUE).
|
||||
*/
|
||||
//% weight=21 blockGap=12 blockId="control_raise_event" block="raise event|from source %src=control_event_source|with value %value=control_event_value" blockExternalInputs=1
|
||||
//% mode.defl=CREATE_AND_QUEUE
|
||||
void raiseEvent(int src, int value, EventCreationMode mode) {
|
||||
MicroBitEvent evt(src, value, (MicroBitEventLaunchMode)mode);
|
||||
}
|
||||
|
||||
/**
|
||||
* Raises an event in the event bus.
|
||||
*/
|
||||
//% weight=20 blockGap=8 blockId="control_on_event" block="on event|from %src=control_event_source|with value %value=control_event_value"
|
||||
//% blockExternalInputs=1 blockStatement=1
|
||||
void onEvent(int src, int value, Action handler) {
|
||||
registerWithDal(src, value, handler);
|
||||
}
|
||||
}
|
||||
|
@ -1,195 +1,6 @@
|
||||
enum EventCreationMode {
|
||||
/**
|
||||
* MicroBitEvent is initialised, and no further processing takes place.
|
||||
*/
|
||||
//% enumVal=CREATE_ONLY
|
||||
CreateOnly,
|
||||
/**
|
||||
* MicroBitEvent is initialised, and queued on the MicroBitMessageBus.
|
||||
*/
|
||||
//% enumVal=CREATE_AND_QUEUE
|
||||
CreateAndQueue,
|
||||
/**
|
||||
* MicroBitEvent is initialised, and its event handlers are immediately fired (not suitable for use in interrupts!).
|
||||
*/
|
||||
//% enumVal=CREATE_AND_FIRE
|
||||
CreateAndFire
|
||||
}
|
||||
|
||||
enum EventBusSource {
|
||||
//% enumVal=MICROBIT_ID_BUTTON_A
|
||||
MICROBIT_ID_BUTTON_A,
|
||||
//% enumVal=MICROBIT_ID_BUTTON_B
|
||||
MICROBIT_ID_BUTTON_B,
|
||||
//% enumVal=MICROBIT_ID_BUTTON_AB
|
||||
MICROBIT_ID_BUTTON_AB,
|
||||
//% enumVal=MICROBIT_ID_RADIO
|
||||
MICROBIT_ID_RADIO,
|
||||
//% enumVal=MICROBIT_ID_GESTURE
|
||||
MICROBIT_ID_GESTURE,
|
||||
//% enumVal=MICROBIT_ID_ACCELEROMETER
|
||||
MICROBIT_ID_ACCELEROMETER,
|
||||
//% enumVal=MICROBIT_ID_IO_P0
|
||||
MICROBIT_ID_IO_P0,
|
||||
//% enumVal=MICROBIT_ID_IO_P1
|
||||
MICROBIT_ID_IO_P1,
|
||||
//% enumVal=MICROBIT_ID_IO_P2
|
||||
MICROBIT_ID_IO_P2,
|
||||
//% enumVal=MICROBIT_ID_IO_P3
|
||||
MICROBIT_ID_IO_P3,
|
||||
//% enumVal=MICROBIT_ID_IO_P4
|
||||
MICROBIT_ID_IO_P4,
|
||||
//% enumVal=MICROBIT_ID_IO_P5
|
||||
MICROBIT_ID_IO_P5,
|
||||
//% enumVal=MICROBIT_ID_IO_P6
|
||||
MICROBIT_ID_IO_P6,
|
||||
//% enumVal=MICROBIT_ID_IO_P7
|
||||
MICROBIT_ID_IO_P7,
|
||||
//% enumVal=MICROBIT_ID_IO_P8
|
||||
MICROBIT_ID_IO_P8,
|
||||
//% enumVal=MICROBIT_ID_IO_P9
|
||||
MICROBIT_ID_IO_P9,
|
||||
//% enumVal=MICROBIT_ID_IO_P10
|
||||
MICROBIT_ID_IO_P10,
|
||||
//% enumVal=MICROBIT_ID_IO_P11
|
||||
MICROBIT_ID_IO_P11,
|
||||
//% enumVal=MICROBIT_ID_IO_P12
|
||||
MICROBIT_ID_IO_P12,
|
||||
//% enumVal=MICROBIT_ID_IO_P13
|
||||
MICROBIT_ID_IO_P13,
|
||||
//% enumVal=MICROBIT_ID_IO_P14
|
||||
MICROBIT_ID_IO_P14,
|
||||
//% enumVal=MICROBIT_ID_IO_P15
|
||||
MICROBIT_ID_IO_P15,
|
||||
//% enumVal=MICROBIT_ID_IO_P16
|
||||
MICROBIT_ID_IO_P16,
|
||||
//% enumVal=MICROBIT_ID_IO_P19
|
||||
MICROBIT_ID_IO_P19,
|
||||
//% enumVal=MICROBIT_ID_IO_P20
|
||||
MICROBIT_ID_IO_P20,
|
||||
//% enumVal=MES_DEVICE_INFO_ID
|
||||
MES_DEVICE_INFO_ID,
|
||||
//% enumVal=MES_SIGNAL_STRENGTH_ID
|
||||
MES_SIGNAL_STRENGTH_ID,
|
||||
//% enumVal=MES_DPAD_CONTROLLER_ID
|
||||
MES_DPAD_CONTROLLER_ID,
|
||||
//% enumVal=MES_BROADCAST_GENERAL_ID
|
||||
MES_BROADCAST_GENERAL_ID,
|
||||
}
|
||||
|
||||
enum EventBusValue {
|
||||
//% enumVal=MICROBIT_EVT_ANY
|
||||
MICROBIT_EVT_ANY,
|
||||
//% enumVal=MICROBIT_BUTTON_EVT_CLICK
|
||||
MICROBIT_BUTTON_EVT_CLICK,
|
||||
//% enumVal=MICROBIT_RADIO_EVT_DATAGRAM
|
||||
MICROBIT_RADIO_EVT_DATAGRAM,
|
||||
//% enumVal=MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE
|
||||
MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE,
|
||||
//% enumVal=MES_ALERT_EVT_ALARM1
|
||||
MES_ALERT_EVT_ALARM1,
|
||||
//% enumVal=MES_ALERT_EVT_ALARM2
|
||||
MES_ALERT_EVT_ALARM2,
|
||||
//% enumVal=MES_ALERT_EVT_ALARM3
|
||||
MES_ALERT_EVT_ALARM3,
|
||||
//% enumVal=MES_ALERT_EVT_ALARM4
|
||||
MES_ALERT_EVT_ALARM4,
|
||||
//% enumVal=MES_ALERT_EVT_ALARM5
|
||||
MES_ALERT_EVT_ALARM5,
|
||||
//% enumVal=MES_ALERT_EVT_ALARM6
|
||||
MES_ALERT_EVT_ALARM6,
|
||||
//% enumVal=MES_ALERT_EVT_DISPLAY_TOAST
|
||||
MES_ALERT_EVT_DISPLAY_TOAST,
|
||||
//% enumVal=MES_ALERT_EVT_FIND_MY_PHONE
|
||||
MES_ALERT_EVT_FIND_MY_PHONE,
|
||||
//% enumVal=MES_ALERT_EVT_PLAY_RINGTONE
|
||||
MES_ALERT_EVT_PLAY_RINGTONE,
|
||||
//% enumVal=MES_ALERT_EVT_PLAY_SOUND
|
||||
MES_ALERT_EVT_PLAY_SOUND,
|
||||
//% enumVal=MES_ALERT_EVT_VIBRATE
|
||||
MES_ALERT_EVT_VIBRATE,
|
||||
//% enumVal=MES_CAMERA_EVT_LAUNCH_PHOTO_MODE
|
||||
MES_CAMERA_EVT_LAUNCH_PHOTO_MODE,
|
||||
//% enumVal=MES_CAMERA_EVT_LAUNCH_VIDEO_MODE
|
||||
MES_CAMERA_EVT_LAUNCH_VIDEO_MODE,
|
||||
//% enumVal=MES_CAMERA_EVT_START_VIDEO_CAPTURE
|
||||
MES_CAMERA_EVT_START_VIDEO_CAPTURE,
|
||||
//% enumVal=MES_CAMERA_EVT_STOP_PHOTO_MODE
|
||||
MES_CAMERA_EVT_STOP_PHOTO_MODE,
|
||||
//% enumVal=MES_CAMERA_EVT_STOP_VIDEO_CAPTURE
|
||||
MES_CAMERA_EVT_STOP_VIDEO_CAPTURE,
|
||||
//% enumVal=MES_CAMERA_EVT_STOP_VIDEO_MODE
|
||||
MES_CAMERA_EVT_STOP_VIDEO_MODE,
|
||||
//% enumVal=MES_CAMERA_EVT_TAKE_PHOTO
|
||||
MES_CAMERA_EVT_TAKE_PHOTO,
|
||||
//% enumVal=MES_CAMERA_EVT_TOGGLE_FRONT_REAR
|
||||
MES_CAMERA_EVT_TOGGLE_FRONT_REAR,
|
||||
//% enumVal=MES_DEVICE_DISPLAY_OFF
|
||||
MES_DEVICE_DISPLAY_OFF,
|
||||
//% enumVal=MES_DEVICE_DISPLAY_ON
|
||||
MES_DEVICE_DISPLAY_ON,
|
||||
//% enumVal=MES_DEVICE_GESTURE_DEVICE_SHAKEN
|
||||
MES_DEVICE_GESTURE_DEVICE_SHAKEN,
|
||||
//% enumVal=MES_DEVICE_INCOMING_CALL
|
||||
MES_DEVICE_INCOMING_CALL,
|
||||
//% enumVal=MES_DEVICE_INCOMING_MESSAGE
|
||||
MES_DEVICE_INCOMING_MESSAGE,
|
||||
//% enumVal=MES_DEVICE_ORIENTATION_LANDSCAPE
|
||||
MES_DEVICE_ORIENTATION_LANDSCAPE,
|
||||
//% enumVal=MES_DEVICE_ORIENTATION_PORTRAIT
|
||||
MES_DEVICE_ORIENTATION_PORTRAIT,
|
||||
//% enumVal=MES_DPAD_BUTTON_1_DOWN
|
||||
MES_DPAD_BUTTON_1_DOWN,
|
||||
//% enumVal=MES_DPAD_BUTTON_1_UP
|
||||
MES_DPAD_BUTTON_1_UP,
|
||||
//% enumVal=MES_DPAD_BUTTON_2_DOWN
|
||||
MES_DPAD_BUTTON_2_DOWN,
|
||||
//% enumVal=MES_DPAD_BUTTON_2_UP
|
||||
MES_DPAD_BUTTON_2_UP,
|
||||
//% enumVal=MES_DPAD_BUTTON_3_DOWN
|
||||
MES_DPAD_BUTTON_3_DOWN,
|
||||
//% enumVal=MES_DPAD_BUTTON_3_UP
|
||||
MES_DPAD_BUTTON_3_UP,
|
||||
//% enumVal=MES_DPAD_BUTTON_4_DOWN
|
||||
MES_DPAD_BUTTON_4_DOWN,
|
||||
//% enumVal=MES_DPAD_BUTTON_4_UP
|
||||
MES_DPAD_BUTTON_4_UP,
|
||||
//% enumVal=MES_DPAD_BUTTON_A_DOWN
|
||||
MES_DPAD_BUTTON_A_DOWN,
|
||||
//% enumVal=MES_DPAD_BUTTON_A_UP
|
||||
MES_DPAD_BUTTON_A_UP,
|
||||
//% enumVal=MES_DPAD_BUTTON_B_DOWN
|
||||
MES_DPAD_BUTTON_B_DOWN,
|
||||
//% enumVal=MES_DPAD_BUTTON_B_UP
|
||||
MES_DPAD_BUTTON_B_UP,
|
||||
//% enumVal=MES_DPAD_BUTTON_C_DOWN
|
||||
MES_DPAD_BUTTON_C_DOWN,
|
||||
//% enumVal=MES_DPAD_BUTTON_C_UP
|
||||
MES_DPAD_BUTTON_C_UP,
|
||||
//% enumVal=MES_DPAD_BUTTON_D_DOWN
|
||||
MES_DPAD_BUTTON_D_DOWN,
|
||||
//% enumVal=MES_DPAD_BUTTON_D_UP
|
||||
MES_DPAD_BUTTON_D_UP,
|
||||
//% enumVal=MES_REMOTE_CONTROL_EVT_FORWARD
|
||||
MES_REMOTE_CONTROL_EVT_FORWARD,
|
||||
//% enumVal=MES_REMOTE_CONTROL_EVT_NEXTTRACK
|
||||
MES_REMOTE_CONTROL_EVT_NEXTTRACK,
|
||||
//% enumVal=MES_REMOTE_CONTROL_EVT_PAUSE
|
||||
MES_REMOTE_CONTROL_EVT_PAUSE,
|
||||
//% enumVal=MES_REMOTE_CONTROL_EVT_PLAY
|
||||
MES_REMOTE_CONTROL_EVT_PLAY,
|
||||
//% enumVal=MES_REMOTE_CONTROL_EVT_PREVTRACK
|
||||
MES_REMOTE_CONTROL_EVT_PREVTRACK,
|
||||
//% enumVal=MES_REMOTE_CONTROL_EVT_REWIND
|
||||
MES_REMOTE_CONTROL_EVT_REWIND,
|
||||
//% enumVal=MES_REMOTE_CONTROL_EVT_STOP
|
||||
MES_REMOTE_CONTROL_EVT_STOP,
|
||||
//% enumVal=MES_REMOTE_CONTROL_EVT_VOLUMEDOWN
|
||||
MES_REMOTE_CONTROL_EVT_VOLUMEDOWN,
|
||||
//% enumVal=MES_REMOTE_CONTROL_EVT_VOLUMEUP
|
||||
MES_REMOTE_CONTROL_EVT_VOLUMEUP,
|
||||
}
|
||||
|
||||
/**
|
||||
* Runtime and event utilities.
|
||||
*/
|
||||
//% weight=1 color="#333333"
|
||||
namespace control {
|
||||
|
||||
@ -207,22 +18,4 @@ namespace control {
|
||||
export function eventValue(id: EventBusValue) : number {
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Raises an event in the event bus.
|
||||
* @param src ID of the MicroBit Component that generated the event e.g. MICROBIT_ID_BUTTON_A.
|
||||
* @param value Component specific code indicating the cause of the event.
|
||||
* @param mode optional definition of how the event should be processed after construction (default is CREATE_AND_QUEUE).
|
||||
*/
|
||||
// shim=micro_bit::busRaiseEvent
|
||||
//% weight=21 blockGap=12 blockId="control_raise_event" block="raise event|from source %src=control_event_source|with value %value=control_event_value" blockExternalInputs=1
|
||||
export function raiseEvent(src: number, value: number, mode: EventCreationMode = EventCreationMode.CreateAndQueue): void { }
|
||||
|
||||
/**
|
||||
* Raises an event in the event bus.
|
||||
*/
|
||||
// shim=micro_bit::onBusEvent
|
||||
//% weight=20 blockGap=8 blockId="control_on_event" block="on event|from %src=control_event_source|with value %value=control_event_value"
|
||||
//% blockExternalInputs=1 blockStatement=1
|
||||
export function onEvent(src: number, value: number, handler: Action): void { }
|
||||
}
|
||||
|
291
libs/microbit/core.cpp
Normal file
291
libs/microbit/core.cpp
Normal file
@ -0,0 +1,291 @@
|
||||
#include "ksbit.h"
|
||||
#include <limits.h>
|
||||
|
||||
namespace String_ {
|
||||
//%
|
||||
StringData *charAt(StringData *s, int pos) {
|
||||
return ManagedString((char)ManagedString(s).charAt(pos)).leakData();
|
||||
}
|
||||
|
||||
//%
|
||||
int charCodeAt(StringData *s, int index) {
|
||||
return ManagedString(s).charAt(index);
|
||||
}
|
||||
|
||||
//%
|
||||
StringData *concat(StringData *s, StringData *other) {
|
||||
ManagedString a(s), b(other);
|
||||
return (a + b).leakData();
|
||||
}
|
||||
|
||||
//%
|
||||
int compare(StringData *s, StringData *that) {
|
||||
return strcmp(s->data, that->data);
|
||||
}
|
||||
|
||||
//%
|
||||
int length(StringData *s) { return s->len; }
|
||||
|
||||
//%
|
||||
StringData *fromCharCode(int code)
|
||||
{
|
||||
return ManagedString((char)code).leakData();
|
||||
}
|
||||
|
||||
//%
|
||||
int toNumber(StringData *s) {
|
||||
return atoi(s->data);
|
||||
}
|
||||
|
||||
//%
|
||||
StringData *mkEmpty()
|
||||
{
|
||||
return ManagedString::EmptyString.leakData();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
namespace Boolean_ {
|
||||
// Cache the string literals "true" and "false" when used.
|
||||
// Note that the representation of booleans stays the usual C-one.
|
||||
|
||||
static const char sTrue[] __attribute__ ((aligned (4))) = "\xff\xff\x04\x00" "true\0";
|
||||
static const char sFalse[] __attribute__ ((aligned (4))) = "\xff\xff\x05\x00" "false\0";
|
||||
|
||||
//%
|
||||
StringData* toString(bool v)
|
||||
{
|
||||
if (v) {
|
||||
return (StringData*)(void*)sTrue;
|
||||
} else {
|
||||
return (StringData*)(void*)sFalse;
|
||||
}
|
||||
}
|
||||
|
||||
//%
|
||||
bool bang(bool v) { return !v; }
|
||||
}
|
||||
|
||||
namespace Number_ {
|
||||
//%
|
||||
StringData* toString(int n)
|
||||
{
|
||||
return ManagedString(n).leakData();
|
||||
}
|
||||
|
||||
// +, - and friends are handled directly by assembly instructions
|
||||
// The comparisons are here as they are more code-size efficient
|
||||
|
||||
//%
|
||||
bool lt(int x, int y) { return x < y; }
|
||||
//%
|
||||
bool le(int x, int y) { return x <= y; }
|
||||
//%
|
||||
bool neq(int x, int y) { return x != y; }
|
||||
//%
|
||||
bool eq(int x, int y) { return x == y; }
|
||||
//%
|
||||
bool gt(int x, int y) { return x > y; }
|
||||
//%
|
||||
bool ge(int x, int y) { return x >= y; }
|
||||
|
||||
// These in fact call into C runtime on Cortex-M0
|
||||
//%
|
||||
int div(int x, int y) { return x / y; }
|
||||
//%
|
||||
int mod(int x, int y) { return x % y; }
|
||||
}
|
||||
|
||||
namespace Math_ {
|
||||
//%
|
||||
int pow(int x, int y)
|
||||
{
|
||||
if (y < 0)
|
||||
return 0;
|
||||
int r = 1;
|
||||
while (y) {
|
||||
if (y & 1)
|
||||
r *= x;
|
||||
y >>= 1;
|
||||
x *= x;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
//%
|
||||
int random(int max) {
|
||||
if (max == INT_MIN)
|
||||
return -uBit.random(INT_MAX);
|
||||
else if (max < 0)
|
||||
return -uBit.random(-max);
|
||||
else if (max == 0)
|
||||
return 0;
|
||||
else
|
||||
return uBit.random(max);
|
||||
}
|
||||
|
||||
//%
|
||||
int sqrt(int x)
|
||||
{
|
||||
return ::sqrt(x);
|
||||
}
|
||||
}
|
||||
|
||||
namespace Array_ {
|
||||
//%
|
||||
RefCollection *mk(uint32_t flags)
|
||||
{
|
||||
return new RefCollection(flags);
|
||||
}
|
||||
//%
|
||||
int length(RefCollection *c) { return c->length(); }
|
||||
//%
|
||||
void push(RefCollection *c, uint32_t x) { c->push(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); }
|
||||
//%
|
||||
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); }
|
||||
}
|
||||
|
||||
// Import some stuff directly
|
||||
namespace pxt {
|
||||
//%
|
||||
void registerWithDal(int id, int event, Action a);
|
||||
//%
|
||||
void runAction0(Action a);
|
||||
//%
|
||||
void runAction1(Action a, int arg);
|
||||
//%
|
||||
Action mkAction(int reflen, int totallen, int startptr);
|
||||
//%
|
||||
RefRecord* mkRecord(int reflen, int totallen);
|
||||
//%
|
||||
void debugMemLeaks();
|
||||
//%
|
||||
int incr(uint32_t e);
|
||||
//%
|
||||
void decr(uint32_t e);
|
||||
//%
|
||||
uint32_t *allocate(uint16_t sz);
|
||||
//%
|
||||
int templateHash();
|
||||
//%
|
||||
int programHash();
|
||||
//%
|
||||
void *ptrOfLiteral(int offset);
|
||||
}
|
||||
|
||||
namespace pxtrt {
|
||||
//%
|
||||
uint32_t ldloc(RefLocal *r) {
|
||||
return r->v;
|
||||
}
|
||||
|
||||
//%
|
||||
uint32_t ldlocRef(RefRefLocal *r) {
|
||||
uint32_t tmp = r->v;
|
||||
incr(tmp);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
//%
|
||||
void stloc(RefLocal *r, uint32_t v) {
|
||||
r->v = v;
|
||||
}
|
||||
|
||||
//%
|
||||
void stlocRef(RefRefLocal *r, uint32_t v) {
|
||||
decr(r->v);
|
||||
r->v = v;
|
||||
}
|
||||
|
||||
//%
|
||||
RefLocal *mkloc() {
|
||||
return new RefLocal();
|
||||
}
|
||||
|
||||
//%
|
||||
RefRefLocal *mklocRef() {
|
||||
return new RefRefLocal();
|
||||
}
|
||||
|
||||
// All of the functions below unref() self. This is for performance reasons -
|
||||
// the code emitter will not emit the unrefs for them.
|
||||
|
||||
//%
|
||||
uint32_t ldfld(RefRecord *r, int idx) {
|
||||
auto tmp = r->ld(idx);
|
||||
r->unref();
|
||||
return tmp;
|
||||
}
|
||||
|
||||
//%
|
||||
uint32_t ldfldRef(RefRecord *r, int idx) {
|
||||
auto tmp = r->ldref(idx);
|
||||
r->unref();
|
||||
return tmp;
|
||||
}
|
||||
|
||||
//%
|
||||
void stfld(RefRecord *r, int idx, uint32_t val) {
|
||||
r->st(idx, val);
|
||||
r->unref();
|
||||
}
|
||||
|
||||
//%
|
||||
void stfldRef(RefRecord *r, int idx, uint32_t val) {
|
||||
r->stref(idx, val);
|
||||
r->unref();
|
||||
}
|
||||
|
||||
//%
|
||||
uint32_t ldglb(int idx) {
|
||||
check(0 <= idx && idx < numGlobals, ERR_OUT_OF_BOUNDS, 7);
|
||||
return globals[idx];
|
||||
}
|
||||
|
||||
//%
|
||||
uint32_t ldglbRef(int idx) {
|
||||
check(0 <= idx && idx < numGlobals, ERR_OUT_OF_BOUNDS, 7);
|
||||
uint32_t tmp = globals[idx];
|
||||
incr(tmp);
|
||||
return tmp;
|
||||
}
|
||||
|
||||
// note the idx comes last - it's more convenient that way in the emitter
|
||||
//%
|
||||
void stglb(uint32_t v, int idx)
|
||||
{
|
||||
check(0 <= idx && idx < numGlobals, ERR_OUT_OF_BOUNDS, 7);
|
||||
globals[idx] = v;
|
||||
}
|
||||
|
||||
//%
|
||||
void stglbRef(uint32_t v, int idx)
|
||||
{
|
||||
check(0 <= idx && idx < numGlobals, ERR_OUT_OF_BOUNDS, 7);
|
||||
decr(globals[idx]);
|
||||
globals[idx] = v;
|
||||
}
|
||||
|
||||
// Store a captured local in a closure. It returns the action, so it can be chained.
|
||||
//%
|
||||
RefAction *stclo(RefAction *a, int idx, uint32_t v)
|
||||
{
|
||||
//DBG("STCLO "); a->print(); DBG("@%d = %p\n", idx, (void*)v);
|
||||
a->stCore(idx, v);
|
||||
return a;
|
||||
}
|
||||
|
||||
//%
|
||||
void panic(int code)
|
||||
{
|
||||
uBit.panic(code);
|
||||
}
|
||||
}
|
181
libs/microbit/core.d.ts
vendored
181
libs/microbit/core.d.ts
vendored
@ -4,14 +4,14 @@ interface Array<T> {
|
||||
/**
|
||||
* Gets or sets the length of the array. This is a number one higher than the highest element defined in an array.
|
||||
*/
|
||||
//% shim=collection::count
|
||||
//% shim=Array_::length
|
||||
length: number;
|
||||
|
||||
/**
|
||||
* Appends new elements to an array.
|
||||
* @param items New elements of the Array.
|
||||
*/
|
||||
//% shim=collection::add
|
||||
//% shim=Array_::push
|
||||
push(item: T): void;
|
||||
|
||||
/**
|
||||
@ -41,11 +41,11 @@ interface Array<T> {
|
||||
slice(start: number, end: number): T[];
|
||||
|
||||
/** Removes the first occurence of an object. Returns true if removed. */
|
||||
//% shim=collection::remove
|
||||
//% shim=Array_::removeElement
|
||||
removeElement(element:T) : boolean;
|
||||
|
||||
/** Removes the object at position index. */
|
||||
//% shim=collection::remove_at
|
||||
//% shim=Array_::removeAt
|
||||
removeAt(idx:number) : void;
|
||||
|
||||
|
||||
@ -69,93 +69,56 @@ interface Array<T> {
|
||||
* @param searchElement The value to locate in the array.
|
||||
* @param fromIndex The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.
|
||||
*/
|
||||
//% shim=collection::index_of
|
||||
//% shim=Array_::indexOf
|
||||
indexOf(searchElement: T, fromIndex?: number): number;
|
||||
|
||||
|
||||
[n: number]: T;
|
||||
}
|
||||
|
||||
|
||||
interface String {
|
||||
|
||||
declare interface String {
|
||||
/**
|
||||
* Returns the character at the specified index.
|
||||
* @param pos The zero-based index of the desired character.
|
||||
*/
|
||||
//% shim=string::at
|
||||
* Returns the character at the specified index.
|
||||
* @param pos The zero-based index of the desired character.
|
||||
*/
|
||||
//% shim=String_::charAt
|
||||
charAt(pos: number): string;
|
||||
|
||||
/**
|
||||
* Returns the Unicode value of the character at the specified location.
|
||||
* @param index The zero-based index of the desired character. If there is no character at the specified index, NaN is returned.
|
||||
*/
|
||||
//% shim=string::code_at
|
||||
* Returns the Unicode value of the character at the specified location.
|
||||
* @param index The zero-based index of the desired character. If there is no character at the specified index, NaN is returned.
|
||||
*/
|
||||
//% shim=String_::charCodeAt
|
||||
charCodeAt(index: number): number;
|
||||
|
||||
/**
|
||||
* Returns a string that contains the concatenation of two or more strings.
|
||||
* @param strings The strings to append to the end of the string.
|
||||
*/
|
||||
//% shim=string::concat
|
||||
* Returns a string that contains the concatenation of two or more strings.
|
||||
* @param other The string to append to the end of the string.
|
||||
*/
|
||||
//% shim=String_::concat
|
||||
concat(other: string): string;
|
||||
|
||||
/**
|
||||
* Returns the position of the first occurrence of a substring.
|
||||
* @param searchString The substring to search for in the string
|
||||
* @param position The index at which to begin searching the String object. If omitted, search starts at the beginning of the string.
|
||||
*/
|
||||
indexOf(searchString: string, position?: number): number;
|
||||
|
||||
/**
|
||||
* Returns the last occurrence of a substring in the string.
|
||||
* @param searchString The substring to search for.
|
||||
* @param position The index at which to begin searching. If omitted, the search begins at the end of the string.
|
||||
*/
|
||||
lastIndexOf(searchString: string, position?: number): number;
|
||||
|
||||
/**
|
||||
* Determines whether two strings are equivalent in the current locale.
|
||||
* @param that String to compare to target string
|
||||
*/
|
||||
localeCompare(that: string): number;
|
||||
|
||||
/**
|
||||
* Returns a section of a string.
|
||||
* @param start The index to the beginning of the specified portion of stringObj.
|
||||
* @param end The index to the end of the specified portion of stringObj. The substring includes the characters up to, but not including, the character indicated by end.
|
||||
* If this value is not specified, the substring continues to the end of stringObj.
|
||||
*/
|
||||
slice(start?: number, end?: number): string;
|
||||
|
||||
/**
|
||||
* Returns the substring at the specified location within a String object.
|
||||
* @param start The zero-based index number indicating the beginning of the substring.
|
||||
* @param end Zero-based index number indicating the end of the substring. The substring includes the characters up to, but not including, the character indicated by end.
|
||||
* If end is omitted, the characters from start through the end of the original string are returned.
|
||||
*/
|
||||
substring(start: number, end?: number): string;
|
||||
|
||||
/** Converts all the alphabetic characters in a string to lowercase. */
|
||||
toLowerCase(): string;
|
||||
|
||||
/** Converts all the alphabetic characters in a string to uppercase. */
|
||||
toUpperCase(): string;
|
||||
* Determines whether relative order of two strings (in ASCII encoding).
|
||||
* @param that String to compare to target string
|
||||
*/
|
||||
//% shim=String_::compare
|
||||
compare(that: string): number;
|
||||
|
||||
/** Returns the length of a String object. */
|
||||
//% shim=string::count
|
||||
//% property shim=String_::length
|
||||
length: number;
|
||||
|
||||
//% shim=string::at
|
||||
[index: number]: string;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Converts A string to an integer.
|
||||
* @param s A string to convert into a number.
|
||||
*/
|
||||
//% shim=string::to_number
|
||||
//% shim=String_::toNumber
|
||||
declare function parseInt(s: string): number;
|
||||
|
||||
interface Object {}
|
||||
@ -163,74 +126,56 @@ interface Function {}
|
||||
interface IArguments {}
|
||||
interface RegExp {}
|
||||
|
||||
interface Boolean {
|
||||
|
||||
declare interface Boolean {
|
||||
/**
|
||||
* Returns a string representation of an object.
|
||||
*/
|
||||
//% shim=boolean::to_string
|
||||
* Returns a string representation of an object.
|
||||
*/
|
||||
//% shim=Boolean_::toString
|
||||
toString(): string;
|
||||
}
|
||||
|
||||
declare namespace String {
|
||||
|
||||
/**
|
||||
* Make a string from the given ASCII character code.
|
||||
*/
|
||||
//% shim=number::to_character
|
||||
export function fromCharCode(code:number): string;
|
||||
* Make a string from the given ASCII character code.
|
||||
*/
|
||||
//% shim=String_::fromCharCode
|
||||
function fromCharCode(code: number): string;
|
||||
}
|
||||
|
||||
interface Number {
|
||||
|
||||
declare interface Number {
|
||||
/**
|
||||
* Returns a string representation of an object.
|
||||
*/
|
||||
//% shim=number::to_string
|
||||
* Returns a string representation of a number.
|
||||
*/
|
||||
//% shim=Number_::toString
|
||||
toString(): string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Numbers and arithmetic operators
|
||||
*/
|
||||
declare namespace Math {
|
||||
|
||||
/**
|
||||
* Returns the absolute value of a number (the value without regard to whether it is positive or negative).
|
||||
* For example, the absolute value of -5 is the same as the absolute value of 5.
|
||||
* @param x A numeric expression for which the absolute value is needed.
|
||||
*/
|
||||
//% shim=math::abs
|
||||
export function abs(x: number): number;
|
||||
|
||||
* Returns the value of a base expression taken to a specified power.
|
||||
* @param x The base value of the expression.
|
||||
* @param y The exponent value of the expression.
|
||||
*/
|
||||
//% shim=Math_::pow
|
||||
function pow(x: number, y: number): number;
|
||||
|
||||
/**
|
||||
* Returns a pseudorandom number between 0 and `max`.
|
||||
*/
|
||||
//% shim=Math_::random
|
||||
function random(max: number): number;
|
||||
|
||||
/**
|
||||
* Returns the sign of the x, indicating whether x is positive, negative or zero.
|
||||
* @param x The numeric expression to test
|
||||
*/
|
||||
//% shim=math::sign
|
||||
export function sign(x: number): number;
|
||||
|
||||
/**
|
||||
* Returns the larger of two supplied numeric expressions.
|
||||
*/
|
||||
//% shim=math::max
|
||||
export function max(a:number, b:number): number;
|
||||
|
||||
/**
|
||||
* Returns the smaller of two supplied numeric expressions.
|
||||
*/
|
||||
//% shim=math::min
|
||||
export function min(a:number, b:number): number;
|
||||
|
||||
/**
|
||||
* Returns the value of a base expression taken to a specified power.
|
||||
* @param x The base value of the expression.
|
||||
* @param y The exponent value of the expression.
|
||||
*/
|
||||
//% shim=math::pow
|
||||
export function pow(x: number, y: number): number;
|
||||
|
||||
/** Returns a pseudorandom number between 0 and `max`. */
|
||||
//% shim=math::random
|
||||
export function random(max:number): number;
|
||||
|
||||
/**
|
||||
* Returns the square root of a number.
|
||||
* @param x A numeric expression.
|
||||
*/
|
||||
//% shim=math::sqrt
|
||||
export function sqrt(x: number): number;
|
||||
* Returns the square root of a number.
|
||||
* @param x A numeric expression.
|
||||
*/
|
||||
//% shim=Math_::sqrt
|
||||
function sqrt(x: number): number;
|
||||
}
|
||||
|
378
libs/microbit/dal.d.ts
vendored
Normal file
378
libs/microbit/dal.d.ts
vendored
Normal file
@ -0,0 +1,378 @@
|
||||
// Auto-generated. Do not edit.
|
||||
declare const enum DAL {
|
||||
// DynamicPwm.h
|
||||
NO_PWMS = 3,
|
||||
MICROBIT_DEFAULT_PWM_PERIOD = 20000,
|
||||
PWM_PERSISTENCE_TRANSIENT = 1,
|
||||
PWM_PERSISTENCE_PERSISTENT = 2,
|
||||
// ErrorNo.h
|
||||
MICROBIT_OK = 0,
|
||||
MICROBIT_INVALID_PARAMETER = -1001,
|
||||
MICROBIT_NOT_SUPPORTED = -1002,
|
||||
MICROBIT_CALIBRATION_IN_PROGRESS = -1003,
|
||||
MICROBIT_CALIBRATION_REQUIRED = -1004,
|
||||
MICROBIT_NO_RESOURCES = -1005,
|
||||
MICROBIT_BUSY = -1006,
|
||||
MICROBIT_CANCELLED = -1007,
|
||||
MICROBIT_I2C_ERROR = -1010,
|
||||
MICROBIT_OOM = 20,
|
||||
MICROBIT_HEAP_ERROR = 30,
|
||||
MICROBIT_NULL_DEREFERENCE = 40,
|
||||
// ExternalEvents.h
|
||||
MICROBIT_ID_BLE = 1000,
|
||||
// MESEvents.h
|
||||
MES_REMOTE_CONTROL_ID = 1001,
|
||||
MES_REMOTE_CONTROL_EVT_PLAY = 1,
|
||||
MES_REMOTE_CONTROL_EVT_PAUSE = 2,
|
||||
MES_REMOTE_CONTROL_EVT_STOP = 3,
|
||||
MES_REMOTE_CONTROL_EVT_NEXTTRACK = 4,
|
||||
MES_REMOTE_CONTROL_EVT_PREVTRACK = 5,
|
||||
MES_REMOTE_CONTROL_EVT_FORWARD = 6,
|
||||
MES_REMOTE_CONTROL_EVT_REWIND = 7,
|
||||
MES_REMOTE_CONTROL_EVT_VOLUMEUP = 8,
|
||||
MES_REMOTE_CONTROL_EVT_VOLUMEDOWN = 9,
|
||||
MES_CAMERA_ID = 1002,
|
||||
MES_CAMERA_EVT_LAUNCH_PHOTO_MODE = 1,
|
||||
MES_CAMERA_EVT_LAUNCH_VIDEO_MODE = 2,
|
||||
MES_CAMERA_EVT_TAKE_PHOTO = 3,
|
||||
MES_CAMERA_EVT_START_VIDEO_CAPTURE = 4,
|
||||
MES_CAMERA_EVT_STOP_VIDEO_CAPTURE = 5,
|
||||
MES_CAMERA_EVT_STOP_PHOTO_MODE = 6,
|
||||
MES_CAMERA_EVT_STOP_VIDEO_MODE = 7,
|
||||
MES_CAMERA_EVT_TOGGLE_FRONT_REAR = 8,
|
||||
MES_ALERTS_ID = 1004,
|
||||
MES_ALERT_EVT_DISPLAY_TOAST = 1,
|
||||
MES_ALERT_EVT_VIBRATE = 2,
|
||||
MES_ALERT_EVT_PLAY_SOUND = 3,
|
||||
MES_ALERT_EVT_PLAY_RINGTONE = 4,
|
||||
MES_ALERT_EVT_FIND_MY_PHONE = 5,
|
||||
MES_ALERT_EVT_ALARM1 = 6,
|
||||
MES_ALERT_EVT_ALARM2 = 7,
|
||||
MES_ALERT_EVT_ALARM3 = 8,
|
||||
MES_ALERT_EVT_ALARM4 = 9,
|
||||
MES_ALERT_EVT_ALARM5 = 10,
|
||||
MES_ALERT_EVT_ALARM6 = 11,
|
||||
MES_SIGNAL_STRENGTH_ID = 1101,
|
||||
MES_SIGNAL_STRENGTH_EVT_NO_BAR = 1,
|
||||
MES_SIGNAL_STRENGTH_EVT_ONE_BAR = 2,
|
||||
MES_SIGNAL_STRENGTH_EVT_TWO_BAR = 3,
|
||||
MES_SIGNAL_STRENGTH_EVT_THREE_BAR = 4,
|
||||
MES_SIGNAL_STRENGTH_EVT_FOUR_BAR = 5,
|
||||
MES_DEVICE_INFO_ID = 1103,
|
||||
MES_DEVICE_ORIENTATION_LANDSCAPE = 1,
|
||||
MES_DEVICE_ORIENTATION_PORTRAIT = 2,
|
||||
MES_DEVICE_GESTURE_NONE = 3,
|
||||
MES_DEVICE_GESTURE_DEVICE_SHAKEN = 4,
|
||||
MES_DEVICE_DISPLAY_OFF = 5,
|
||||
MES_DEVICE_DISPLAY_ON = 6,
|
||||
MES_DEVICE_INCOMING_CALL = 7,
|
||||
MES_DEVICE_INCOMING_MESSAGE = 8,
|
||||
MES_DPAD_CONTROLLER_ID = 1104,
|
||||
MES_DPAD_BUTTON_A_DOWN = 1,
|
||||
MES_DPAD_BUTTON_A_UP = 2,
|
||||
MES_DPAD_BUTTON_B_DOWN = 3,
|
||||
MES_DPAD_BUTTON_B_UP = 4,
|
||||
MES_DPAD_BUTTON_C_DOWN = 5,
|
||||
MES_DPAD_BUTTON_C_UP = 6,
|
||||
MES_DPAD_BUTTON_D_DOWN = 7,
|
||||
MES_DPAD_BUTTON_D_UP = 8,
|
||||
MES_DPAD_BUTTON_1_DOWN = 9,
|
||||
MES_DPAD_BUTTON_1_UP = 10,
|
||||
MES_DPAD_BUTTON_2_DOWN = 11,
|
||||
MES_DPAD_BUTTON_2_UP = 12,
|
||||
MES_DPAD_BUTTON_3_DOWN = 13,
|
||||
MES_DPAD_BUTTON_3_UP = 14,
|
||||
MES_DPAD_BUTTON_4_DOWN = 15,
|
||||
MES_DPAD_BUTTON_4_UP = 16,
|
||||
MES_BROADCAST_GENERAL_ID = 2000,
|
||||
// ManagedString.h
|
||||
// ManagedType.h
|
||||
// Matrix4.h
|
||||
// MemberFunctionCallback.h
|
||||
// MicroBit.h
|
||||
MICROBIT_FLAG_SCHEDULER_RUNNING = 0x00000001,
|
||||
MICROBIT_FLAG_ACCELEROMETER_RUNNING = 0x00000002,
|
||||
MICROBIT_FLAG_DISPLAY_RUNNING = 0x00000004,
|
||||
MICROBIT_FLAG_COMPASS_RUNNING = 0x00000008,
|
||||
MICROBIT_NAME_LENGTH = 5,
|
||||
MICROBIT_NAME_CODE_LETTERS = 5,
|
||||
NRF51822_RNG_ADDRESS = 0x4000D000,
|
||||
// MicroBitAccelerometer.h
|
||||
MICROBIT_ACCEL_PITCH_ROLL_VALID = 0x01,
|
||||
MMA8653_DEFAULT_ADDR = 0x3A,
|
||||
MMA8653_STATUS = 0x00,
|
||||
MMA8653_OUT_X_MSB = 0x01,
|
||||
MMA8653_WHOAMI = 0x0D,
|
||||
MMA8653_XYZ_DATA_CFG = 0x0E,
|
||||
MMA8653_CTRL_REG1 = 0x2A,
|
||||
MMA8653_CTRL_REG2 = 0x2B,
|
||||
MMA8653_CTRL_REG3 = 0x2C,
|
||||
MMA8653_CTRL_REG4 = 0x2D,
|
||||
MMA8653_CTRL_REG5 = 0x2E,
|
||||
MMA8653_WHOAMI_VAL = 0x5A,
|
||||
MMA8653_SAMPLE_RANGES = 3,
|
||||
MMA8653_SAMPLE_RATES = 8,
|
||||
MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE = 1,
|
||||
MICROBIT_ACCELEROMETER_EVT_TILT_UP = 1,
|
||||
MICROBIT_ACCELEROMETER_EVT_TILT_DOWN = 2,
|
||||
MICROBIT_ACCELEROMETER_EVT_TILT_LEFT = 3,
|
||||
MICROBIT_ACCELEROMETER_EVT_TILT_RIGHT = 4,
|
||||
MICROBIT_ACCELEROMETER_EVT_FACE_UP = 5,
|
||||
MICROBIT_ACCELEROMETER_EVT_FACE_DOWN = 6,
|
||||
MICROBIT_ACCELEROMETER_EVT_FREEFALL = 7,
|
||||
MICROBIT_ACCELEROMETER_EVT_3G = 8,
|
||||
MICROBIT_ACCELEROMETER_EVT_6G = 9,
|
||||
MICROBIT_ACCELEROMETER_EVT_8G = 10,
|
||||
MICROBIT_ACCELEROMETER_EVT_SHAKE = 11,
|
||||
MICROBIT_ACCELEROMETER_REST_TOLERANCE = 200,
|
||||
MICROBIT_ACCELEROMETER_TILT_TOLERANCE = 200,
|
||||
MICROBIT_ACCELEROMETER_FREEFALL_TOLERANCE = 400,
|
||||
MICROBIT_ACCELEROMETER_SHAKE_TOLERANCE = 1000,
|
||||
MICROBIT_ACCELEROMETER_3G_TOLERANCE = 3072,
|
||||
MICROBIT_ACCELEROMETER_6G_TOLERANCE = 6144,
|
||||
MICROBIT_ACCELEROMETER_8G_TOLERANCE = 8192,
|
||||
MICROBIT_ACCELEROMETER_GESTURE_DAMPING = 10,
|
||||
MICROBIT_ACCELEROMETER_SHAKE_DAMPING = 10,
|
||||
MICROBIT_ACCELEROMETER_SHAKE_COUNT_THRESHOLD = 4,
|
||||
GESTURE_NONE = 0,
|
||||
GESTURE_UP = 1,
|
||||
GESTURE_DOWN = 2,
|
||||
GESTURE_LEFT = 3,
|
||||
GESTURE_RIGHT = 4,
|
||||
GESTURE_FACE_UP = 5,
|
||||
GESTURE_FACE_DOWN = 6,
|
||||
GESTURE_FREEFALL = 7,
|
||||
GESTURE_3G = 8,
|
||||
GESTURE_6G = 9,
|
||||
GESTURE_8G = 10,
|
||||
GESTURE_SHAKE = 11,
|
||||
// MicroBitAccelerometerService.h
|
||||
// MicroBitBLEManager.h
|
||||
MICROBIT_BLE_PAIR_REQUEST = 0x01,
|
||||
MICROBIT_BLE_PAIR_COMPLETE = 0x02,
|
||||
MICROBIT_BLE_PAIR_PASSCODE = 0x04,
|
||||
MICROBIT_BLE_PAIR_SUCCESSFUL = 0x08,
|
||||
MICROBIT_BLE_PAIRING_TIMEOUT = 90,
|
||||
MICROBIT_BLE_POWER_LEVELS = 8,
|
||||
MICROBIT_BLE_MAXIMUM_BONDS = 4,
|
||||
// MicroBitButton.h
|
||||
MICROBIT_BUTTON_EVT_DOWN = 1,
|
||||
MICROBIT_BUTTON_EVT_UP = 2,
|
||||
MICROBIT_BUTTON_EVT_CLICK = 3,
|
||||
MICROBIT_BUTTON_EVT_LONG_CLICK = 4,
|
||||
MICROBIT_BUTTON_EVT_HOLD = 5,
|
||||
MICROBIT_BUTTON_EVT_DOUBLE_CLICK = 6,
|
||||
MICROBIT_BUTTON_LONG_CLICK_TIME = 1000,
|
||||
MICROBIT_BUTTON_HOLD_TIME = 1500,
|
||||
MICROBIT_BUTTON_STATE = 1,
|
||||
MICROBIT_BUTTON_STATE_HOLD_TRIGGERED = 2,
|
||||
MICROBIT_BUTTON_STATE_CLICK = 4,
|
||||
MICROBIT_BUTTON_STATE_LONG_CLICK = 8,
|
||||
MICROBIT_BUTTON_SIGMA_MIN = 0,
|
||||
MICROBIT_BUTTON_SIGMA_MAX = 12,
|
||||
MICROBIT_BUTTON_SIGMA_THRESH_HI = 8,
|
||||
MICROBIT_BUTTON_SIGMA_THRESH_LO = 2,
|
||||
MICROBIT_BUTTON_DOUBLE_CLICK_THRESH = 50,
|
||||
MICROBIT_BUTTON_SIMPLE_EVENTS = 0,
|
||||
MICROBIT_BUTTON_ALL_EVENTS = 1,
|
||||
// MicroBitButtonService.h
|
||||
// MicroBitCompass.h
|
||||
MAG3110_DEFAULT_ADDR = 0x1D,
|
||||
MAG_DR_STATUS = 0x00,
|
||||
MAG_OUT_X_MSB = 0x01,
|
||||
MAG_OUT_X_LSB = 0x02,
|
||||
MAG_OUT_Y_MSB = 0x03,
|
||||
MAG_OUT_Y_LSB = 0x04,
|
||||
MAG_OUT_Z_MSB = 0x05,
|
||||
MAG_OUT_Z_LSB = 0x06,
|
||||
MAG_WHOAMI = 0x07,
|
||||
MAG_SYSMOD = 0x08,
|
||||
MAG_OFF_X_MSB = 0x09,
|
||||
MAG_OFF_X_LSB = 0x0A,
|
||||
MAG_OFF_Y_MSB = 0x0B,
|
||||
MAG_OFF_Y_LSB = 0x0C,
|
||||
MAG_OFF_Z_MSB = 0x0D,
|
||||
MAG_OFF_Z_LSB = 0x0E,
|
||||
MAG_DIE_TEMP = 0x0F,
|
||||
MAG_CTRL_REG1 = 0x10,
|
||||
MAG_CTRL_REG2 = 0x11,
|
||||
MAG3110_SAMPLE_RATES = 11,
|
||||
MICROBIT_COMPASS_EVT_CAL_REQUIRED = 1,
|
||||
MICROBIT_COMPASS_EVT_CAL_START = 2,
|
||||
MICROBIT_COMPASS_EVT_CAL_END = 3,
|
||||
MICROBIT_COMPASS_EVT_DATA_UPDATE = 4,
|
||||
MICROBIT_COMPASS_EVT_CONFIG_NEEDED = 5,
|
||||
MICROBIT_COMPASS_EVT_CALIBRATE = 6,
|
||||
MICROBIT_COMPASS_STATUS_CALIBRATED = 1,
|
||||
MICROBIT_COMPASS_STATUS_CALIBRATING = 2,
|
||||
MAG3110_WHOAMI_VAL = 0xC4,
|
||||
// MicroBitCompat.h
|
||||
// MicroBitComponent.h
|
||||
MICROBIT_ID_BUTTON_A = 1,
|
||||
MICROBIT_ID_BUTTON_B = 2,
|
||||
MICROBIT_ID_BUTTON_RESET = 3,
|
||||
MICROBIT_ID_ACCELEROMETER = 4,
|
||||
MICROBIT_ID_COMPASS = 5,
|
||||
MICROBIT_ID_DISPLAY = 6,
|
||||
MICROBIT_IO_PINS = 20,
|
||||
MICROBIT_ID_IO_P0 = 7,
|
||||
MICROBIT_ID_IO_P1 = 8,
|
||||
MICROBIT_ID_IO_P2 = 9,
|
||||
MICROBIT_ID_IO_P3 = 10,
|
||||
MICROBIT_ID_IO_P4 = 11,
|
||||
MICROBIT_ID_IO_P5 = 12,
|
||||
MICROBIT_ID_IO_P6 = 13,
|
||||
MICROBIT_ID_IO_P7 = 14,
|
||||
MICROBIT_ID_IO_P8 = 15,
|
||||
MICROBIT_ID_IO_P9 = 16,
|
||||
MICROBIT_ID_IO_P10 = 17,
|
||||
MICROBIT_ID_IO_P11 = 18,
|
||||
MICROBIT_ID_IO_P12 = 19,
|
||||
MICROBIT_ID_IO_P13 = 20,
|
||||
MICROBIT_ID_IO_P14 = 21,
|
||||
MICROBIT_ID_IO_P15 = 22,
|
||||
MICROBIT_ID_IO_P16 = 23,
|
||||
MICROBIT_ID_IO_P19 = 24,
|
||||
MICROBIT_ID_IO_P20 = 25,
|
||||
MICROBIT_ID_BUTTON_AB = 26,
|
||||
MICROBIT_ID_GESTURE = 27,
|
||||
MICROBIT_ID_THERMOMETER = 28,
|
||||
MICROBIT_ID_RADIO = 29,
|
||||
MICROBIT_ID_RADIO_DATA_READY = 30,
|
||||
MICROBIT_ID_MULTIBUTTON_ATTACH = 31,
|
||||
MICROBIT_ID_MESSAGE_BUS_LISTENER = 1021,
|
||||
MICROBIT_ID_NOTIFY_ONE = 1022,
|
||||
MICROBIT_ID_NOTIFY = 1023,
|
||||
// MicroBitCoordinateSystem.h
|
||||
RAW = 0,
|
||||
SIMPLE_CARTESIAN = 1,
|
||||
NORTH_EAST_DOWN = 2,
|
||||
// MicroBitDFUService.h
|
||||
MICROBIT_DFU_OPCODE_START_DFU = 1,
|
||||
MICROBIT_DFU_OPCODE_START_PAIR = 2,
|
||||
MICROBIT_DFU_HISTOGRAM_WIDTH = 5,
|
||||
MICROBIT_DFU_HISTOGRAM_HEIGHT = 5,
|
||||
// MicroBitDisplay.h
|
||||
MICROBIT_DISPLAY_EVT_ANIMATION_COMPLETE = 1,
|
||||
MICROBIT_DISPLAY_EVT_FREE = 2,
|
||||
MICROBIT_DISPLAY_EVT_LIGHT_SENSE = 4,
|
||||
MICROBIT_DISPLAY_WIDTH = 5,
|
||||
MICROBIT_DISPLAY_HEIGHT = 5,
|
||||
MICROBIT_DISPLAY_SPACING = 1,
|
||||
MICROBIT_DISPLAY_ERROR_CHARS = 4,
|
||||
MICROBIT_DISPLAY_GREYSCALE_BIT_DEPTH = 8,
|
||||
MICROBIT_DISPLAY_ANIMATE_DEFAULT_POS = -255,
|
||||
MICROBIT_DISPLAY_ROW_RESET = 0x20,
|
||||
ANIMATION_MODE_NONE = 0,
|
||||
ANIMATION_MODE_STOPPED = 1,
|
||||
ANIMATION_MODE_SCROLL_TEXT = 2,
|
||||
ANIMATION_MODE_PRINT_TEXT = 3,
|
||||
ANIMATION_MODE_SCROLL_IMAGE = 4,
|
||||
ANIMATION_MODE_ANIMATE_IMAGE = 5,
|
||||
ANIMATION_MODE_PRINT_CHARACTER = 6,
|
||||
DISPLAY_MODE_BLACK_AND_WHITE = 0,
|
||||
DISPLAY_MODE_GREYSCALE = 1,
|
||||
DISPLAY_MODE_BLACK_AND_WHITE_LIGHT_SENSE = 2,
|
||||
MICROBIT_DISPLAY_ROTATION_0 = 0,
|
||||
MICROBIT_DISPLAY_ROTATION_90 = 1,
|
||||
MICROBIT_DISPLAY_ROTATION_180 = 2,
|
||||
MICROBIT_DISPLAY_ROTATION_270 = 3,
|
||||
// MicroBitEvent.h
|
||||
CREATE_ONLY = 0,
|
||||
CREATE_AND_QUEUE = 1,
|
||||
CREATE_AND_FIRE = 2,
|
||||
// MicroBitEventService.h
|
||||
// MicroBitFiber.h
|
||||
MICROBIT_FLAG_DATA_READY = 0x01,
|
||||
MICROBIT_FIBER_FLAG_FOB = 0x01,
|
||||
MICROBIT_FIBER_FLAG_PARENT = 0x02,
|
||||
MICROBIT_FIBER_FLAG_CHILD = 0x04,
|
||||
MICROBIT_FIBER_FLAG_DO_NOT_PAGE = 0x08,
|
||||
// MicroBitFont.h
|
||||
MICROBIT_FONT_WIDTH = 5,
|
||||
MICROBIT_FONT_HEIGHT = 5,
|
||||
MICROBIT_FONT_ASCII_START = 32,
|
||||
MICROBIT_FONT_ASCII_END = 126,
|
||||
// MicroBitHeapAllocator.h
|
||||
MICROBIT_HEAP_COUNT = 2,
|
||||
MICROBIT_HEAP_BLOCK_FREE = 0x80000000,
|
||||
// MicroBitI2C.h
|
||||
MICROBIT_I2C_MAX_RETRIES = 9,
|
||||
// MicroBitIO.h
|
||||
// MicroBitIOPinService.h
|
||||
MICROBIT_IO_PIN_SERVICE_PINCOUNT = 20,
|
||||
MICROBIT_IO_PIN_SERVICE_DATA_SIZE = 10,
|
||||
// MicroBitImage.h
|
||||
// MicroBitLEDService.h
|
||||
// MicroBitLightSensor.h
|
||||
MICROBIT_LIGHT_SENSOR_CHAN_NUM = 3,
|
||||
MICROBIT_LIGHT_SENSOR_AN_SET_TIME = 4000,
|
||||
MICROBIT_LIGHT_SENSOR_TICK_PERIOD = 5,
|
||||
MICROBIT_LIGHT_SENSOR_MAX_VALUE = 338,
|
||||
MICROBIT_LIGHT_SENSOR_MIN_VALUE = 75,
|
||||
// MicroBitListener.h
|
||||
MESSAGE_BUS_LISTENER_PARAMETERISED = 0x0001,
|
||||
MESSAGE_BUS_LISTENER_METHOD = 0x0002,
|
||||
MESSAGE_BUS_LISTENER_BUSY = 0x0004,
|
||||
MESSAGE_BUS_LISTENER_REENTRANT = 0x0008,
|
||||
MESSAGE_BUS_LISTENER_QUEUE_IF_BUSY = 0x0010,
|
||||
MESSAGE_BUS_LISTENER_DROP_IF_BUSY = 0x0020,
|
||||
MESSAGE_BUS_LISTENER_NONBLOCKING = 0x0040,
|
||||
MESSAGE_BUS_LISTENER_URGENT = 0x0080,
|
||||
MESSAGE_BUS_LISTENER_DELETING = 0x8000,
|
||||
// MicroBitMagnetometerService.h
|
||||
// MicroBitMatrixMaps.h
|
||||
NO_CONN = 0,
|
||||
// MicroBitMessageBus.h
|
||||
MICROBIT_CONTROL_BUS_ID = 0,
|
||||
MICROBIT_ID_ANY = 0,
|
||||
MICROBIT_EVT_ANY = 0,
|
||||
// MicroBitMultiButton.h
|
||||
MICROBIT_MULTI_BUTTON_STATE_1 = 0x01,
|
||||
MICROBIT_MULTI_BUTTON_STATE_2 = 0x02,
|
||||
MICROBIT_MULTI_BUTTON_HOLD_TRIGGERED_1 = 0x04,
|
||||
MICROBIT_MULTI_BUTTON_HOLD_TRIGGERED_2 = 0x08,
|
||||
MICROBIT_MULTI_BUTTON_SUPRESSED_1 = 0X10,
|
||||
MICROBIT_MULTI_BUTTON_SUPRESSED_2 = 0x20,
|
||||
MICROBIT_MULTI_BUTTON_ATTACHED = 0x40,
|
||||
// MicroBitPanic.h
|
||||
// MicroBitPin.h
|
||||
IO_STATUS_DIGITAL_IN = 0x01,
|
||||
IO_STATUS_DIGITAL_OUT = 0x02,
|
||||
IO_STATUS_ANALOG_IN = 0x04,
|
||||
IO_STATUS_ANALOG_OUT = 0x08,
|
||||
IO_STATUS_TOUCH_IN = 0x10,
|
||||
IO_STATUS_EVENTBUS_ENABLED = 0x80,
|
||||
MICROBIT_PIN_MAX_OUTPUT = 1023,
|
||||
MICROBIT_PIN_MAX_SERVO_RANGE = 180,
|
||||
MICROBIT_PIN_DEFAULT_SERVO_RANGE = 2000,
|
||||
MICROBIT_PIN_DEFAULT_SERVO_CENTER = 1500,
|
||||
PIN_CAPABILITY_DIGITAL = 0x01,
|
||||
PIN_CAPABILITY_ANALOG = 0x02,
|
||||
PIN_CAPABILITY_TOUCH = 0x04,
|
||||
// MicroBitRadio.h
|
||||
MICROBIT_RADIO_STATUS_INITIALISED = 0x0001,
|
||||
MICROBIT_RADIO_BASE_ADDRESS = 0x75626974,
|
||||
MICROBIT_RADIO_DEFAULT_GROUP = 0,
|
||||
MICROBIT_RADIO_DEFAULT_TX_POWER = 6,
|
||||
MICROBIT_RADIO_DEFAULT_FREQUENCY = 7,
|
||||
MICROBIT_RADIO_MAX_PACKET_SIZE = 32,
|
||||
MICROBIT_RADIO_HEADER_SIZE = 4,
|
||||
MICROBIT_RADIO_MAXIMUM_RX_BUFFERS = 4,
|
||||
MICROBIT_RADIO_PROTOCOL_DATAGRAM = 1,
|
||||
MICROBIT_RADIO_PROTOCOL_EVENTBUS = 2,
|
||||
MICROBIT_RADIO_EVT_DATAGRAM = 1,
|
||||
// MicroBitRadioDatagram.h
|
||||
// MicroBitRadioEvent.h
|
||||
// MicroBitSerial.h
|
||||
MICROBIT_SERIAL_DEFAULT_BAUD_RATE = 115200,
|
||||
MICROBIT_SERIAL_BUFFER_SIZE = 20,
|
||||
// MicroBitStorage.h
|
||||
MICROBIT_STORAGE_CONFIG_MAGIC = 0xCAFECAFE,
|
||||
// MicroBitTemperatureService.h
|
||||
// MicroBitThermometer.h
|
||||
MICROBIT_THERMOMETER_PERIOD = 1000,
|
||||
MICROBIT_THERMOMETER_EVT_UPDATE = 1,
|
||||
// PacketBuffer.h
|
||||
// RefCounted.h
|
||||
}
|
289
libs/microbit/enums.d.ts
vendored
Normal file
289
libs/microbit/enums.d.ts
vendored
Normal file
@ -0,0 +1,289 @@
|
||||
// Auto-generated. Do not edit.
|
||||
declare namespace images {
|
||||
}
|
||||
declare namespace basic {
|
||||
}
|
||||
|
||||
|
||||
declare enum Button {
|
||||
A = 1, // MICROBIT_ID_BUTTON_A
|
||||
B = 2, // MICROBIT_ID_BUTTON_B
|
||||
//% block="A+B"
|
||||
AB = 26, // MICROBIT_ID_BUTTON_AB
|
||||
}
|
||||
|
||||
|
||||
declare enum Dimension {
|
||||
//% block=x
|
||||
X = 0,
|
||||
//% block=y
|
||||
Y = 1,
|
||||
//% block=z
|
||||
Z = 2,
|
||||
//% block=strength
|
||||
Strength = 3,
|
||||
}
|
||||
|
||||
|
||||
declare enum Rotation {
|
||||
//% block=pitch
|
||||
Pitch = 0,
|
||||
//% block=roll
|
||||
Roll = 1,
|
||||
}
|
||||
|
||||
|
||||
declare enum TouchPin {
|
||||
P0 = 7, // MICROBIT_ID_IO_P0
|
||||
P1 = 8, // MICROBIT_ID_IO_P1
|
||||
P2 = 9, // MICROBIT_ID_IO_P2
|
||||
}
|
||||
|
||||
|
||||
declare enum AcceleratorRange {
|
||||
/**
|
||||
* The accelerator measures forces up to 1 gravity
|
||||
*/
|
||||
//% block="1g"
|
||||
OneG = 1,
|
||||
/**
|
||||
* The accelerator measures forces up to 2 gravity
|
||||
*/
|
||||
//% block="2g"
|
||||
TwoG = 2,
|
||||
/**
|
||||
* The accelerator measures forces up to 4 gravity
|
||||
*/
|
||||
//% block="4g"
|
||||
FourG = 4,
|
||||
/**
|
||||
* The accelerator measures forces up to 8 gravity
|
||||
*/
|
||||
//% block="8g"
|
||||
EightG = 8,
|
||||
}
|
||||
|
||||
|
||||
declare enum Gesture {
|
||||
/**
|
||||
* Raised when shaken
|
||||
*/
|
||||
//% block=shake
|
||||
Shake = 11, // GESTURE_SHAKE
|
||||
/**
|
||||
* Raised when the logo is upward and the screen is vertical
|
||||
*/
|
||||
//% block="logo up"
|
||||
LogoUp = 1, // GESTURE_UP
|
||||
/**
|
||||
* Raised when the logo is downward and the screen is vertical
|
||||
*/
|
||||
//% block="logo down"
|
||||
LogoDown = 2, // GESTURE_DOWN
|
||||
/**
|
||||
* Raised when the screen is pointing down and the board is horizontal
|
||||
*/
|
||||
//% block="screen up"
|
||||
ScreenUp = 5, // GESTURE_FACE_UP
|
||||
/**
|
||||
* Raised when the screen is pointing up and the board is horizontal
|
||||
*/
|
||||
//% block="screen down"
|
||||
ScreenDown = 6, // GESTURE_FACE_DOWN
|
||||
/**
|
||||
* Raised when the screen is pointing left
|
||||
*/
|
||||
//% block="tilt left"
|
||||
TiltLeft = 3, // GESTURE_LEFT
|
||||
/**
|
||||
* Raised when the screen is pointing right
|
||||
*/
|
||||
//% block="tilt right"
|
||||
TiltRight = 4, // GESTURE_RIGHT
|
||||
/**
|
||||
* Raised when the board is falling!
|
||||
*/
|
||||
//% block="free fall"
|
||||
FreeFall = 7, // GESTURE_FREEFALL
|
||||
}
|
||||
declare namespace input {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* How to create the event.
|
||||
*/
|
||||
|
||||
declare enum EventCreationMode {
|
||||
/**
|
||||
* MicroBitEvent is initialised, and no further processing takes place.
|
||||
*/
|
||||
CreateOnly = 0, // CREATE_ONLY
|
||||
/**
|
||||
* MicroBitEvent is initialised, and queued on the MicroBitMessageBus.
|
||||
*/
|
||||
CreateAndQueue = 1, // CREATE_AND_QUEUE
|
||||
/**
|
||||
* MicroBitEvent is initialised, and its event handlers are immediately fired (not suitable for use in interrupts!).
|
||||
*/
|
||||
CreateAndFire = 2, // CREATE_AND_FIRE
|
||||
}
|
||||
|
||||
|
||||
declare enum EventBusSource {
|
||||
MICROBIT_ID_BUTTON_A = 1, // MICROBIT_ID_BUTTON_A
|
||||
MICROBIT_ID_BUTTON_B = 2, // MICROBIT_ID_BUTTON_B
|
||||
MICROBIT_ID_BUTTON_AB = 26, // MICROBIT_ID_BUTTON_AB
|
||||
MICROBIT_ID_RADIO = 29, // MICROBIT_ID_RADIO
|
||||
MICROBIT_ID_GESTURE = 27, // MICROBIT_ID_GESTURE
|
||||
MICROBIT_ID_ACCELEROMETER = 4, // MICROBIT_ID_ACCELEROMETER
|
||||
MICROBIT_ID_IO_P0 = 7, // MICROBIT_ID_IO_P0
|
||||
MICROBIT_ID_IO_P1 = 8, // MICROBIT_ID_IO_P1
|
||||
MICROBIT_ID_IO_P2 = 9, // MICROBIT_ID_IO_P2
|
||||
MICROBIT_ID_IO_P3 = 10, // MICROBIT_ID_IO_P3
|
||||
MICROBIT_ID_IO_P4 = 11, // MICROBIT_ID_IO_P4
|
||||
MICROBIT_ID_IO_P5 = 12, // MICROBIT_ID_IO_P5
|
||||
MICROBIT_ID_IO_P6 = 13, // MICROBIT_ID_IO_P6
|
||||
MICROBIT_ID_IO_P7 = 14, // MICROBIT_ID_IO_P7
|
||||
MICROBIT_ID_IO_P8 = 15, // MICROBIT_ID_IO_P8
|
||||
MICROBIT_ID_IO_P9 = 16, // MICROBIT_ID_IO_P9
|
||||
MICROBIT_ID_IO_P10 = 17, // MICROBIT_ID_IO_P10
|
||||
MICROBIT_ID_IO_P11 = 18, // MICROBIT_ID_IO_P11
|
||||
MICROBIT_ID_IO_P12 = 19, // MICROBIT_ID_IO_P12
|
||||
MICROBIT_ID_IO_P13 = 20, // MICROBIT_ID_IO_P13
|
||||
MICROBIT_ID_IO_P14 = 21, // MICROBIT_ID_IO_P14
|
||||
MICROBIT_ID_IO_P15 = 22, // MICROBIT_ID_IO_P15
|
||||
MICROBIT_ID_IO_P16 = 23, // MICROBIT_ID_IO_P16
|
||||
MICROBIT_ID_IO_P19 = 24, // MICROBIT_ID_IO_P19
|
||||
MICROBIT_ID_IO_P20 = 25, // MICROBIT_ID_IO_P20
|
||||
MES_DEVICE_INFO_ID = 1103, // MES_DEVICE_INFO_ID
|
||||
MES_SIGNAL_STRENGTH_ID = 1101, // MES_SIGNAL_STRENGTH_ID
|
||||
MES_DPAD_CONTROLLER_ID = 1104, // MES_DPAD_CONTROLLER_ID
|
||||
MES_BROADCAST_GENERAL_ID = 2000, // MES_BROADCAST_GENERAL_ID
|
||||
}
|
||||
|
||||
|
||||
declare enum EventBusValue {
|
||||
MICROBIT_EVT_ANY = 0, // MICROBIT_EVT_ANY
|
||||
MICROBIT_BUTTON_EVT_CLICK = 3, // MICROBIT_BUTTON_EVT_CLICK
|
||||
MICROBIT_RADIO_EVT_DATAGRAM = 1, // MICROBIT_RADIO_EVT_DATAGRAM
|
||||
MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE = 1, // MICROBIT_ACCELEROMETER_EVT_DATA_UPDATE
|
||||
MES_ALERT_EVT_ALARM1 = 6, // MES_ALERT_EVT_ALARM1
|
||||
MES_ALERT_EVT_ALARM2 = 7, // MES_ALERT_EVT_ALARM2
|
||||
MES_ALERT_EVT_ALARM3 = 8, // MES_ALERT_EVT_ALARM3
|
||||
MES_ALERT_EVT_ALARM4 = 9, // MES_ALERT_EVT_ALARM4
|
||||
MES_ALERT_EVT_ALARM5 = 10, // MES_ALERT_EVT_ALARM5
|
||||
MES_ALERT_EVT_ALARM6 = 11, // MES_ALERT_EVT_ALARM6
|
||||
MES_ALERT_EVT_DISPLAY_TOAST = 1, // MES_ALERT_EVT_DISPLAY_TOAST
|
||||
MES_ALERT_EVT_FIND_MY_PHONE = 5, // MES_ALERT_EVT_FIND_MY_PHONE
|
||||
MES_ALERT_EVT_PLAY_RINGTONE = 4, // MES_ALERT_EVT_PLAY_RINGTONE
|
||||
MES_ALERT_EVT_PLAY_SOUND = 3, // MES_ALERT_EVT_PLAY_SOUND
|
||||
MES_ALERT_EVT_VIBRATE = 2, // MES_ALERT_EVT_VIBRATE
|
||||
MES_CAMERA_EVT_LAUNCH_PHOTO_MODE = 1, // MES_CAMERA_EVT_LAUNCH_PHOTO_MODE
|
||||
MES_CAMERA_EVT_LAUNCH_VIDEO_MODE = 2, // MES_CAMERA_EVT_LAUNCH_VIDEO_MODE
|
||||
MES_CAMERA_EVT_START_VIDEO_CAPTURE = 4, // MES_CAMERA_EVT_START_VIDEO_CAPTURE
|
||||
MES_CAMERA_EVT_STOP_PHOTO_MODE = 6, // MES_CAMERA_EVT_STOP_PHOTO_MODE
|
||||
MES_CAMERA_EVT_STOP_VIDEO_CAPTURE = 5, // MES_CAMERA_EVT_STOP_VIDEO_CAPTURE
|
||||
MES_CAMERA_EVT_STOP_VIDEO_MODE = 7, // MES_CAMERA_EVT_STOP_VIDEO_MODE
|
||||
MES_CAMERA_EVT_TAKE_PHOTO = 3, // MES_CAMERA_EVT_TAKE_PHOTO
|
||||
MES_CAMERA_EVT_TOGGLE_FRONT_REAR = 8, // MES_CAMERA_EVT_TOGGLE_FRONT_REAR
|
||||
MES_DEVICE_DISPLAY_OFF = 5, // MES_DEVICE_DISPLAY_OFF
|
||||
MES_DEVICE_DISPLAY_ON = 6, // MES_DEVICE_DISPLAY_ON
|
||||
MES_DEVICE_GESTURE_DEVICE_SHAKEN = 4, // MES_DEVICE_GESTURE_DEVICE_SHAKEN
|
||||
MES_DEVICE_INCOMING_CALL = 7, // MES_DEVICE_INCOMING_CALL
|
||||
MES_DEVICE_INCOMING_MESSAGE = 8, // MES_DEVICE_INCOMING_MESSAGE
|
||||
MES_DEVICE_ORIENTATION_LANDSCAPE = 1, // MES_DEVICE_ORIENTATION_LANDSCAPE
|
||||
MES_DEVICE_ORIENTATION_PORTRAIT = 2, // MES_DEVICE_ORIENTATION_PORTRAIT
|
||||
MES_DPAD_BUTTON_1_DOWN = 9, // MES_DPAD_BUTTON_1_DOWN
|
||||
MES_DPAD_BUTTON_1_UP = 10, // MES_DPAD_BUTTON_1_UP
|
||||
MES_DPAD_BUTTON_2_DOWN = 11, // MES_DPAD_BUTTON_2_DOWN
|
||||
MES_DPAD_BUTTON_2_UP = 12, // MES_DPAD_BUTTON_2_UP
|
||||
MES_DPAD_BUTTON_3_DOWN = 13, // MES_DPAD_BUTTON_3_DOWN
|
||||
MES_DPAD_BUTTON_3_UP = 14, // MES_DPAD_BUTTON_3_UP
|
||||
MES_DPAD_BUTTON_4_DOWN = 15, // MES_DPAD_BUTTON_4_DOWN
|
||||
MES_DPAD_BUTTON_4_UP = 16, // MES_DPAD_BUTTON_4_UP
|
||||
MES_DPAD_BUTTON_A_DOWN = 1, // MES_DPAD_BUTTON_A_DOWN
|
||||
MES_DPAD_BUTTON_A_UP = 2, // MES_DPAD_BUTTON_A_UP
|
||||
MES_DPAD_BUTTON_B_DOWN = 3, // MES_DPAD_BUTTON_B_DOWN
|
||||
MES_DPAD_BUTTON_B_UP = 4, // MES_DPAD_BUTTON_B_UP
|
||||
MES_DPAD_BUTTON_C_DOWN = 5, // MES_DPAD_BUTTON_C_DOWN
|
||||
MES_DPAD_BUTTON_C_UP = 6, // MES_DPAD_BUTTON_C_UP
|
||||
MES_DPAD_BUTTON_D_DOWN = 7, // MES_DPAD_BUTTON_D_DOWN
|
||||
MES_DPAD_BUTTON_D_UP = 8, // MES_DPAD_BUTTON_D_UP
|
||||
MES_REMOTE_CONTROL_EVT_FORWARD = 6, // MES_REMOTE_CONTROL_EVT_FORWARD
|
||||
MES_REMOTE_CONTROL_EVT_NEXTTRACK = 4, // MES_REMOTE_CONTROL_EVT_NEXTTRACK
|
||||
MES_REMOTE_CONTROL_EVT_PAUSE = 2, // MES_REMOTE_CONTROL_EVT_PAUSE
|
||||
MES_REMOTE_CONTROL_EVT_PLAY = 1, // MES_REMOTE_CONTROL_EVT_PLAY
|
||||
MES_REMOTE_CONTROL_EVT_PREVTRACK = 5, // MES_REMOTE_CONTROL_EVT_PREVTRACK
|
||||
MES_REMOTE_CONTROL_EVT_REWIND = 7, // MES_REMOTE_CONTROL_EVT_REWIND
|
||||
MES_REMOTE_CONTROL_EVT_STOP = 3, // MES_REMOTE_CONTROL_EVT_STOP
|
||||
MES_REMOTE_CONTROL_EVT_VOLUMEDOWN = 9, // MES_REMOTE_CONTROL_EVT_VOLUMEDOWN
|
||||
MES_REMOTE_CONTROL_EVT_VOLUMEUP = 8, // MES_REMOTE_CONTROL_EVT_VOLUMEUP
|
||||
}
|
||||
declare namespace control {
|
||||
}
|
||||
|
||||
|
||||
declare enum DisplayMode {
|
||||
//% block="black and white"
|
||||
BackAndWhite = 0, // DISPLAY_MODE_BLACK_AND_WHITE
|
||||
//% block="greyscale"
|
||||
Greyscale = 1, // DISPLAY_MODE_GREYSCALE
|
||||
// TODO DISPLAY_MODE_BLACK_AND_WHITE_LIGHT_SENSE
|
||||
}
|
||||
declare namespace led {
|
||||
}
|
||||
|
||||
|
||||
declare enum DigitalPin {
|
||||
P0 = 7, // MICROBIT_ID_IO_P0
|
||||
P1 = 8, // MICROBIT_ID_IO_P1
|
||||
P2 = 9, // MICROBIT_ID_IO_P2
|
||||
P3 = 10, // MICROBIT_ID_IO_P3
|
||||
P4 = 11, // MICROBIT_ID_IO_P4
|
||||
P5 = 12, // MICROBIT_ID_IO_P5
|
||||
P6 = 13, // MICROBIT_ID_IO_P6
|
||||
P7 = 14, // MICROBIT_ID_IO_P7
|
||||
P8 = 15, // MICROBIT_ID_IO_P8
|
||||
P9 = 16, // MICROBIT_ID_IO_P9
|
||||
P10 = 17, // MICROBIT_ID_IO_P10
|
||||
P11 = 18, // MICROBIT_ID_IO_P11
|
||||
P12 = 19, // MICROBIT_ID_IO_P12
|
||||
P13 = 20, // MICROBIT_ID_IO_P13
|
||||
P14 = 21, // MICROBIT_ID_IO_P14
|
||||
P15 = 22, // MICROBIT_ID_IO_P15
|
||||
P16 = 23, // MICROBIT_ID_IO_P16
|
||||
P19 = 24, // MICROBIT_ID_IO_P19
|
||||
P20 = 25, // MICROBIT_ID_IO_P20
|
||||
}
|
||||
|
||||
|
||||
declare enum AnalogPin {
|
||||
P0 = 7, // MICROBIT_ID_IO_P0
|
||||
P1 = 8, // MICROBIT_ID_IO_P1
|
||||
P2 = 9, // MICROBIT_ID_IO_P2
|
||||
P3 = 10, // MICROBIT_ID_IO_P3
|
||||
P4 = 11, // MICROBIT_ID_IO_P4
|
||||
P10 = 17, // MICROBIT_ID_IO_P10
|
||||
}
|
||||
declare namespace pins {
|
||||
}
|
||||
declare namespace serial {
|
||||
}
|
||||
|
||||
|
||||
declare enum NumberFormat {
|
||||
Int8LE = 1,
|
||||
UInt8LE = 2,
|
||||
Int16LE = 3,
|
||||
UInt16LE = 4,
|
||||
Int32LE = 5,
|
||||
Int8BE = 6,
|
||||
UInt8BE = 7,
|
||||
Int16BE = 8,
|
||||
UInt16BE = 9,
|
||||
Int32BE = 10,
|
||||
// UInt32,
|
||||
}
|
||||
|
||||
// Auto-generated. Do not edit. Really.
|
@ -18,6 +18,9 @@ enum LedSpriteProperty {
|
||||
Blink
|
||||
}
|
||||
|
||||
/**
|
||||
* A single-LED sprite game engine
|
||||
*/
|
||||
//% color=176 weight=32
|
||||
namespace game {
|
||||
var _score: number = 0;
|
||||
@ -28,7 +31,7 @@ namespace game {
|
||||
var _countdownPause: number = 0;
|
||||
var _level: number = 1;
|
||||
var _gameId: number = 0;
|
||||
var img: images.Image;
|
||||
var img: Image;
|
||||
var sprites: LedSprite[];
|
||||
|
||||
/**
|
||||
@ -284,8 +287,8 @@ namespace game {
|
||||
private _blink: number;
|
||||
|
||||
constructor(x: number, y: number) {
|
||||
this._x = math.clamp(0, 4, x);
|
||||
this._y = math.clamp(0, 4, y);
|
||||
this._x = Math.clamp(0, 4, x);
|
||||
this._y = Math.clamp(0, 4, y);
|
||||
this._dir = 90;
|
||||
this._brightness = 255;
|
||||
init();
|
||||
@ -322,8 +325,8 @@ namespace game {
|
||||
this._x = this._x - leds;
|
||||
this._y = this._y + leds;
|
||||
}
|
||||
this._x = math.clamp(0, 4, this._x);
|
||||
this._y = math.clamp(0, 4, this._y);
|
||||
this._x = Math.clamp(0, 4, this._x);
|
||||
this._y = Math.clamp(0, 4, this._y);
|
||||
plot();
|
||||
}
|
||||
|
||||
@ -336,8 +339,8 @@ namespace game {
|
||||
public goTo(x: number, y: number): void {
|
||||
this._x = x;
|
||||
this._y = y;
|
||||
this._x = math.clamp(0, 4, this._x);
|
||||
this._y = math.clamp(0, 4, this._y);
|
||||
this._x = Math.clamp(0, 4, this._x);
|
||||
this._y = Math.clamp(0, 4, this._y);
|
||||
plot();
|
||||
}
|
||||
|
||||
@ -594,7 +597,7 @@ namespace game {
|
||||
* @param brightness TODO
|
||||
*/
|
||||
public setBrightness(brightness: number): void {
|
||||
this._brightness = math.clamp(0, 255, brightness);
|
||||
this._brightness = Math.clamp(0, 255, brightness);
|
||||
plot();
|
||||
}
|
||||
|
||||
@ -639,7 +642,7 @@ namespace game {
|
||||
* @param ms TODO
|
||||
*/
|
||||
public setBlink(ms: number): void {
|
||||
this._blink = math.clamp(0, 10000, ms);
|
||||
this._blink = Math.clamp(0, 10000, ms);
|
||||
}
|
||||
|
||||
/**
|
||||
|
6
libs/microbit/helpers.ts
Normal file
6
libs/microbit/helpers.ts
Normal file
@ -0,0 +1,6 @@
|
||||
namespace console {
|
||||
export function log(msg: string) {
|
||||
serial.writeString(msg);
|
||||
serial.writeString("\r\n");
|
||||
}
|
||||
}
|
88
libs/microbit/images.cpp
Normal file
88
libs/microbit/images.cpp
Normal file
@ -0,0 +1,88 @@
|
||||
#include "ksbit.h"
|
||||
|
||||
/**
|
||||
* Creation, manipulation and display of LED images.
|
||||
*/
|
||||
//% color=45 weight=31
|
||||
namespace images {
|
||||
/**
|
||||
* Creates an image that fits on the LED screen.
|
||||
*/
|
||||
//% weight=75 help=images/create-image
|
||||
//% blockId=device_build_image block="create image"
|
||||
Image createImage(ImageLiteral leds) {
|
||||
return MicroBitImage(imageBytes(leds)).clone().leakData();
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an image with 2 frames.
|
||||
*/
|
||||
//% weight=74 help=images/create-big-image
|
||||
//% blockId=device_build_big_image block="create big image" imageLiteral=2
|
||||
Image createBigImage(ImageLiteral leds) {
|
||||
return createImage(leds);
|
||||
}
|
||||
}
|
||||
|
||||
namespace ImageMethods {
|
||||
/**
|
||||
* Shows an frame from the image at offset ``x offset``.
|
||||
* @param xOffset TODO
|
||||
*/
|
||||
//% help=images/show-image weight=80 async
|
||||
//% BUGblockId=device_show_image_offset block="show image %sprite|at offset %offset" blockGap=8
|
||||
void showImage(Image i, int xOffset = 0) {
|
||||
uBit.display.print(MicroBitImage(i), -xOffset, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Scrolls an image .
|
||||
* @param frameOffset x offset moved on each animation step, eg: 5, 1, -1
|
||||
* @param interval time between each animation step in milli seconds, eg: 200
|
||||
*/
|
||||
//% help=images/show-image weight=79 async
|
||||
//% BUGblockId=device_scroll_image block="scroll image %sprite|with offset %frameoffset|and interval (ms) %delay" blockGap=8
|
||||
void scrollImage(Image id, int frameOffset = 0, int interval = 200) {
|
||||
MicroBitImage i(id);
|
||||
if (i.getWidth() <= 5)
|
||||
showImage(id, 0);
|
||||
else
|
||||
uBit.display.animate(i, interval, frameOffset, 0);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Plots the image at a given column to the screen
|
||||
*/
|
||||
//% help=images/plot-image
|
||||
void plotImage(Image i, int xOffset = 0) {
|
||||
uBit.display.print(MicroBitImage(i), -xOffset, 0, 0, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets all pixels off.
|
||||
*/
|
||||
//% help=images/clear
|
||||
void clear(Image i) {
|
||||
MicroBitImage(i).clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a specific pixel brightness at a given position
|
||||
*/
|
||||
//% help=
|
||||
void setPixelBrightness(Image i, int x, int y, int value) {
|
||||
MicroBitImage(i).setPixelValue(x, y, value);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the pixel brightness ([0..255]) at a given position
|
||||
*/
|
||||
//% help=
|
||||
int pixelBrightness(Image i, int x, int y) {
|
||||
int pix = MicroBitImage(i).getPixelValue(x, y);
|
||||
if (pix < 0) return 0;
|
||||
return pix;
|
||||
}
|
||||
}
|
@ -1,63 +0,0 @@
|
||||
//% color=45 weight=31
|
||||
namespace images {
|
||||
/**
|
||||
* Creates an image that fits on the LED screen.
|
||||
*/
|
||||
//% weight=75 help=images/create-image
|
||||
//% blockId=device_build_image block="create image" imageLiteral=1
|
||||
export function createImage(leds: string): Image {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates an image with 2 frames.
|
||||
*/
|
||||
//% weight=74 help=images/create-big-image
|
||||
//% blockId=device_build_big_image block="create big image" imageLiteral=2
|
||||
export function createBigImage(leds: string): Image {
|
||||
return null;
|
||||
}
|
||||
|
||||
export class Image {
|
||||
/**
|
||||
* Shows an frame from the image at offset ``x offset``.
|
||||
* @param xOffset TODO
|
||||
*/
|
||||
//% help=images/show-image weight=80 shim=micro_bit::showImage
|
||||
//% blockId=device_show_image_offset block="show image %sprite|at offset %offset" blockGap=8
|
||||
public showImage(xOffset: number = 0): void {}
|
||||
|
||||
/**
|
||||
* Scrolls an image .
|
||||
* @param frameOffset x offset moved on each animation step, eg: 5, 1, -1
|
||||
* @param interval time between each animation step in milli seconds, eg: 200
|
||||
*/
|
||||
//% help=images/show-image weight=79 shim=micro_bit::scrollImage async
|
||||
//% blockId=device_scroll_image block="scroll image %sprite|with offset %frameoffset|and interval (ms) %delay" blockGap=8
|
||||
public scrollImage(frameOffset: number = 0, interval : number = 200) {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Plots the image at a given column to the screen
|
||||
*/
|
||||
public plotImage(xOffset: number = 0): void {}
|
||||
|
||||
/**
|
||||
* Sets all pixels off.
|
||||
*/
|
||||
public clear(): void {}
|
||||
|
||||
/**
|
||||
* Sets a specific pixel brightness at a given position
|
||||
*/
|
||||
public setPixelBrightness(x: number, y: number, v: number): void {}
|
||||
|
||||
/**
|
||||
* Gets the pixel brightness ([0..255]) at a given position
|
||||
*/
|
||||
public pixelBrightness(x: number, y: number): number {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
281
libs/microbit/input.cpp
Normal file
281
libs/microbit/input.cpp
Normal file
@ -0,0 +1,281 @@
|
||||
#include "ksbit.h"
|
||||
|
||||
enum class Button {
|
||||
A = MICROBIT_ID_BUTTON_A,
|
||||
B = MICROBIT_ID_BUTTON_B,
|
||||
//% block="A+B"
|
||||
AB = MICROBIT_ID_BUTTON_AB,
|
||||
};
|
||||
|
||||
enum class Dimension {
|
||||
//% block=x
|
||||
X = 0,
|
||||
//% block=y
|
||||
Y = 1,
|
||||
//% block=z
|
||||
Z = 2,
|
||||
//% block=strength
|
||||
Strength = 3,
|
||||
};
|
||||
|
||||
enum class Rotation {
|
||||
//% block=pitch
|
||||
Pitch = 0,
|
||||
//% block=roll
|
||||
Roll = 1,
|
||||
};
|
||||
|
||||
enum class TouchPin {
|
||||
P0 = MICROBIT_ID_IO_P0,
|
||||
P1 = MICROBIT_ID_IO_P1,
|
||||
P2 = MICROBIT_ID_IO_P2,
|
||||
};
|
||||
|
||||
enum class AcceleratorRange {
|
||||
/**
|
||||
* The accelerator measures forces up to 1 gravity
|
||||
*/
|
||||
//% block="1g"
|
||||
OneG = 1,
|
||||
/**
|
||||
* The accelerator measures forces up to 2 gravity
|
||||
*/
|
||||
//% block="2g"
|
||||
TwoG = 2,
|
||||
/**
|
||||
* The accelerator measures forces up to 4 gravity
|
||||
*/
|
||||
//% block="4g"
|
||||
FourG = 4,
|
||||
/**
|
||||
* The accelerator measures forces up to 8 gravity
|
||||
*/
|
||||
//% block="8g"
|
||||
EightG = 8
|
||||
};
|
||||
|
||||
enum class Gesture {
|
||||
/**
|
||||
* Raised when shaken
|
||||
*/
|
||||
//% block=shake
|
||||
Shake = GESTURE_SHAKE,
|
||||
/**
|
||||
* Raised when the logo is upward and the screen is vertical
|
||||
*/
|
||||
//% block="logo up"
|
||||
LogoUp = GESTURE_UP,
|
||||
/**
|
||||
* Raised when the logo is downward and the screen is vertical
|
||||
*/
|
||||
//% block="logo down"
|
||||
LogoDown = GESTURE_DOWN,
|
||||
/**
|
||||
* Raised when the screen is pointing down and the board is horizontal
|
||||
*/
|
||||
//% block="screen up"
|
||||
ScreenUp = GESTURE_FACE_UP,
|
||||
/**
|
||||
* Raised when the screen is pointing up and the board is horizontal
|
||||
*/
|
||||
//% block="screen down"
|
||||
ScreenDown = GESTURE_FACE_DOWN,
|
||||
/**
|
||||
* Raised when the screen is pointing left
|
||||
*/
|
||||
//% block="tilt left"
|
||||
TiltLeft = GESTURE_LEFT,
|
||||
/**
|
||||
* Raised when the screen is pointing right
|
||||
*/
|
||||
//% block="tilt right"
|
||||
TiltRight = GESTURE_RIGHT,
|
||||
/**
|
||||
* Raised when the board is falling!
|
||||
*/
|
||||
//% block="free fall"
|
||||
FreeFall = GESTURE_FREEFALL
|
||||
};
|
||||
|
||||
//% color=300 weight=99
|
||||
namespace input {
|
||||
/**
|
||||
* Do something when a button (``A``, ``B`` or both ``A+B``) is pressed
|
||||
* @param button TODO
|
||||
* @param body TODO
|
||||
*/
|
||||
//% help=input/on-button-pressed weight=85
|
||||
//% blockId=device_button_event
|
||||
//% block="on button|%NAME|pressed"
|
||||
//% icon="\uf192"
|
||||
void onButtonPressed(Button button, Action body) {
|
||||
registerWithDal((int)button, MICROBIT_BUTTON_EVT_CLICK, body);
|
||||
}
|
||||
|
||||
/**
|
||||
* Attaches code to run when the screen is facing up.
|
||||
* @param body TODO
|
||||
*/
|
||||
//% help=input/on-gesture weight=84
|
||||
//% blockId=device_gesture_event block="on |%NAME" icon="\uf135"
|
||||
void onGesture(Gesture gesture, Action body) {
|
||||
registerWithDal(MICROBIT_ID_GESTURE, (int)gesture, body);
|
||||
}
|
||||
|
||||
/**
|
||||
* Do something when a pin(``P0``, ``P1`` or both ``P2``) is pressed.
|
||||
* @param name TODO
|
||||
* @param body TODO
|
||||
*/
|
||||
//% help=input/on-pin-pressed weight=83
|
||||
//% blockId=device_pin_event block="on pin|%NAME|pressed" icon="\uf094"
|
||||
void onPinPressed(TouchPin name, Action body) {
|
||||
auto pin = getPin((int)name);
|
||||
if (!pin) return;
|
||||
|
||||
// Forces the PIN to switch to makey-makey style detection.
|
||||
pin->isTouched();
|
||||
registerWithDal((int)name, MICROBIT_BUTTON_EVT_CLICK, body);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the button state (pressed or not) for ``A`` and ``B``.
|
||||
*/
|
||||
//% help=input/button-is-pressed weight=57
|
||||
//% block="button|%NAME|is pressed"
|
||||
//% blockId=device_get_button2
|
||||
//% icon="\uf192" blockGap=8
|
||||
bool buttonIsPressed(Button button) {
|
||||
if (button == Button::A)
|
||||
return uBit.buttonA.isPressed();
|
||||
else if (button == Button::B)
|
||||
return uBit.buttonB.isPressed();
|
||||
else if (button == Button::AB)
|
||||
return uBit.buttonAB.isPressed();
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the current compass compass heading in degrees.
|
||||
*/
|
||||
//% help=input/compass-heading
|
||||
//% weight=56 icon="\uf14e"
|
||||
//% blockId=device_heading block="compass heading (°)" blockGap=8
|
||||
int compassHeading() {
|
||||
return uBit.compass.heading();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the temperature in Celsius degrees (°C).
|
||||
*/
|
||||
//% weight=55 icon="\uf06d"
|
||||
//% help=input/temperature
|
||||
//% blockId=device_temperature block="temperature (°C)" blockGap=8
|
||||
int temperature() {
|
||||
return uBit.thermometer.getTemperature();
|
||||
}
|
||||
|
||||
int getAccelerationStrength() {
|
||||
double x = uBit.accelerometer.getX();
|
||||
double y = uBit.accelerometer.getY();
|
||||
double z = uBit.accelerometer.getZ();
|
||||
return (int)sqrt(x*x+y*y+z*z);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
//% help=input/acceleration weight=54 icon="\uf135"
|
||||
//% blockId=device_acceleration block="acceleration (mg)|%NAME" blockGap=8
|
||||
int acceleration(Dimension dimension) {
|
||||
switch (dimension) {
|
||||
case Dimension::X: return uBit.accelerometer.getX();
|
||||
case Dimension::Y: return uBit.accelerometer.getY();
|
||||
case Dimension::Z: return uBit.accelerometer.getZ();
|
||||
case Dimension::Strength: return getAccelerationStrength();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright. In the simulator, the ``acceleration y`` is used to emulate this value.
|
||||
*/
|
||||
//% help=input/light-level weight=53
|
||||
//% blockId=device_get_light_level block="light level" blockGap=8 icon="\uf185"
|
||||
int lightLevel() {
|
||||
return uBit.display.readLightLevel();
|
||||
}
|
||||
|
||||
/**
|
||||
* The pitch of the device, rotation along the ``x-axis``, in degrees.
|
||||
* @param kind TODO
|
||||
*/
|
||||
//% help=/input/rotation weight=52
|
||||
//% blockId=device_get_rotation block="rotation (°)|%NAME" blockGap=8 icon="\uf197"
|
||||
int rotation(Rotation kind) {
|
||||
switch (kind) {
|
||||
case Rotation::Pitch: return uBit.accelerometer.getPitch();
|
||||
case Rotation::Roll: return uBit.accelerometer.getRoll();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the magnetic force value in ``micro-Teslas`` (``µT``). This function is not supported in the simulator.
|
||||
* @param dimension TODO
|
||||
*/
|
||||
//% help=input/magnetic-force weight=51
|
||||
//% blockId=device_get_magnetic_force block="magnetic force (µT)|%NAME" blockGap=8 icon="\uf076"
|
||||
int magneticForce(Dimension dimension) {
|
||||
if (!uBit.compass.isCalibrated())
|
||||
uBit.compass.calibrate();
|
||||
|
||||
switch (dimension) {
|
||||
case Dimension::X: return uBit.compass.getX() / 1000;
|
||||
case Dimension::Y: return uBit.compass.getY() / 1000;
|
||||
case Dimension::Z: return uBit.compass.getZ() / 1000;
|
||||
case Dimension::Strength: return uBit.compass.getFieldStrength() / 1000;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the number of milliseconds elapsed since power on.
|
||||
*/
|
||||
//% help=input/running-time weight=50
|
||||
//% blockId=device_get_running_time block="running time (ms)" icon="\uf017"
|
||||
int runningTime() {
|
||||
return uBit.systemTime();
|
||||
}
|
||||
|
||||
/**
|
||||
* Obsolete, compass calibration is automatic.
|
||||
*/
|
||||
//% help=input/calibrate weight=0
|
||||
void calibrate() { }
|
||||
|
||||
/**
|
||||
* Get the pin state (pressed or not). Requires to hold the ground to close the circuit.
|
||||
* @param name pin used to detect the touch
|
||||
*/
|
||||
//% help=input/pin-is-pressed weight=58 block="pin|%NAME|is pressed" icon="\uf094"
|
||||
bool pinIsPressed(TouchPin name) {
|
||||
auto pin = getPin((int)name);
|
||||
return pin && pin->isTouched();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the accelerometer sample range in gravities.
|
||||
* @param range a value describe the maximum strengh of acceleration measured
|
||||
*/
|
||||
//% help=input/set-accelerator-range
|
||||
//% blockId=device_set_accelerometer_range block="set accelerometer|range %range" icon="\uf135"
|
||||
//% weight=5
|
||||
void setAccelerometerRange(AcceleratorRange range) {
|
||||
uBit.accelerometer.setRange((int)range);
|
||||
}
|
||||
}
|
@ -1,255 +1,8 @@
|
||||
enum Button {
|
||||
//% enumval=MICROBIT_ID_BUTTON_A
|
||||
A,
|
||||
//% enumval=MICROBIT_ID_BUTTON_B
|
||||
B,
|
||||
//% enumval=MICROBIT_ID_BUTTON_AB
|
||||
//% block="A+B"
|
||||
AB,
|
||||
}
|
||||
|
||||
enum Dimension {
|
||||
//% block=x
|
||||
X = 0,
|
||||
//% block=y
|
||||
Y = 1,
|
||||
//% block=z
|
||||
Z = 2,
|
||||
//% block=strength
|
||||
Strength = 3,
|
||||
}
|
||||
|
||||
enum Rotation {
|
||||
//% block=pitch
|
||||
Pitch = 0,
|
||||
//% block=roll
|
||||
Roll = 1,
|
||||
}
|
||||
|
||||
enum TouchPin {
|
||||
//% enumval=uBit.io.P0
|
||||
P0,
|
||||
//% enumval=uBit.io.P1
|
||||
P1,
|
||||
//% enumval=uBit.io.P2
|
||||
P2,
|
||||
}
|
||||
|
||||
enum AcceleratorRange {
|
||||
/**
|
||||
* The accelerator measures forces up to 1 gravity
|
||||
*/
|
||||
//% block="1g"
|
||||
OneG = 1,
|
||||
/**
|
||||
* The accelerator measures forces up to 2 gravity
|
||||
*/
|
||||
//% block="2g"
|
||||
TwoG = 2,
|
||||
/**
|
||||
* The accelerator measures forces up to 4 gravity
|
||||
*/
|
||||
//% block="4g"
|
||||
FourG = 4,
|
||||
/**
|
||||
* The accelerator measures forces up to 8 gravity
|
||||
*/
|
||||
//% block="8g"
|
||||
EightG = 8
|
||||
}
|
||||
|
||||
/*
|
||||
enum BasicGesture
|
||||
{
|
||||
GESTURE_NONE,
|
||||
GESTURE_UP,
|
||||
GESTURE_DOWN,
|
||||
GESTURE_LEFT,
|
||||
GESTURE_RIGHT,
|
||||
GESTURE_FACE_UP,
|
||||
GESTURE_FACE_DOWN,
|
||||
GESTURE_FREEFALL,
|
||||
GESTURE_3G,
|
||||
GESTURE_6G,
|
||||
GESTURE_8G,
|
||||
GESTURE_SHAKE
|
||||
};
|
||||
*/
|
||||
|
||||
enum Gesture {
|
||||
/**
|
||||
* Raised when shaken
|
||||
*/
|
||||
//% block=shake
|
||||
Shake = 11,
|
||||
/**
|
||||
* Raised when the logo is upward and the screen is vertical
|
||||
*/
|
||||
//% block="logo up"
|
||||
LogoUp = 1,
|
||||
/**
|
||||
* Raised when the logo is downward and the screen is vertical
|
||||
*/
|
||||
//% block="logo down"
|
||||
LogoDown = 2,
|
||||
/**
|
||||
* Raised when the screen is pointing down and the board is horizontal
|
||||
*/
|
||||
//% block="screen up"
|
||||
ScreenUp = 5,
|
||||
/**
|
||||
* Raised when the screen is pointing up and the board is horizontal
|
||||
*/
|
||||
//% block="screen down"
|
||||
ScreenDown = 6,
|
||||
/**
|
||||
* Raised when the screen is pointing left
|
||||
*/
|
||||
//% block="tilt left"
|
||||
TiltLeft = 3,
|
||||
/**
|
||||
* Raised when the screen is pointing right
|
||||
*/
|
||||
//% block="tilt right"
|
||||
TiltRight = 4,
|
||||
/**
|
||||
* Raised when the board is falling!
|
||||
*/
|
||||
//% block="free fall"
|
||||
FreeFall = 7
|
||||
}
|
||||
|
||||
/**
|
||||
* Events and data from sensors
|
||||
*/
|
||||
//% color=300 weight=99
|
||||
namespace input {
|
||||
/**
|
||||
* Do something when a button (``A``, ``B`` or both ``A+B``) is pressed
|
||||
* @param button TODO
|
||||
* @param body TODO
|
||||
*/
|
||||
//% help=input/on-button-pressed weight=85
|
||||
//% shim=micro_bit::onButtonPressed
|
||||
//% blockId=device_button_event
|
||||
//% block="on button|%NAME|pressed"
|
||||
//% icon="\uf192"
|
||||
export function onButtonPressed(button: Button, body: Action): void { }
|
||||
|
||||
/**
|
||||
* Attaches code to run when the screen is facing up.
|
||||
* @param body TODO
|
||||
*/
|
||||
//% help=input/on-gesture shim=micro_bit::onGesture weight=84
|
||||
//% blockId=device_gesture_event block="on |%NAME" icon="\uf135"
|
||||
export function onGesture(gesture: Gesture, body: Action): void { }
|
||||
|
||||
/**
|
||||
* Do something when a pin(``P0``, ``P1`` or both ``P2``) is pressed.
|
||||
* @param name TODO
|
||||
* @param body TODO
|
||||
*/
|
||||
//% help=input/on-pin-pressed weight=83 shim=micro_bit::onPinPressed
|
||||
//% blockId=device_pin_event block="on pin|%NAME|pressed" icon="\uf094"
|
||||
export function onPinPressed(name: TouchPin, body: Action): void { }
|
||||
|
||||
/**
|
||||
* Get the button state (pressed or not) for ``A`` and ``B``.
|
||||
*/
|
||||
//% help=input/button-is-pressed weight=57
|
||||
//% shim=micro_bit::isButtonPressed
|
||||
//% block="button|%NAME|is pressed"
|
||||
//% blockId=device_get_button2
|
||||
//% icon="\uf192" blockGap=8
|
||||
export function buttonIsPressed(button: Button): boolean {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the current compass compass heading in degrees.
|
||||
*/
|
||||
//% help=input/compass-heading
|
||||
//% weight=56 icon="\uf14e"
|
||||
//% shim=micro_bit::compassHeading
|
||||
//% blockId=device_heading block="compass heading (°)" blockGap=8
|
||||
export function compassHeading(): number {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Gets the temperature in Celsius degrees (°C).
|
||||
*/
|
||||
//% weight=55 icon="\uf06d"
|
||||
//% help=input/temperature shim=micro_bit::temperature
|
||||
//% blockId=device_temperature block="temperature (°C)" blockGap=8
|
||||
export function temperature(): number {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
//% help=input/acceleration weight=54 icon="\uf135"
|
||||
//% shim=micro_bit::getAcceleration
|
||||
//% blockId=device_acceleration block="acceleration (mg)|%NAME" blockGap=8
|
||||
export function acceleration(dimension: Dimension): number {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright. In the simulator, the ``acceleration y`` is used to emulate this value.
|
||||
*/
|
||||
//% help=input/light-level weight=53 shim=micro_bit::lightLevel
|
||||
//% blockId=device_get_light_level block="light level" blockGap=8 icon="\uf185"
|
||||
export function lightLevel(): number {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* The pitch of the device, rotation along the ``x-axis``, in degrees.
|
||||
* @param kind TODO
|
||||
*/
|
||||
//% help=/input/rotation weight=52 shim=micro_bit::getRotation
|
||||
//% blockId=device_get_rotation block="rotation (°)|%NAME" blockGap=8 icon="\uf197"
|
||||
export function rotation(kind: Rotation): number {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the magnetic force value in ``micro-Teslas`` (``µT``). This function is not supported in the simulator.
|
||||
* @param dimension TODO
|
||||
*/
|
||||
//% help=input/magnetic-force weight=51 shim=micro_bit::getMagneticForce
|
||||
//% blockId=device_get_magnetic_force block="magnetic force (µT)|%NAME" blockGap=8 icon="\uf076"
|
||||
export function magneticForce(dimension: Dimension): number {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the number of milliseconds elapsed since power on.
|
||||
*/
|
||||
//% help=input/running-time shim=micro_bit::getCurrentTime weight=50
|
||||
//% blockId=device_get_running_time block="running time (ms)" icon="\uf017"
|
||||
export function runningTime(): number {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Obsolete, compass calibration is automatic.
|
||||
*/
|
||||
//% help=input/calibrate weight=0 shim=TD_NOOP
|
||||
export function calibrate(): void { }
|
||||
|
||||
/**
|
||||
* Get the pin state (pressed or not). Requires to hold the ground to close the circuit.
|
||||
* @param name pin used to detect the touch
|
||||
*/
|
||||
//% help=input/pin-is-pressed weight=58 shim=micro_bit::isPinTouched block="pin|%NAME|is pressed" icon="\uf094"
|
||||
export function pinIsPressed(name: TouchPin): boolean {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attaches code to run when the screen is facing up.
|
||||
* @param body TODO
|
||||
@ -294,16 +47,4 @@ namespace input {
|
||||
export function onLogoDown(body: Action): void {
|
||||
onGesture(Gesture.LogoDown, body);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the accelerometer sample range in gravities.
|
||||
* @param range a value describe the maximum strengh of acceleration measured
|
||||
*/
|
||||
//% help=input/set-accelerator-range
|
||||
//% blockId=device_set_accelerometer_range block="set accelerometer|range %range" icon="\uf135"
|
||||
//% weight=5
|
||||
//% shim=micro_bit::setAccelerometerRange
|
||||
export function setAccelerometerRange(range : AcceleratorRange) : void {
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -1,86 +0,0 @@
|
||||
{
|
||||
"name": "microbit",
|
||||
"description": "The microbit core library",
|
||||
"installedVersion": "tsmdvf",
|
||||
"files": [
|
||||
"README.md",
|
||||
"core.d.ts",
|
||||
"mbit.ts",
|
||||
"images.ts",
|
||||
"basic.cpp",
|
||||
"input.ts",
|
||||
"control.ts",
|
||||
"control.cpp",
|
||||
"game.ts",
|
||||
"led.ts",
|
||||
"music.ts",
|
||||
"pins.ts",
|
||||
"serial.ts"
|
||||
],
|
||||
"public": true,
|
||||
"dependencies": {},
|
||||
"target": {
|
||||
"id": "microbit",
|
||||
"name": "BBC micro:bit",
|
||||
"title": "JavaScript for BBC micro:bit",
|
||||
"cloud": {
|
||||
"workspace": false,
|
||||
"packages": true
|
||||
},
|
||||
"blocksprj": {
|
||||
"id": "blocksprj",
|
||||
"config": {
|
||||
"name": "{0} block",
|
||||
"dependencies": {
|
||||
"microbit": "*",
|
||||
"microbit-radio": "*"
|
||||
},
|
||||
"description": "",
|
||||
"files": [
|
||||
"main.blocks",
|
||||
"main.blocks.ts",
|
||||
"README.md"
|
||||
]
|
||||
},
|
||||
"files": {
|
||||
"main.blocks": "<xml xmlns=\"http://www.w3.org/1999/xhtml\"><block type=\"device_print_message\"><value name=\"text\"><shadow type=\"text\"><field name=\"TEXT\">Hello!</field></shadow></value></block></xml>",
|
||||
"main.blocks.ts": "\n",
|
||||
"README.md": "Describe your project here!"
|
||||
}
|
||||
},
|
||||
"tsprj": {
|
||||
"id": "tsprj",
|
||||
"config": {
|
||||
"name": "{0} bit",
|
||||
"dependencies": {
|
||||
"microbit": "*",
|
||||
"microbit-radio": "*"
|
||||
},
|
||||
"description": "",
|
||||
"files": [
|
||||
"main.ts",
|
||||
"README.md"
|
||||
]
|
||||
},
|
||||
"files": {
|
||||
"main.ts": "basic.showString('Hello!')\n",
|
||||
"README.md": "Describe your project here!"
|
||||
}
|
||||
},
|
||||
"compile": {
|
||||
"isNative": false,
|
||||
"hasHex": true
|
||||
},
|
||||
"simulator": {
|
||||
"autoRun": true
|
||||
},
|
||||
"compileService": {
|
||||
"gittag": "v0",
|
||||
"serviceId": "ws"
|
||||
},
|
||||
"serial": {
|
||||
"manufacturerFilter": "^mbed$",
|
||||
"log": true
|
||||
}
|
||||
}
|
||||
}
|
8
libs/microbit/ksbit.h
Normal file
8
libs/microbit/ksbit.h
Normal file
@ -0,0 +1,8 @@
|
||||
#include "pxt.h"
|
||||
#include "ManagedBuffer.h"
|
||||
|
||||
using namespace pxt;
|
||||
MicroBitPin *getPin(int id);
|
||||
typedef ImageData* Image;
|
||||
typedef BufferData* Buffer;
|
||||
|
104
libs/microbit/led.cpp
Normal file
104
libs/microbit/led.cpp
Normal file
@ -0,0 +1,104 @@
|
||||
#include "ksbit.h"
|
||||
|
||||
enum class DisplayMode_ {
|
||||
//% block="black and white"
|
||||
BackAndWhite = DISPLAY_MODE_BLACK_AND_WHITE,
|
||||
//% block="greyscale"
|
||||
Greyscale = DISPLAY_MODE_GREYSCALE,
|
||||
// TODO DISPLAY_MODE_BLACK_AND_WHITE_LIGHT_SENSE
|
||||
};
|
||||
|
||||
//% color=3 weight=35
|
||||
namespace led {
|
||||
|
||||
/**
|
||||
* Turn on the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.
|
||||
* @param x TODO
|
||||
* @param y TODO
|
||||
*/
|
||||
//% help=led/plot weight=78
|
||||
//% blockId=device_plot block="plot|x %x|y %y" icon="\uf205" blockGap=8
|
||||
void plot(int x, int y) {
|
||||
uBit.display.image.setPixelValue(x, y, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Turn off the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.
|
||||
* @param x TODO
|
||||
* @param y TODO
|
||||
*/
|
||||
//% help=led/unplot weight=77
|
||||
//% blockId=device_unplot block="unplot|x %x|y %y" icon="\uf204" blockGap=8
|
||||
void unplot(int x, int y) {
|
||||
uBit.display.image.setPixelValue(x, y, 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the on/off state of the specified LED using x, y coordinates. (0,0) is upper left.
|
||||
* @param x TODO
|
||||
* @param y TODO
|
||||
*/
|
||||
//% help=led/point weight=76
|
||||
//% blockId=device_point block="point|x %x|y %y" icon="\uf10c"
|
||||
bool point(int x, int y) {
|
||||
int pix = uBit.display.image.getPixelValue(x, y);
|
||||
return pix > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the screen brightness from 0 (off) to 255 (full bright).
|
||||
*/
|
||||
//% help=led/brightness weight=60
|
||||
//% blockId=device_get_brightness block="brightness" icon="\uf042" blockGap=8
|
||||
int brightness() {
|
||||
return uBit.display.getBrightness();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the screen brightness from 0 (off) to 255 (full bright).
|
||||
* @param value the brightness value, eg:255, 127, 0
|
||||
*/
|
||||
//% help=led/set-brightness weight=59
|
||||
//% blockId=device_set_brightness block="set brightness %value" icon="\uf042"
|
||||
void setBrightness(int value) {
|
||||
uBit.display.setBrightness(value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancels the current animation and clears other pending animations.
|
||||
*/
|
||||
//% weight=50 help=led/stop-animation
|
||||
//% blockId=device_stop_animation block="stop animation" icon="\uf04d"
|
||||
void stopAnimation() {
|
||||
uBit.display.stopAnimation();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the display mode between black and white and greyscale for rendering LEDs.
|
||||
* @param mode TODO
|
||||
*/
|
||||
//% weight=1 help=/led/set-display-mode
|
||||
void setDisplayMode(DisplayMode_ mode) {
|
||||
uBit.display.setDisplayMode((DisplayMode)mode);
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes a screenshot of the LED screen and returns an image.
|
||||
*/
|
||||
//% help=led/screenshot
|
||||
Image screenshot() {
|
||||
return uBit.display.screenShot().leakData();
|
||||
/*
|
||||
let Image img;
|
||||
img = image.createImage("");
|
||||
for (let i = 0; i < 5; i++) {
|
||||
for (let j = 0; j < 5; j++) {
|
||||
if (led.point(i, j)) {
|
||||
img.setPixel(i, j, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
return img;
|
||||
*/
|
||||
}
|
||||
}
|
@ -1,64 +1,8 @@
|
||||
enum DisplayMode {
|
||||
//% block="black and white"
|
||||
BackAndWhite = 0,
|
||||
//% block="greyscale"
|
||||
Greyscale = 1,
|
||||
}
|
||||
|
||||
/**
|
||||
* Control of the LED screen.
|
||||
*/
|
||||
//% color=3 weight=35
|
||||
namespace led {
|
||||
/**
|
||||
* Turn on the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.
|
||||
* @param x TODO
|
||||
* @param y TODO
|
||||
*/
|
||||
//% help=led/plot weight=78 shim=micro_bit::plot
|
||||
//% blockId=device_plot block="plot|x %x|y %y" icon="\uf205" blockGap=8
|
||||
export function plot(x: number, y: number): void { }
|
||||
|
||||
/**
|
||||
* Turn off the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.
|
||||
* @param x TODO
|
||||
* @param y TODO
|
||||
*/
|
||||
//% help=led/unplot weight=77 shim=micro_bit::unPlot
|
||||
//% blockId=device_unplot block="unplot|x %x|y %y" icon="\uf204" blockGap=8
|
||||
export function unplot(x: number, y: number): void { }
|
||||
|
||||
/**
|
||||
* Get the on/off state of the specified LED using x, y coordinates. (0,0) is upper left.
|
||||
* @param x TODO
|
||||
* @param y TODO
|
||||
*/
|
||||
//% help=led/point weight=76 shim=micro_bit::point
|
||||
//% blockId=device_point block="point|x %x|y %y" icon="\uf10c"
|
||||
export function point(x: number, y: number): boolean {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the screen brightness from 0 (off) to 255 (full bright).
|
||||
*/
|
||||
//% help=led/brightness weight=60 shim=micro_bit::getBrightness
|
||||
//% blockId=device_get_brightness block="brightness" icon="\uf042" blockGap=8
|
||||
export function brightness(): number {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the screen brightness from 0 (off) to 255 (full bright).
|
||||
* @param value the brightness value, eg:255, 127, 0
|
||||
*/
|
||||
//% help=led/set-brightness weight=59 shim=micro_bit::setBrightness
|
||||
//% blockId=device_set_brightness block="set brightness %value" icon="\uf042"
|
||||
export function setBrightness(value: number): void { }
|
||||
|
||||
/**
|
||||
* Cancels the current animation and clears other pending animations.
|
||||
*/
|
||||
//% weight=50 shim=uBit.display.stopAnimation help=led/stop-animation
|
||||
//% blockId=device_stop_animation block="stop animation" icon="\uf04d"
|
||||
export function stopAnimation(): void { }
|
||||
|
||||
/**
|
||||
* Displays a vertical bar graph based on the ``value`` and ``high`` value.
|
||||
@ -69,7 +13,7 @@ namespace led {
|
||||
//% blockId=device_plot_bar_graph block="plot bar graph of %value |up to %high" icon="\uf080" blockExternalInputs=true
|
||||
export function plotBarGraph(value: number, high: number): void {
|
||||
|
||||
writeString(value.toString() + "\r\n");
|
||||
serial.writeString(value.toString() + "\r\n");
|
||||
|
||||
let v = Math.abs((value * 15) / high);
|
||||
let k = 0;
|
||||
@ -87,19 +31,6 @@ namespace led {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a string to serial
|
||||
*/
|
||||
//% shim=micro_bit::serialSendString
|
||||
function writeString(text: string): void { }
|
||||
|
||||
/**
|
||||
* Sets the display mode between black and white and greyscale for rendering LEDs.
|
||||
* @param mode TODO
|
||||
*/
|
||||
//% shim=micro_bit::setDisplayMode weight=1 help=/led/set-display-mode
|
||||
export function setDisplayMode(mode: DisplayMode): void { }
|
||||
|
||||
/**
|
||||
* Toggles a particular pixel
|
||||
* @param x TODO
|
||||
@ -182,25 +113,5 @@ namespace led {
|
||||
led.setBrightness(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes a screenshot of the LED screen and returns an image.
|
||||
*/
|
||||
//% shim=uBit.display.screenShot help=led/screenshot
|
||||
export function screenshot(): images.Image {
|
||||
/*
|
||||
let img: Image;
|
||||
img = image.createImage("");
|
||||
for (let i = 0; i < 5; i++) {
|
||||
for (let j = 0; j < 5; j++) {
|
||||
if (led.point(i, j)) {
|
||||
img.setPixel(i, j, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
return img;
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -1,28 +0,0 @@
|
||||
type Action = () => void;
|
||||
|
||||
namespace helpers {
|
||||
export function arraySplice<T>(arr: T[], start: number, len: number) {
|
||||
if (start < 0) {
|
||||
return;
|
||||
}
|
||||
for (let i = 0; i < len; ++i) {
|
||||
arr.removeAt(start)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
namespace console {
|
||||
export function log(msg: string) {
|
||||
writeString(msg);
|
||||
writeString("\r\n");
|
||||
}
|
||||
|
||||
//% shim=micro_bit::serialSendString
|
||||
function writeString(text: string): void { }
|
||||
}
|
||||
|
||||
namespace math {
|
||||
export function clamp(min: number, max:number, value:number): number {
|
||||
return Math.min(max, Math.max(min, value));
|
||||
}
|
||||
}
|
@ -74,6 +74,9 @@ enum BeatFraction {
|
||||
Sixteenth = 16
|
||||
}
|
||||
|
||||
/**
|
||||
* Generation of music tones through pin ``P0``.
|
||||
*/
|
||||
//% color=52 weight=33
|
||||
namespace music {
|
||||
var beatsPerMinute: number = 120;
|
||||
@ -116,7 +119,7 @@ namespace music {
|
||||
* Gets the frequency of a note.
|
||||
* @param name TODO
|
||||
*/
|
||||
//% shim=TD_ID weight=50 help=music/note-frequency
|
||||
//% weight=50 help=music/note-frequency
|
||||
//% blockId=device_note block="%note"
|
||||
export function noteFrequency(name: Note): number {
|
||||
return name;
|
||||
|
218
libs/microbit/pins.cpp
Normal file
218
libs/microbit/pins.cpp
Normal file
@ -0,0 +1,218 @@
|
||||
#include "ksbit.h"
|
||||
|
||||
enum class DigitalPin {
|
||||
P0 = MICROBIT_ID_IO_P0,
|
||||
P1 = MICROBIT_ID_IO_P1,
|
||||
P2 = MICROBIT_ID_IO_P2,
|
||||
P3 = MICROBIT_ID_IO_P3,
|
||||
P4 = MICROBIT_ID_IO_P4,
|
||||
P5 = MICROBIT_ID_IO_P5,
|
||||
P6 = MICROBIT_ID_IO_P6,
|
||||
P7 = MICROBIT_ID_IO_P7,
|
||||
P8 = MICROBIT_ID_IO_P8,
|
||||
P9 = MICROBIT_ID_IO_P9,
|
||||
P10 = MICROBIT_ID_IO_P10,
|
||||
P11 = MICROBIT_ID_IO_P11,
|
||||
P12 = MICROBIT_ID_IO_P12,
|
||||
P13 = MICROBIT_ID_IO_P13,
|
||||
P14 = MICROBIT_ID_IO_P14,
|
||||
P15 = MICROBIT_ID_IO_P15,
|
||||
P16 = MICROBIT_ID_IO_P16,
|
||||
P19 = MICROBIT_ID_IO_P19,
|
||||
P20 = MICROBIT_ID_IO_P20,
|
||||
};
|
||||
|
||||
enum class AnalogPin {
|
||||
P0 = MICROBIT_ID_IO_P0,
|
||||
P1 = MICROBIT_ID_IO_P1,
|
||||
P2 = MICROBIT_ID_IO_P2,
|
||||
P3 = MICROBIT_ID_IO_P3,
|
||||
P4 = MICROBIT_ID_IO_P4,
|
||||
P10 = MICROBIT_ID_IO_P10,
|
||||
};
|
||||
|
||||
MicroBitPin *getPin(int id) {
|
||||
switch (id) {
|
||||
case MICROBIT_ID_IO_P0: return &uBit.io.P0;
|
||||
case MICROBIT_ID_IO_P1: return &uBit.io.P1;
|
||||
case MICROBIT_ID_IO_P2: return &uBit.io.P2;
|
||||
case MICROBIT_ID_IO_P3: return &uBit.io.P3;
|
||||
case MICROBIT_ID_IO_P4: return &uBit.io.P4;
|
||||
case MICROBIT_ID_IO_P5: return &uBit.io.P5;
|
||||
case MICROBIT_ID_IO_P6: return &uBit.io.P6;
|
||||
case MICROBIT_ID_IO_P7: return &uBit.io.P7;
|
||||
case MICROBIT_ID_IO_P8: return &uBit.io.P8;
|
||||
case MICROBIT_ID_IO_P9: return &uBit.io.P9;
|
||||
case MICROBIT_ID_IO_P10: return &uBit.io.P10;
|
||||
case MICROBIT_ID_IO_P11: return &uBit.io.P11;
|
||||
case MICROBIT_ID_IO_P12: return &uBit.io.P12;
|
||||
case MICROBIT_ID_IO_P13: return &uBit.io.P13;
|
||||
case MICROBIT_ID_IO_P14: return &uBit.io.P14;
|
||||
case MICROBIT_ID_IO_P15: return &uBit.io.P15;
|
||||
case MICROBIT_ID_IO_P16: return &uBit.io.P16;
|
||||
case MICROBIT_ID_IO_P19: return &uBit.io.P19;
|
||||
case MICROBIT_ID_IO_P20: return &uBit.io.P20;
|
||||
default: return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//% color=351 weight=30
|
||||
namespace pins {
|
||||
#define PINOP(op) \
|
||||
MicroBitPin *pin = getPin((int)name); \
|
||||
if (!pin) return; \
|
||||
pin->op
|
||||
|
||||
#define PINREAD(op) \
|
||||
MicroBitPin *pin = getPin((int)name); \
|
||||
if (!pin) return 0; \
|
||||
return pin->op
|
||||
|
||||
|
||||
//%
|
||||
MicroBitPin *getPinAddress(int id) {
|
||||
return getPin(id);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Read the specified pin or connector as either 0 or 1
|
||||
* @param name pin to read from
|
||||
*/
|
||||
//% help=pins/digital-read-pin weight=30
|
||||
//% blockId=device_get_digital_pin block="digital read|pin %name" blockGap=8
|
||||
int digitalReadPin(DigitalPin name) {
|
||||
PINREAD(getDigitalValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a pin or connector value to either 0 or 1.
|
||||
* @param name pin to write to
|
||||
* @param value value to set on the pin, 1 eg,0
|
||||
*/
|
||||
//% help=pins/digital-write-pin weight=29
|
||||
//% blockId=device_set_digital_pin block="digital write|pin %name|to %value"
|
||||
void digitalWritePin(DigitalPin name, int value) {
|
||||
PINOP(setDigitalValue(value));
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the connector value as analog, that is, as a value comprised between 0 and 1023.
|
||||
* @param name pin to write to
|
||||
*/
|
||||
//% help=pins/analog-read-pin weight=25
|
||||
//% blockId=device_get_analog_pin block="analog read|pin %name" blockGap="8"
|
||||
int analogReadPin(AnalogPin name) {
|
||||
PINREAD(getAnalogValue());
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the connector value as analog. Value must be comprised between 0 and 1023.
|
||||
* @param name pin name to write to
|
||||
* @param value value to write to the pin between ``0`` and ``1023``. eg:1023,0
|
||||
*/
|
||||
//% help=pins/analog-write-pin weight=24
|
||||
//% blockId=device_set_analog_pin block="analog write|pin %name|to %value" blockGap=8
|
||||
void analogWritePin(AnalogPin name, int value) {
|
||||
PINOP(setAnalogValue(value));
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
* @param name analog pin to set period to
|
||||
* @param micros period in micro seconds. eg:20000
|
||||
*/
|
||||
//% help=pins/analog-set-period weight=23
|
||||
//% blockId=device_set_analog_period block="analog set period|pin %pin|to (µs)%micros"
|
||||
void analogSetPeriod(AnalogPin name, int micros) {
|
||||
PINOP(setAnalogPeriodUs(micros));
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 value angle or rotation speed, eg:180,90,0
|
||||
*/
|
||||
//% help=pins/servo-write-pin weight=20
|
||||
//% blockId=device_set_servo_pin block="servo write|pin %name|to %value" blockGap=8
|
||||
void servoWritePin(AnalogPin name, int value) {
|
||||
PINOP(setServoValue(value));
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
* @param name pin name
|
||||
* @param micros pulse duration in micro seconds, eg:1500
|
||||
*/
|
||||
//% help=pins/serial-set-pulse weight=19
|
||||
//% blockId=device_set_servo_pulse block="servo set pulse|pin %value|to (µs) %micros"
|
||||
void servoSetPulse(AnalogPin name, int micros) {
|
||||
PINOP(setServoPulseUs(micros));
|
||||
}
|
||||
|
||||
|
||||
MicroBitPin* pitchPin = NULL;
|
||||
|
||||
/**
|
||||
* Sets the pin used when using `pins->analog pitch`.
|
||||
* @param name TODO
|
||||
*/
|
||||
//% help=pins/analog-set-pitch weight=12
|
||||
void analogSetPitchPin(AnalogPin name) {
|
||||
pitchPin = getPin((int)name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Emits a Pulse-width modulation (PWM) signal to the current pitch pin. Use `analog set pitch pin` to define the pitch pin.
|
||||
* @param frequency TODO
|
||||
* @param ms TODO
|
||||
*/
|
||||
//% help=pins/analog-pitch weight=14 async
|
||||
void analogPitch(int frequency, int ms) {
|
||||
if (pitchPin == NULL) return;
|
||||
if (frequency <= 0) {
|
||||
pitchPin->setAnalogValue(0);
|
||||
} else {
|
||||
pitchPin->setAnalogValue(512);
|
||||
pitchPin->setAnalogPeriodUs(1000000/frequency);
|
||||
}
|
||||
|
||||
if (ms > 0) {
|
||||
uBit.sleep(ms);
|
||||
pitchPin->setAnalogValue(0);
|
||||
wait_ms(5);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new zero-initialized buffer.
|
||||
* @param size number of bytes in the buffer
|
||||
*/
|
||||
//%
|
||||
Buffer createBuffer(int size)
|
||||
{
|
||||
return ManagedBuffer(size).leakData();
|
||||
}
|
||||
|
||||
/**
|
||||
* Read `size` bytes from a 7-bit I2C `address`.
|
||||
*/
|
||||
//%
|
||||
Buffer i2cReadBuffer(int address, int size, bool repeat = false)
|
||||
{
|
||||
Buffer buf = createBuffer(size);
|
||||
uBit.i2c.read(address << 1, (char*)buf->payload, size, repeat);
|
||||
return buf;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write bytes to a 7-bit I2C `address`.
|
||||
*/
|
||||
//%
|
||||
void i2cWriteBuffer(int address, Buffer buf, bool repeat = false)
|
||||
{
|
||||
uBit.i2c.write(address << 1, (char*)buf->payload, buf->length, repeat);
|
||||
}
|
||||
}
|
@ -1,129 +1,8 @@
|
||||
enum DigitalPin {
|
||||
//% enumval=uBit.io.P0
|
||||
P0,
|
||||
//% enumval=uBit.io.P1
|
||||
P1,
|
||||
//% enumval=uBit.io.P2
|
||||
P2,
|
||||
//% enumval=uBit.io.P3
|
||||
P3,
|
||||
//% enumval=uBit.io.P4
|
||||
P4,
|
||||
//% enumval=uBit.io.P5
|
||||
P5,
|
||||
//% enumval=uBit.io.P6
|
||||
P6,
|
||||
//% enumval=uBit.io.P7
|
||||
P7,
|
||||
//% enumval=uBit.io.P8
|
||||
P8,
|
||||
//% enumval=uBit.io.P9
|
||||
P9,
|
||||
//% enumval=uBit.io.P10
|
||||
P10,
|
||||
//% enumval=uBit.io.P11
|
||||
P11,
|
||||
//% enumval=uBit.io.P12
|
||||
P12,
|
||||
//% enumval=uBit.io.P13
|
||||
P13,
|
||||
//% enumval=uBit.io.P14
|
||||
P14,
|
||||
//% enumval=uBit.io.P15
|
||||
P15,
|
||||
//% enumval=uBit.io.P16
|
||||
P16,
|
||||
//% enumval=uBit.io.P19
|
||||
P19,
|
||||
//% enumval=uBit.io.P20
|
||||
P20,
|
||||
}
|
||||
|
||||
enum AnalogPin {
|
||||
//% enumval=uBit.io.P0
|
||||
P0,
|
||||
//% enumval=uBit.io.P1
|
||||
P1,
|
||||
//% enumval=uBit.io.P2
|
||||
P2,
|
||||
//% enumval=uBit.io.P3
|
||||
P3,
|
||||
//% enumval=uBit.io.P4
|
||||
P4,
|
||||
//% enumval=uBit.io.P10
|
||||
P10,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Control currents in Pins for analog/digital signals, servos, i2c, ...
|
||||
*/
|
||||
//% color=351 weight=30
|
||||
namespace pins {
|
||||
/**
|
||||
* Read the specified pin or connector as either 0 or 1
|
||||
* @param name pin to read from
|
||||
*/
|
||||
//% help=pins/digital-read-pin weight=30 shim=micro_bit::digitalReadPin
|
||||
//% blockId=device_get_digital_pin block="digital read|pin %name" blockGap=8
|
||||
export function digitalReadPin(name: DigitalPin): number {
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set a pin or connector value to either 0 or 1.
|
||||
* @param name pin to write to
|
||||
* @param value value to set on the pin, eg: 1,0
|
||||
*/
|
||||
//% help=pins/digital-write-pin weight=29 shim=micro_bit::digitalWritePin
|
||||
//% blockId=device_set_digital_pin block="digital write|pin %name|to %value"
|
||||
export function digitalWritePin(name: DigitalPin, value: number): void { }
|
||||
|
||||
/**
|
||||
* Read the connector value as analog, that is, as a value comprised between 0 and 1023.
|
||||
* @param name pin to write to
|
||||
*/
|
||||
//% help=pins/analog-read-pin weight=25 shim=micro_bit::analogReadPin
|
||||
//% blockId=device_get_analog_pin block="analog read|pin %name" blockGap="8"
|
||||
export function analogReadPin(name: AnalogPin): number {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the connector value as analog. Value must be comprised between 0 and 1023.
|
||||
* @param name pin name to write to
|
||||
* @param value value to write to the pin between ``0`` and ``1023``. eg:1023,0
|
||||
*/
|
||||
//% help=pins/analog-write-pin weight=24 shim=micro_bit::analogWritePin
|
||||
//% blockId=device_set_analog_pin block="analog write|pin %name|to %value" blockGap=8
|
||||
export function analogWritePin(name: AnalogPin, value: number): void { }
|
||||
|
||||
/**
|
||||
* 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.
|
||||
* @param pin analog pin to set period to
|
||||
* @param micros period in micro seconds. eg:20000
|
||||
*/
|
||||
//% shim=micro_bit::setAnalogPeriodUs help=pins/analog-set-period weight=23
|
||||
//% blockId=device_set_analog_period block="analog set period|pin %pin|to (µs)%micros"
|
||||
export function analogSetPeriod(pin: AnalogPin, micros: number): void { }
|
||||
|
||||
/**
|
||||
* 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 value angle or rotation speed, eg:180,90,0
|
||||
*/
|
||||
//% help=pins/servo-write-pin weight=20 shim=micro_bit::servoWritePin
|
||||
//% blockId=device_set_servo_pin block="servo write|pin %name|to %value" blockGap=8
|
||||
export function servoWritePin(name: AnalogPin, value: number): void { }
|
||||
|
||||
/**
|
||||
* 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.
|
||||
* @param pin pin name
|
||||
* @param micros pulse duration in micro seconds, eg:1500
|
||||
*/
|
||||
//% shim=micro_bit::setServoPulseUs help=pins/serial-set-pulse weight=19
|
||||
//% blockId=device_set_servo_pulse block="servo set pulse|pin %value|to (µs) %micros"
|
||||
export function servoSetPulse(pin: AnalogPin, micros: number): void { }
|
||||
|
||||
/**
|
||||
* Re-maps a number from one range to another. That is, a value of ``from low`` would get mapped to ``to low``, a value of ``from high`` to ``to high``, values in-between to values in-between, etc.
|
||||
* @param value value to map in ranges
|
||||
@ -139,17 +18,47 @@ namespace pins {
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the pin used when using `pins->analog pitch`.
|
||||
* @param name TODO
|
||||
* Read one number from 7-bit I2C address.
|
||||
*/
|
||||
//% shim=micro_bit::enablePitch help=pins/analog-set-pitch weight=12
|
||||
export function analogSetPitchPin(name: AnalogPin): void { }
|
||||
export function i2cReadNumber(address: number, format: NumberFormat): number {
|
||||
let buf = pins.i2cReadBuffer(address, pins.sizeOf(format))
|
||||
return buf.getNumber(format, 0)
|
||||
}
|
||||
|
||||
/**
|
||||
* Emits a Pulse-width modulation (PWM) signal to the current pitch pin. Use `analog set pitch pin` to define the pitch pin.
|
||||
* @param frequency TODO
|
||||
* @param ms TODO
|
||||
* Write one number to a 7-bit I2C address.
|
||||
*/
|
||||
//% shim=micro_bit::pitch help=pins/analog-pitch weight=14 async
|
||||
export function analogPitch(frequency: number, ms: number): void { }
|
||||
export function i2cWriteNumber(address: number, value: number, format: NumberFormat): void {
|
||||
let buf = createBuffer(pins.sizeOf(format))
|
||||
buf.setNumber(format, 0, value)
|
||||
pins.i2cWriteBuffer(address, buf)
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the size in bytes of specified number format.
|
||||
*/
|
||||
export function sizeOf(format: NumberFormat) {
|
||||
switch (format) {
|
||||
case NumberFormat.Int8LE:
|
||||
case NumberFormat.UInt8LE:
|
||||
case NumberFormat.Int8BE:
|
||||
case NumberFormat.UInt8BE:
|
||||
return 1;
|
||||
case NumberFormat.Int16LE:
|
||||
case NumberFormat.UInt16LE:
|
||||
case NumberFormat.Int16BE:
|
||||
case NumberFormat.UInt16BE:
|
||||
return 2;
|
||||
case NumberFormat.Int32LE:
|
||||
case NumberFormat.Int32BE:
|
||||
return 4;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
interface Buffer {
|
||||
[index: number]: number;
|
||||
// rest defined in buffer.cpp
|
||||
}
|
||||
|
38
libs/microbit/pxt.json
Normal file
38
libs/microbit/pxt.json
Normal file
@ -0,0 +1,38 @@
|
||||
{
|
||||
"name": "microbit",
|
||||
"description": "The microbit core library",
|
||||
"installedVersion": "tsmdvf",
|
||||
"files": [
|
||||
"README.md",
|
||||
"dal.d.ts",
|
||||
"enums.d.ts",
|
||||
"shims.d.ts",
|
||||
"pxt-core.d.ts",
|
||||
"ksbit.h",
|
||||
"core.cpp",
|
||||
"pxt-helpers.ts",
|
||||
"helpers.ts",
|
||||
"images.cpp",
|
||||
"basic.cpp",
|
||||
"input.cpp",
|
||||
"input.ts",
|
||||
"control.ts",
|
||||
"control.cpp",
|
||||
"game.ts",
|
||||
"led.cpp",
|
||||
"led.ts",
|
||||
"music.ts",
|
||||
"pins.cpp",
|
||||
"pins.ts",
|
||||
"serial.cpp",
|
||||
"serial.ts",
|
||||
"buffer.cpp"
|
||||
],
|
||||
"public": true,
|
||||
"dependencies": {},
|
||||
"microbit": {
|
||||
"config": {
|
||||
"MESSAGE_BUS_LISTENER_DEFAULT_FLAGS": "MESSAGE_BUS_LISTENER_QUEUE_IF_BUSY"
|
||||
}
|
||||
}
|
||||
}
|
22
libs/microbit/serial.cpp
Normal file
22
libs/microbit/serial.cpp
Normal file
@ -0,0 +1,22 @@
|
||||
#include "ksbit.h"
|
||||
|
||||
//% weight=2 color=30
|
||||
namespace serial {
|
||||
// note that at least one // followed by % is needed per declaration!
|
||||
|
||||
/**
|
||||
* Reads a line of text from the serial port.
|
||||
*/
|
||||
//%
|
||||
StringData* readString() {
|
||||
return uBit.serial.readString().leakData();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a piece of text through Serial connection.
|
||||
*/
|
||||
//%
|
||||
void writeString(StringData *text) {
|
||||
uBit.serial.sendString(ManagedString(text));
|
||||
}
|
||||
}
|
@ -1,3 +1,6 @@
|
||||
/**
|
||||
* Reading and writing data over a serial connection.
|
||||
*/
|
||||
//% weight=2 color=30
|
||||
namespace serial {
|
||||
/**
|
||||
@ -17,32 +20,6 @@ namespace serial {
|
||||
writeString(value.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads a line of text from the serial port.
|
||||
*/
|
||||
//% shim=micro_bit::serialReadString
|
||||
export function readString(): string {
|
||||
return ""
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a piece of text through Serial connection.
|
||||
*/
|
||||
//% shim=micro_bit::serialSendString
|
||||
export function writeString(text: string): void { }
|
||||
|
||||
/**
|
||||
* Sends the current pixel values, byte-per-pixel, over serial.
|
||||
*/
|
||||
//% shim=micro_bit::serialSendDisplayState
|
||||
export function writeScreen(): void { }
|
||||
|
||||
/**
|
||||
* Reads the screen from serial.
|
||||
*/
|
||||
//% shim=micro_bit::serialReadDisplayState
|
||||
export function readScreen(): void { }
|
||||
|
||||
/**
|
||||
* Writes a ``name: value`` pair line to the serial.
|
||||
* @param name name of the value stream, eg: x
|
||||
|
547
libs/microbit/shims.d.ts
vendored
Normal file
547
libs/microbit/shims.d.ts
vendored
Normal file
@ -0,0 +1,547 @@
|
||||
// Auto-generated. Do not edit.
|
||||
|
||||
|
||||
/**
|
||||
* Creation, manipulation and display of LED images.
|
||||
*/
|
||||
//% color=45 weight=31
|
||||
declare namespace images {
|
||||
|
||||
/**
|
||||
* Creates an image that fits on the LED screen.
|
||||
*/
|
||||
//% weight=75 help=images/create-image
|
||||
//% blockId=device_build_image block="create image" imageLiteral=1 shim=images::createImage
|
||||
function createImage(leds: string): Image;
|
||||
|
||||
/**
|
||||
* Creates an image with 2 frames.
|
||||
*/
|
||||
//% weight=74 help=images/create-big-image
|
||||
//% blockId=device_build_big_image block="create big image" imageLiteral=2 shim=images::createBigImage
|
||||
function createBigImage(leds: string): Image;
|
||||
}
|
||||
|
||||
|
||||
declare interface Image {
|
||||
/**
|
||||
* Shows an frame from the image at offset ``x offset``.
|
||||
* @param xOffset TODO
|
||||
*/
|
||||
//% help=images/show-image weight=80 async
|
||||
//% BUGblockId=device_show_image_offset block="show image %sprite|at offset %offset" blockGap=8 xOffset.defl=0 shim=ImageMethods::showImage
|
||||
showImage(xOffset?: number): void;
|
||||
|
||||
/**
|
||||
* Scrolls an image .
|
||||
* @param frameOffset x offset moved on each animation step, eg: 5, 1, -1
|
||||
* @param interval time between each animation step in milli seconds, eg: 200
|
||||
*/
|
||||
//% help=images/show-image weight=79 async
|
||||
//% BUGblockId=device_scroll_image block="scroll image %sprite|with offset %frameoffset|and interval (ms) %delay" blockGap=8 frameOffset.defl=0 interval.defl=200 shim=ImageMethods::scrollImage
|
||||
scrollImage(frameOffset?: number, interval?: number): void;
|
||||
|
||||
/**
|
||||
* Plots the image at a given column to the screen
|
||||
*/
|
||||
//% help=images/plot-image xOffset.defl=0 shim=ImageMethods::plotImage
|
||||
plotImage(xOffset?: number): void;
|
||||
|
||||
/**
|
||||
* Sets all pixels off.
|
||||
*/
|
||||
//% help=images/clear shim=ImageMethods::clear
|
||||
clear(): void;
|
||||
|
||||
/**
|
||||
* Sets a specific pixel brightness at a given position
|
||||
*/
|
||||
//% help= shim=ImageMethods::setPixelBrightness
|
||||
setPixelBrightness(x: number, y: number, value: number): void;
|
||||
|
||||
/**
|
||||
* Gets the pixel brightness ([0..255]) at a given position
|
||||
*/
|
||||
//% help= shim=ImageMethods::pixelBrightness
|
||||
pixelBrightness(x: number, y: number): number;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Provides access to basic micro:bit functionality.
|
||||
*/
|
||||
//% color=190 weight=100
|
||||
declare namespace basic {
|
||||
|
||||
/**
|
||||
* Scroll a number on the screen. If the number fits on the screen (i.e. is a single digit), do not scroll.
|
||||
* @param interval speed of scroll; eg: 150, 100, 200, -100
|
||||
*/
|
||||
//% help=basic/show-number
|
||||
//% weight=96
|
||||
//% blockId=device_show_number block="show|number %number" blockGap=8 icon="\uf1ec"
|
||||
//% async interval.defl=150 shim=basic::showNumber
|
||||
function showNumber(value: number, interval?: number): void;
|
||||
|
||||
/**
|
||||
* Draws an image on the LED screen.
|
||||
* @param leds TODO
|
||||
* @param interval TODO
|
||||
*/
|
||||
//% help=basic/show-leds
|
||||
//% weight=95 blockGap=8
|
||||
//% imageLiteral=1 async
|
||||
//% blockId=device_show_leds
|
||||
//% block="show leds" icon="\uf00a" interval.defl=400 shim=basic::showLeds
|
||||
function showLeds(leds: string, interval?: number): void;
|
||||
|
||||
/**
|
||||
* Display text on the display, one character at a time. If the string fits on the screen (i.e. is one letter), does not scroll.
|
||||
* @param text the text to scroll on the screen, eg: "Hello!"
|
||||
* @param interval how fast to shift characters; eg: 150, 100, 200, -100
|
||||
*/
|
||||
//% help=basic/show-string
|
||||
//% weight=87 blockGap=8
|
||||
//% block="show|string %text" icon="\uf031"
|
||||
//% async
|
||||
//% blockId=device_print_message interval.defl=150 shim=basic::showString
|
||||
function showString(text: string, interval?: number): void;
|
||||
|
||||
/**
|
||||
* Turn off all LEDs
|
||||
*/
|
||||
//% help=basic/clear-screen weight=79
|
||||
//% blockId=device_clear_display block="clear screen" icon="\uf12d" shim=basic::clearScreen
|
||||
function clearScreen(): void;
|
||||
|
||||
/**
|
||||
* Shows a sequence of LED screens as an animation.
|
||||
* @param leds TODO
|
||||
* @param interval TODO
|
||||
*/
|
||||
//% help=basic/show-animation imageLiteral=1 async interval.defl=400 shim=basic::showAnimation
|
||||
function showAnimation(leds: string, interval?: number): void;
|
||||
|
||||
/**
|
||||
* Draws an image on the LED screen.
|
||||
* @param leds TODO
|
||||
*/
|
||||
//% help=basic/plot-leds weight=80 imageLiteral=1 shim=basic::plotLeds
|
||||
function plotLeds(leds: string): void;
|
||||
|
||||
/**
|
||||
* Repeats the code forever in the background. On each iteration, allows other codes to run.
|
||||
* @param body TODO
|
||||
*/
|
||||
//% help=basic/forever weight=55 blockGap=8
|
||||
//% blockId=device_forever block="forever" icon="\uf01e" shim=basic::forever
|
||||
function forever(a: () => void): void;
|
||||
|
||||
/**
|
||||
* Pause for the specified time in milliseconds
|
||||
* @param ms how long to pause for, eg: 100, 200, 500, 1000, 2000
|
||||
*/
|
||||
//% help=basic/pause weight=54
|
||||
//% async block="pause (ms) %pause"
|
||||
//% blockId=device_pause icon="\uf110" shim=basic::pause
|
||||
function pause(ms: number): void;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//% color=300 weight=99
|
||||
declare namespace input {
|
||||
|
||||
/**
|
||||
* Do something when a button (``A``, ``B`` or both ``A+B``) is pressed
|
||||
* @param button TODO
|
||||
* @param body TODO
|
||||
*/
|
||||
//% help=input/on-button-pressed weight=85
|
||||
//% blockId=device_button_event
|
||||
//% block="on button|%NAME|pressed"
|
||||
//% icon="\uf192" shim=input::onButtonPressed
|
||||
function onButtonPressed(button: Button, body: () => void): void;
|
||||
|
||||
/**
|
||||
* Attaches code to run when the screen is facing up.
|
||||
* @param body TODO
|
||||
*/
|
||||
//% help=input/on-gesture weight=84
|
||||
//% blockId=device_gesture_event block="on |%NAME" icon="\uf135" shim=input::onGesture
|
||||
function onGesture(gesture: Gesture, body: () => void): void;
|
||||
|
||||
/**
|
||||
* Do something when a pin(``P0``, ``P1`` or both ``P2``) is pressed.
|
||||
* @param name TODO
|
||||
* @param body TODO
|
||||
*/
|
||||
//% help=input/on-pin-pressed weight=83
|
||||
//% blockId=device_pin_event block="on pin|%NAME|pressed" icon="\uf094" shim=input::onPinPressed
|
||||
function onPinPressed(name: TouchPin, body: () => void): void;
|
||||
|
||||
/**
|
||||
* Get the button state (pressed or not) for ``A`` and ``B``.
|
||||
*/
|
||||
//% help=input/button-is-pressed weight=57
|
||||
//% block="button|%NAME|is pressed"
|
||||
//% blockId=device_get_button2
|
||||
//% icon="\uf192" blockGap=8 shim=input::buttonIsPressed
|
||||
function buttonIsPressed(button: Button): boolean;
|
||||
|
||||
/**
|
||||
* Get the current compass compass heading in degrees.
|
||||
*/
|
||||
//% help=input/compass-heading
|
||||
//% weight=56 icon="\uf14e"
|
||||
//% blockId=device_heading block="compass heading (°)" blockGap=8 shim=input::compassHeading
|
||||
function compassHeading(): number;
|
||||
|
||||
/**
|
||||
* Gets the temperature in Celsius degrees (°C).
|
||||
*/
|
||||
//% weight=55 icon="\uf06d"
|
||||
//% help=input/temperature
|
||||
//% blockId=device_temperature block="temperature (°C)" blockGap=8 shim=input::temperature
|
||||
function temperature(): number;
|
||||
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
//% help=input/acceleration weight=54 icon="\uf135"
|
||||
//% blockId=device_acceleration block="acceleration (mg)|%NAME" blockGap=8 shim=input::acceleration
|
||||
function acceleration(dimension: Dimension): number;
|
||||
|
||||
/**
|
||||
* Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright. In the simulator, the ``acceleration y`` is used to emulate this value.
|
||||
*/
|
||||
//% help=input/light-level weight=53
|
||||
//% blockId=device_get_light_level block="light level" blockGap=8 icon="\uf185" shim=input::lightLevel
|
||||
function lightLevel(): number;
|
||||
|
||||
/**
|
||||
* The pitch of the device, rotation along the ``x-axis``, in degrees.
|
||||
* @param kind TODO
|
||||
*/
|
||||
//% help=/input/rotation weight=52
|
||||
//% blockId=device_get_rotation block="rotation (°)|%NAME" blockGap=8 icon="\uf197" shim=input::rotation
|
||||
function rotation(kind: Rotation): number;
|
||||
|
||||
/**
|
||||
* Get the magnetic force value in ``micro-Teslas`` (``µT``). This function is not supported in the simulator.
|
||||
* @param dimension TODO
|
||||
*/
|
||||
//% help=input/magnetic-force weight=51
|
||||
//% blockId=device_get_magnetic_force block="magnetic force (µT)|%NAME" blockGap=8 icon="\uf076" shim=input::magneticForce
|
||||
function magneticForce(dimension: Dimension): number;
|
||||
|
||||
/**
|
||||
* Gets the number of milliseconds elapsed since power on.
|
||||
*/
|
||||
//% help=input/running-time weight=50
|
||||
//% blockId=device_get_running_time block="running time (ms)" icon="\uf017" shim=input::runningTime
|
||||
function runningTime(): number;
|
||||
|
||||
/**
|
||||
* Obsolete, compass calibration is automatic.
|
||||
*/
|
||||
//% help=input/calibrate weight=0 shim=input::calibrate
|
||||
function calibrate(): void;
|
||||
|
||||
/**
|
||||
* Get the pin state (pressed or not). Requires to hold the ground to close the circuit.
|
||||
* @param name pin used to detect the touch
|
||||
*/
|
||||
//% help=input/pin-is-pressed weight=58 block="pin|%NAME|is pressed" icon="\uf094" shim=input::pinIsPressed
|
||||
function pinIsPressed(name: TouchPin): boolean;
|
||||
|
||||
/**
|
||||
* Sets the accelerometer sample range in gravities.
|
||||
* @param range a value describe the maximum strengh of acceleration measured
|
||||
*/
|
||||
//% help=input/set-accelerator-range
|
||||
//% blockId=device_set_accelerometer_range block="set accelerometer|range %range" icon="\uf135"
|
||||
//% weight=5 shim=input::setAccelerometerRange
|
||||
function setAccelerometerRange(range: AcceleratorRange): void;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//% weight=1 color="#333333"
|
||||
declare namespace control {
|
||||
|
||||
/**
|
||||
* Schedules code that run in the background.
|
||||
*/
|
||||
//% help=control/in-background
|
||||
//% blockId="control_in_background" block="run in background" blockGap=8 shim=control::inBackground
|
||||
function inBackground(a: () => void): void;
|
||||
|
||||
/**
|
||||
* Resets the BBC micro:bit.
|
||||
*/
|
||||
//% weight=30 async help=control/reset
|
||||
//% blockId="control_reset" block="reset" shim=control::reset
|
||||
function reset(): void;
|
||||
|
||||
/**
|
||||
* Raises an event in the event bus.
|
||||
* @param src ID of the MicroBit Component that generated the event e.g. MICROBIT_ID_BUTTON_A.
|
||||
* @param value Component specific code indicating the cause of the event.
|
||||
* @param mode optional definition of how the event should be processed after construction (default is CREATE_AND_QUEUE).
|
||||
*/
|
||||
//% weight=21 blockGap=12 blockId="control_raise_event" block="raise event|from source %src=control_event_source|with value %value=control_event_value" blockExternalInputs=1
|
||||
//% mode.defl=1 shim=control::raiseEvent
|
||||
function raiseEvent(src: number, value: number, mode?: EventCreationMode): void;
|
||||
|
||||
/**
|
||||
* Raises an event in the event bus.
|
||||
*/
|
||||
//% weight=20 blockGap=8 blockId="control_on_event" block="on event|from %src=control_event_source|with value %value=control_event_value"
|
||||
//% blockExternalInputs=1 blockStatement=1 shim=control::onEvent
|
||||
function onEvent(src: number, value: number, handler: () => void): void;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//% color=3 weight=35
|
||||
declare namespace led {
|
||||
|
||||
/**
|
||||
* Turn on the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.
|
||||
* @param x TODO
|
||||
* @param y TODO
|
||||
*/
|
||||
//% help=led/plot weight=78
|
||||
//% blockId=device_plot block="plot|x %x|y %y" icon="\uf205" blockGap=8 shim=led::plot
|
||||
function plot(x: number, y: number): void;
|
||||
|
||||
/**
|
||||
* Turn off the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.
|
||||
* @param x TODO
|
||||
* @param y TODO
|
||||
*/
|
||||
//% help=led/unplot weight=77
|
||||
//% blockId=device_unplot block="unplot|x %x|y %y" icon="\uf204" blockGap=8 shim=led::unplot
|
||||
function unplot(x: number, y: number): void;
|
||||
|
||||
/**
|
||||
* Get the on/off state of the specified LED using x, y coordinates. (0,0) is upper left.
|
||||
* @param x TODO
|
||||
* @param y TODO
|
||||
*/
|
||||
//% help=led/point weight=76
|
||||
//% blockId=device_point block="point|x %x|y %y" icon="\uf10c" shim=led::point
|
||||
function point(x: number, y: number): boolean;
|
||||
|
||||
/**
|
||||
* Get the screen brightness from 0 (off) to 255 (full bright).
|
||||
*/
|
||||
//% help=led/brightness weight=60
|
||||
//% blockId=device_get_brightness block="brightness" icon="\uf042" blockGap=8 shim=led::brightness
|
||||
function brightness(): number;
|
||||
|
||||
/**
|
||||
* Set the screen brightness from 0 (off) to 255 (full bright).
|
||||
* @param value the brightness value, eg:255, 127, 0
|
||||
*/
|
||||
//% help=led/set-brightness weight=59
|
||||
//% blockId=device_set_brightness block="set brightness %value" icon="\uf042" shim=led::setBrightness
|
||||
function setBrightness(value: number): void;
|
||||
|
||||
/**
|
||||
* Cancels the current animation and clears other pending animations.
|
||||
*/
|
||||
//% weight=50 help=led/stop-animation
|
||||
//% blockId=device_stop_animation block="stop animation" icon="\uf04d" shim=led::stopAnimation
|
||||
function stopAnimation(): void;
|
||||
|
||||
/**
|
||||
* Sets the display mode between black and white and greyscale for rendering LEDs.
|
||||
* @param mode TODO
|
||||
*/
|
||||
//% weight=1 help=/led/set-display-mode shim=led::setDisplayMode
|
||||
function setDisplayMode(mode: DisplayMode): void;
|
||||
|
||||
/**
|
||||
* Takes a screenshot of the LED screen and returns an image.
|
||||
*/
|
||||
//% help=led/screenshot shim=led::screenshot
|
||||
function screenshot(): Image;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//% color=351 weight=30
|
||||
declare namespace pins {
|
||||
|
||||
/**
|
||||
* Read the specified pin or connector as either 0 or 1
|
||||
* @param name pin to read from
|
||||
*/
|
||||
//% help=pins/digital-read-pin weight=30
|
||||
//% blockId=device_get_digital_pin block="digital read|pin %name" blockGap=8 shim=pins::digitalReadPin
|
||||
function digitalReadPin(name: DigitalPin): number;
|
||||
|
||||
/**
|
||||
* Set a pin or connector value to either 0 or 1.
|
||||
* @param name pin to write to
|
||||
* @param value value to set on the pin, 1 eg,0
|
||||
*/
|
||||
//% help=pins/digital-write-pin weight=29
|
||||
//% blockId=device_set_digital_pin block="digital write|pin %name|to %value" shim=pins::digitalWritePin
|
||||
function digitalWritePin(name: DigitalPin, value: number): void;
|
||||
|
||||
/**
|
||||
* Read the connector value as analog, that is, as a value comprised between 0 and 1023.
|
||||
* @param name pin to write to
|
||||
*/
|
||||
//% help=pins/analog-read-pin weight=25
|
||||
//% blockId=device_get_analog_pin block="analog read|pin %name" blockGap="8" shim=pins::analogReadPin
|
||||
function analogReadPin(name: AnalogPin): number;
|
||||
|
||||
/**
|
||||
* Set the connector value as analog. Value must be comprised between 0 and 1023.
|
||||
* @param name pin name to write to
|
||||
* @param value value to write to the pin between ``0`` and ``1023``. eg:1023,0
|
||||
*/
|
||||
//% help=pins/analog-write-pin weight=24
|
||||
//% blockId=device_set_analog_pin block="analog write|pin %name|to %value" blockGap=8 shim=pins::analogWritePin
|
||||
function analogWritePin(name: AnalogPin, value: number): void;
|
||||
|
||||
/**
|
||||
* 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.
|
||||
* @param name analog pin to set period to
|
||||
* @param micros period in micro seconds. eg:20000
|
||||
*/
|
||||
//% help=pins/analog-set-period weight=23
|
||||
//% blockId=device_set_analog_period block="analog set period|pin %pin|to (µs)%micros" shim=pins::analogSetPeriod
|
||||
function analogSetPeriod(name: AnalogPin, micros: number): void;
|
||||
|
||||
/**
|
||||
* 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 value angle or rotation speed, eg:180,90,0
|
||||
*/
|
||||
//% help=pins/servo-write-pin weight=20
|
||||
//% blockId=device_set_servo_pin block="servo write|pin %name|to %value" blockGap=8 shim=pins::servoWritePin
|
||||
function servoWritePin(name: AnalogPin, value: number): void;
|
||||
|
||||
/**
|
||||
* 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.
|
||||
* @param name pin name
|
||||
* @param micros pulse duration in micro seconds, eg:1500
|
||||
*/
|
||||
//% help=pins/serial-set-pulse weight=19
|
||||
//% blockId=device_set_servo_pulse block="servo set pulse|pin %value|to (µs) %micros" shim=pins::servoSetPulse
|
||||
function servoSetPulse(name: AnalogPin, micros: number): void;
|
||||
|
||||
/**
|
||||
* Sets the pin used when using `pins->analog pitch`.
|
||||
* @param name TODO
|
||||
*/
|
||||
//% help=pins/analog-set-pitch weight=12 shim=pins::analogSetPitchPin
|
||||
function analogSetPitchPin(name: AnalogPin): void;
|
||||
|
||||
/**
|
||||
* Emits a Pulse-width modulation (PWM) signal to the current pitch pin. Use `analog set pitch pin` to define the pitch pin.
|
||||
* @param frequency TODO
|
||||
* @param ms TODO
|
||||
*/
|
||||
//% help=pins/analog-pitch weight=14 async shim=pins::analogPitch
|
||||
function analogPitch(frequency: number, ms: number): void;
|
||||
|
||||
/**
|
||||
* Create a new zero-initialized buffer.
|
||||
* @param size number of bytes in the buffer
|
||||
*/
|
||||
//% shim=pins::createBuffer
|
||||
function createBuffer(size: number): Buffer;
|
||||
|
||||
/**
|
||||
* Read `size` bytes from a 7-bit I2C `address`.
|
||||
*/
|
||||
//% repeat.defl=0 shim=pins::i2cReadBuffer
|
||||
function i2cReadBuffer(address: number, size: number, repeat?: boolean): Buffer;
|
||||
|
||||
/**
|
||||
* Write bytes to a 7-bit I2C `address`.
|
||||
*/
|
||||
//% repeat.defl=0 shim=pins::i2cWriteBuffer
|
||||
function i2cWriteBuffer(address: number, buf: Buffer, repeat?: boolean): void;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//% weight=2 color=30
|
||||
declare namespace serial {
|
||||
|
||||
/**
|
||||
* Reads a line of text from the serial port.
|
||||
*/
|
||||
//% shim=serial::readString
|
||||
function readString(): string;
|
||||
|
||||
/**
|
||||
* Sends a piece of text through Serial connection.
|
||||
*/
|
||||
//% shim=serial::writeString
|
||||
function writeString(text: string): void;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//% indexerGet=BufferMethods::getByte indexerSet=BufferMethods::setByte
|
||||
declare interface Buffer {
|
||||
/**
|
||||
* Write a number in specified format in the buffer.
|
||||
*/
|
||||
//% shim=BufferMethods::setNumber
|
||||
setNumber(format: NumberFormat, offset: number, value: number): void;
|
||||
|
||||
/**
|
||||
* Read a number in specified format from the buffer.
|
||||
*/
|
||||
//% shim=BufferMethods::getNumber
|
||||
getNumber(format: NumberFormat, offset: number): number;
|
||||
|
||||
/** Returns the length of a Buffer object. */
|
||||
//% property shim=BufferMethods::length
|
||||
length: number;
|
||||
|
||||
/**
|
||||
* Fill (a fragment) of the buffer with given value.
|
||||
*/
|
||||
//% offset.defl=0 length.defl=-1 shim=BufferMethods::fill
|
||||
fill(value: number, offset?: number, length?: number): void;
|
||||
|
||||
/**
|
||||
* Return a copy of a fragment of a buffer.
|
||||
*/
|
||||
//% offset.defl=0 length.defl=-1 shim=BufferMethods::slice
|
||||
slice(offset?: number, length?: number): Buffer;
|
||||
|
||||
/**
|
||||
* Shift buffer left in place, with zero padding.
|
||||
* @param offset number of bytes to shift; use negative value to shift right
|
||||
*/
|
||||
//% shim=BufferMethods::shift
|
||||
shift(offset: number): void;
|
||||
|
||||
/**
|
||||
* Rotate buffer left in place.
|
||||
* @param offset number of bytes to shift; use negative value to shift right
|
||||
*/
|
||||
//% shim=BufferMethods::rotate
|
||||
rotate(offset: number): void;
|
||||
|
||||
/**
|
||||
* Write contents of `src` at `dstOffset` in current buffer.
|
||||
*/
|
||||
//% shim=BufferMethods::write
|
||||
write(dstOffset: number, src: Buffer): void;
|
||||
}
|
||||
|
||||
// Auto-generated. Do not edit. Really.
|
47
libs/neopixel/README.md
Normal file
47
libs/neopixel/README.md
Normal file
@ -0,0 +1,47 @@
|
||||
# NeoPixel driver
|
||||
|
||||
This library provides a driver for various Neo Pixel LED strips,
|
||||
see https://www.adafruit.com/category/168
|
||||
|
||||
NeoPixels consist of a number of RGB LEDs, every one of them controlled
|
||||
separately.
|
||||
|
||||
## Basic usage
|
||||
|
||||
```
|
||||
// Create a NeoPixel driver - specify the number of LEDs:
|
||||
let strip = neopixel.create(24)
|
||||
|
||||
// set pixel colors
|
||||
strip.setPix(0, 255, 255, 255) // white
|
||||
strip.setPix(1, 255, 0, 0) // red
|
||||
strip.setPix(2, 0, 255, 0) // green
|
||||
strip.setPix(3, 0, 0, 255) // blue
|
||||
|
||||
// send the data to the strip
|
||||
strip.display()
|
||||
```
|
||||
|
||||
Use `strip.setPin()` if your strip is not at `P0`.
|
||||
|
||||
Use `strip.setBrigthness()` to lower the brightness (it's maxed out by default).
|
||||
|
||||
Use `strip.shift()` or `strip.rotate()` to shift the lights around.
|
||||
|
||||
## Example: Using accelerometer to control colors
|
||||
|
||||
This little program will let the position of the microbit control the color of the first LED.
|
||||
This first LED will then get shifted further away every 100ms.
|
||||
|
||||
```
|
||||
let strip = neopixel.create(24)
|
||||
while (true) {
|
||||
let x = input.acceleration(Dimension.X) / 2
|
||||
let y = input.acceleration(Dimension.Y) / 2
|
||||
let z = input.acceleration(Dimension.Z) / 2
|
||||
strip.setPix(0, x, y, -z);
|
||||
strip.shift(1);
|
||||
strip.display();
|
||||
basic.pause(100);
|
||||
}
|
||||
```
|
88
libs/neopixel/neopixel.ts
Normal file
88
libs/neopixel/neopixel.ts
Normal file
@ -0,0 +1,88 @@
|
||||
namespace neopixel {
|
||||
|
||||
//% shim=sendBufferAsm
|
||||
function sendBuffer(buf: Buffer, pin: DigitalPin) {
|
||||
}
|
||||
|
||||
class Strip {
|
||||
buf: Buffer;
|
||||
pin: DigitalPin;
|
||||
brightness: number;
|
||||
|
||||
length() {
|
||||
return this.buf.length / 3
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the brightness of the strip, 0-255.
|
||||
*/
|
||||
setBrigthness(brightness: number): void {
|
||||
this.brightness = brightness;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the pin where the neopixel is connected, defaults to P0.
|
||||
*/
|
||||
setPin(pin: DigitalPin): void {
|
||||
this.pin = pin;
|
||||
pins.digitalWritePin(this.pin, 0)
|
||||
basic.pause(50)
|
||||
}
|
||||
|
||||
/**
|
||||
* Turn off all LEDs.
|
||||
*/
|
||||
clear(): void {
|
||||
this.buf.fill(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shift LEDs forward.
|
||||
*/
|
||||
shift(off: number = 1): void {
|
||||
this.buf.shift(-off * 3)
|
||||
}
|
||||
|
||||
/**
|
||||
* Shift LEDs forward.
|
||||
*/
|
||||
rotate(): void {
|
||||
this.buf.rotate(-3)
|
||||
}
|
||||
|
||||
display() {
|
||||
basic.pause(1)
|
||||
sendBuffer(this.buf, this.pin);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set give LED to a given color (range 0-255 for r, g, b)
|
||||
*/
|
||||
setPix(ledoff: number, r: number, g: number, b: number): void {
|
||||
ledoff = ledoff * 3;
|
||||
let br = this.brightness;
|
||||
if (br < 255) {
|
||||
r = (Math.clamp(0, 255, r) * br) >> 8;
|
||||
g = (Math.clamp(0, 255, b) * br) >> 8;
|
||||
b = (Math.clamp(0, 255, b) * br) >> 8;
|
||||
}
|
||||
let buf = this.buf;
|
||||
buf[ledoff + 0] = Math.clamp(0, 255, g);
|
||||
buf[ledoff + 1] = Math.clamp(0, 255, r);
|
||||
buf[ledoff + 2] = Math.clamp(0, 255, b);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new NeoPixel driver for `numleds` LEDs.
|
||||
* @params numleds number of leds in the strip, eg: 24,30,60,64
|
||||
*/
|
||||
export function create(numleds: number): Strip {
|
||||
let strip = new Strip();
|
||||
strip.buf = pins.createBuffer(numleds * 3);
|
||||
strip.setBrigthness(255)
|
||||
strip.setPin(DigitalPin.P0)
|
||||
return strip;
|
||||
}
|
||||
|
||||
}
|
47
libs/neopixel/neotest.ts
Normal file
47
libs/neopixel/neotest.ts
Normal file
@ -0,0 +1,47 @@
|
||||
let strip = neopixel.create(24);
|
||||
let br = 100;
|
||||
strip.setBrigthness(100);
|
||||
input.onButtonPressed(Button.B, () => {
|
||||
br = br + 20;
|
||||
if (br > 255) {
|
||||
br = 5;
|
||||
}
|
||||
strip.setBrigthness(br);
|
||||
});
|
||||
|
||||
let rotationMode = false;
|
||||
input.onButtonPressed(Button.A, () => {
|
||||
rotationMode = !rotationMode;
|
||||
if (rotationMode) {
|
||||
basic.showLeds(`
|
||||
. # # # .
|
||||
# . . . #
|
||||
# . . . #
|
||||
# . . . #
|
||||
. # # # .
|
||||
`);
|
||||
} else {
|
||||
basic.showLeds(`
|
||||
. . # . .
|
||||
. . . # .
|
||||
# # # # #
|
||||
. . . # .
|
||||
. . # . .
|
||||
`);
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
while (true) {
|
||||
let x = input.acceleration(Dimension.X) / 2
|
||||
let y = input.acceleration(Dimension.Y) / 2
|
||||
let z = input.acceleration(Dimension.Z) / 2
|
||||
if (rotationMode) {
|
||||
strip.rotate();
|
||||
} else {
|
||||
strip.setPix(0, x, y, -z);
|
||||
strip.shift(1);
|
||||
}
|
||||
strip.display();
|
||||
basic.pause(100);
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user