Compare commits

...

132 Commits

Author SHA1 Message Date
2798b579a6 0.2.43 2016-04-07 12:53:53 -07:00
9d23f82238 Bump pxt-core to 0.2.44 2016-04-07 12:53:51 -07:00
ce53d5c386 Renaming stuff in the simulator 2016-04-07 12:52:02 -07:00
5d3471b3b2 0.2.42 2016-04-07 11:41:51 -07:00
08b9b10ac8 Files renamed 2016-04-07 11:41:39 -07:00
404d7cc4a2 Bump pxt-core to 0.2.43 2016-04-07 11:41:23 -07:00
7c43739e4b Rename references 2016-04-07 11:30:22 -07:00
92d8adfdbd Rename json files 2016-04-07 11:30:07 -07:00
0f273131f6 0.2.41 2016-04-07 09:46:17 -07:00
9ae0c48477 Bump kindscript to 0.2.42 2016-04-07 09:46:15 -07:00
5f538f418e 0.2.40 2016-04-07 09:18:35 -07:00
859b68b6e3 Bump kindscript to 0.2.41 2016-04-07 09:18:33 -07:00
6576f7bd66 better handlings of logs 2016-04-07 09:03:21 -07:00
5a670f3291 0.2.39 2016-04-07 06:45:52 -07:00
7129487618 0.2.38 2016-04-07 06:34:15 -07:00
e1797b457a Bump kindscript to 0.2.39 2016-04-07 06:34:14 -07:00
c82efa452d 0.2.37 2016-04-07 04:48:45 -07:00
493014af01 Bump kindscript to 0.2.38 2016-04-07 04:48:43 -07:00
fb4a96d81b 0.2.36 2016-04-07 03:56:24 -07:00
bbf115f33c Bump kindscript to 0.2.36 2016-04-07 03:56:22 -07:00
5d9c2cf590 svg refactored into kindsim 2016-04-07 03:52:32 -07:00
b99231f6e2 0.2.35 2016-04-06 18:24:27 -07:00
2676907129 Bump kindscript to 0.2.35 2016-04-06 18:24:25 -07:00
6f4c533ebb 0.2.34 2016-04-06 16:41:29 -07:00
85dcaea979 0.2.33 2016-04-06 16:36:41 -07:00
8560b31657 Bump kindscript to 0.2.33 2016-04-06 16:36:40 -07:00
b896588f45 0.2.32 2016-04-06 16:09:30 -07:00
0b4d4facfe fix target 2016-04-06 16:09:20 -07:00
52ad897ee3 0.2.31 2016-04-06 15:49:03 -07:00
72582f2a60 updated title 2016-04-06 15:48:45 -07:00
2b2048da7d 0.2.30 2016-04-06 15:34:37 -07:00
e85fa990bd Bump kindscript to 0.2.31 2016-04-06 15:34:35 -07:00
81a61538c3 updated target 2016-04-06 15:23:58 -07:00
cc8751bd09 updated target 2016-04-06 15:12:55 -07:00
03f933a1c8 0.2.29 2016-04-06 14:02:53 -07:00
10a77d9fef Bump kindscript to 0.2.30 2016-04-06 14:02:51 -07:00
773f8a8688 0.2.28 2016-04-06 08:05:40 -07:00
f67743d935 Bump kindscript to 0.2.29 2016-04-06 08:05:38 -07:00
237a57ee86 updated logos 2016-04-06 07:32:14 -07:00
b80edb43fc removing some serial functions 2016-04-06 07:00:34 -07:00
6c9b609fe0 annotate math namespace 2016-04-06 06:16:59 -07:00
26d78768c0 0.2.27 2016-04-05 23:15:42 -07:00
6812767555 Bump kindscript to 0.2.28 2016-04-05 23:15:39 -07:00
2aa7c91ca7 various docs updates 2016-04-05 23:11:48 -07:00
baf2c3247f Merge branch 'master' of https://github.com/Microsoft/kindscript-microbit 2016-04-05 20:49:54 -07:00
c9536b0cf2 Use constant for end of memory 2016-04-05 19:19:27 -07:00
7fd7e15bd4 Add README.md to kind.json 2016-04-05 19:02:12 -07:00
948b0ef304 Add readme to neopixel 2016-04-05 18:21:24 -07:00
715771b991 Add readme to i2c fram module 2016-04-05 18:21:15 -07:00
65d48f4b02 Add FRAM driver 2016-04-05 17:25:45 -07:00
283c331a5e moving namespace docs 2016-04-05 16:54:09 -07:00
ba96e94fa7 added jsdoc 2016-04-05 16:52:50 -07:00
7e1248b8dc 0.2.26 2016-04-05 16:15:58 -07:00
cbe280187a Bump kindscript to 0.2.26 2016-04-05 16:15:56 -07:00
761e4f38cd adding namespace descriptions 2016-04-05 15:59:25 -07:00
a9137f7761 first radio namespace docs 2016-04-05 14:10:53 -07:00
3274e237cf 0.2.25 2016-04-05 14:05:36 -07:00
5261b2b270 0.2.24 2016-04-05 13:54:55 -07:00
1adede163a Bump kindscript to 0.2.25 2016-04-05 13:54:53 -07:00
bb80874ef9 fixing docs enum 2016-04-05 13:54:48 -07:00
9e9d11cb94 0.2.23 2016-04-05 13:28:03 -07:00
c004aa4b1b Bump kindscript to 0.2.24 2016-04-05 13:28:01 -07:00
cdd4798945 namspace docs 2016-04-05 13:23:42 -07:00
0f56142317 updated about 2016-04-05 10:36:23 -07:00
6927085d64 0.2.22 2016-04-04 22:46:48 -07:00
c1b654f092 Bump kindscript to 0.2.23 2016-04-04 22:46:46 -07:00
2f551c97b5 0.2.21 2016-04-04 22:38:41 -07:00
01e6aab376 0.2.20 2016-04-04 22:33:39 -07:00
df17ba09ae updated links 2016-04-04 22:33:13 -07:00
9c09a427c9 0.2.19 2016-04-04 22:17:12 -07:00
4b35f0f751 Bump kindscript to 0.2.22 2016-04-04 22:17:10 -07:00
bb03cc4357 static microbit image (svg) 2016-04-04 22:15:52 -07:00
6f8b17e4ba 0.2.18 2016-04-04 21:52:10 -07:00
60c5dfc539 Bump kindscript to 0.2.21 2016-04-04 21:52:09 -07:00
bca5839b49 Forever moved to common sim 2016-04-04 21:52:03 -07:00
47e3737245 Use common helpers/core 2016-04-04 21:18:16 -07:00
b8d5ec853e Prep for moving common stuff out to main ks 2016-04-04 20:28:08 -07:00
46d42e5300 0.2.17 2016-04-04 19:13:35 -07:00
ffabb9b16d Bump kindscript to 0.2.19 2016-04-04 19:13:34 -07:00
d62c10d278 Use the improved default parameters 2016-04-04 19:11:33 -07:00
e2b2aa7ff1 0.2.16 2016-04-04 19:04:04 -07:00
664c8dcd35 Bump kindscript to 0.2.18 2016-04-04 19:04:03 -07:00
bd7430b642 Add Buffer.get/setNumber and i2c methods 2016-04-04 19:02:40 -07:00
61fd28d840 Move all target stuff to kindtarget.json 2016-04-04 18:03:52 -07:00
c33df897d5 Remove unused code 2016-04-04 12:56:57 -07:00
3bb0bd2a9f 0.2.15 2016-04-04 09:50:05 -07:00
7751061b51 Bump kindscript to 0.2.17 2016-04-04 09:50:04 -07:00
88a7fa5038 0.2.14 2016-04-03 17:51:51 -07:00
3c8a62df54 Bump kindscript to 0.2.16 2016-04-03 17:51:50 -07:00
c661fd0eca Neopixel seems to work 2016-04-03 17:49:35 -07:00
8a124812b6 First draft of neopixel 2016-04-03 17:38:50 -07:00
02c41b59bd Add Buffer; go to core v0.1.5 2016-04-03 16:52:57 -07:00
b003af6eae Try to fix travis 2016-04-02 21:49:09 -07:00
5e5709e48d 0.2.13 2016-04-02 21:47:15 -07:00
dafb056730 Bump kindscript to 0.2.15 2016-04-02 21:47:14 -07:00
721ae893bb 0.2.12 2016-04-02 21:40:55 -07:00
45dd3fc1bf Bump kindscript to 0.2.14 2016-04-02 21:40:54 -07:00
9626207a61 Try to run lang-test0 during build 2016-04-02 21:36:00 -07:00
87b6e0aba1 Make lang-test0 work 2016-04-02 21:34:29 -07:00
0d9890cfac Add some image methods 2016-04-02 20:53:51 -07:00
5d40750542 Add missing control stuff 2016-04-02 20:47:27 -07:00
bd09754466 Move pin stuff to pins 2016-04-02 20:44:29 -07:00
5740133921 Moving simulator stuff into namespaces to match C++ 2016-04-02 20:35:38 -07:00
4e23553824 Naming fixes 2016-04-02 20:35:22 -07:00
9b68519aff Disable two image blocks - they crash block injection 2016-04-02 18:09:31 -07:00
e6dc3b8974 Remove shims 2016-04-02 17:49:31 -07:00
53634f4d6a Convert bluetooth to new style 2016-04-02 17:47:49 -07:00
3ee0c6ea42 Radio stuff moved for new style 2016-04-02 17:34:06 -07:00
ef098cbd28 Use -core v0.1.2 2016-04-02 14:18:10 -07:00
356b17cb13 Moving lang-test0 from kindscript main 2016-04-02 14:18:00 -07:00
47d382135b Use new APIs in the core 2016-04-02 13:44:29 -07:00
241da7fbed Add remaining shims 2016-04-02 11:22:36 -07:00
feb17c5e45 Remove remaining external shims 2016-04-01 22:46:06 -07:00
6559f386d2 Move most of core stuff 2016-04-01 22:32:33 -07:00
6bf46577f9 Migrate serial 2016-04-01 22:00:42 -07:00
0130ecb0c2 Remove shim=s 2016-04-01 21:53:50 -07:00
9820a035ce Migrate LED shims 2016-04-01 21:52:25 -07:00
88acd9254d Remove redundant shim annotations 2016-04-01 21:27:22 -07:00
650fe61dcd Move more stuff to C++ 2016-04-01 21:26:06 -07:00
c4e57e0165 0.2.11 2016-04-01 20:10:45 -07:00
a55ddcbab3 Bump kindscript to 0.2.11 2016-04-01 20:10:44 -07:00
f58508afa2 Event implementation 2016-04-01 19:59:14 -07:00
4b92de7516 Implement Images 2016-04-01 19:55:51 -07:00
6176963504 Fix pin names 2016-04-01 18:29:39 -07:00
37ec692dc4 0.2.10 2016-04-01 18:18:37 -07:00
1c2dc68479 Bump kindscript to 0.2.10 2016-04-01 18:18:36 -07:00
a33472dbd4 Merge branch 'master' of github.com:Microsoft/kindscript-microbit 2016-04-01 18:18:33 -07:00
746dc5d5ab Proper BLE setup 2016-04-01 18:01:44 -07:00
70bd81d9c2 Generate enums from C++ 2016-04-01 17:45:18 -07:00
400b9269ee Use the new enums 2016-04-01 15:44:04 -07:00
d54baaca51 Use the new enum syntax in devices as well 2016-04-01 14:18:11 -07:00
7c564ebaab Export constants from DAL in dal.d.ts 2016-04-01 14:14:57 -07:00
109 changed files with 5534 additions and 2665 deletions

View File

@ -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
View File

@ -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",

View File

@ -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([])
}
}
}

View File

@ -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.

View File

@ -1,5 +1,6 @@
# Lessons
### @short Lessons
### ~column

View File

@ -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, () => {})
```

View File

@ -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

View File

@ -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(() => {})
```

View File

@ -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

View File

@ -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(`
. . . . .
. . . . .

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)
```

View File

@ -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!")

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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(`

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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(() => {})
```

View File

@ -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(`
. . . . .

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -21,7 +21,7 @@ Learn how to get the **acceleration**, `acceleration` in one of three specified
## Documentation
```docs
```cards
basic.forever(() => {
})
let x = 0

View File

@ -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)
![](/static/mb/blocks/contents-22.jpg)
[on logo up](/microbit/reference/on-logo-up)
![](/static/mb/on-logo-up-0.jpg)
[on logo down](/microbit/reference/on-logo-down)
![](/static/mb/on-logo-down-0.jpg)
[on screen up](/microbit/reference/on-screen-up)
![](/static/mb/on-screen-up-0.jpg)
[on screen down](/microbit/reference/on-screen-down)
![](/static/mb/on-screen-down-0.jpg)
[button is pressed](/microbit/reference/button-is-pressed)
![](/static/mb/button-is-pressed-0.png)
[compass heading](/microbit/reference/compass-heading)
![](/static/mb/compass-heading-0.png)
[temperature](/microbit/reference/temperature)
![](/static/mb/temperature-0.png)
[acceleration](/microbit/reference/input/acceleration)
![](/static/mb/acceleration-0.png)
[rotation](/microbit/reference/rotation)
![](/static/mb/rotation-0.png)
[magnetic force](/microbit/reference/magnetic-force)
![](/static/mb/magnetic-force-0.png)
[running time](/microbit/reference/running-time)
![](/static/mb/running-time-0.png)
### Loops
[for](/microbit/reference/loops/for)
```block
for(let i = 0;i<5;i++) {}
```
[repeat](/microbit/reference/loops/repeat)
![](/static/mb/blocks/contents-0.png)
[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)
![](/static/mb/create-sprite-0.png)
[move](/microbit/reference/game/move)
![](/static/mb/game-library/move-0.png)
[turn](/microbit/reference/game/turn)
![](/static/mb/game-library/turn-0.png)
[change](/microbit/reference/game/change)
![](/static/mb/change-0.png)
[set](/microbit/reference/game/set)
![](/static/mb/blocks/contents-21.png)
[reports](/microbit/reference/reports)
![](/static/mb/game-library/position-0.png)
[touching](/microbit/reference/touching)
![](/static/mb/game-library/touching-0.png)
[touching edge](/microbit/reference/touching-edge)
![](/static/mb/game-library/touching-edge-0.png)
[if on edge, bounce](/microbit/reference/logic/if-on-edge-bounce)
![](/static/mb/game-library/if-on-edge-bounce-0.png)
[change score by](/microbit/reference/change-score-by)
![](/static/mb/game-library/pic1.png)
[score](/microbit/reference/score)
![](/static/mb/game-library/pic2.png)
[start countdown](/microbit/reference/start-countdown)
![](/static/mb/game-library/pic3.png)
[game over](/microbit/reference/game-over)
![](/static/mb/game-library/pic0.png)
### Music
[play tone](/microbit/reference/play-tone)
![](/static/mb/play-tone-0.jpg)
[ring tone](/microbit/reference/ring-tone)
![](/static/mb/ring-tone-0.jpg)
[rest](/microbit/reference/rest)
![](/static/mb/rest-0.jpg)
[tempo](/microbit/reference/tempo)
![](/static/mb/tempo-0.jpg)
[set tempo](/microbit/reference/set-tempo)
![](/static/mb/change-tempo-0.jpg)
[change tempo](/microbit/reference/music/set-tempo)
![](/static/mb/change-tempo-by-0.jpg)
### Comments
[comment](/microbit/reference/comment)
### Images
[show image](/microbit/reference/show-image)
![](/static/mb/show-image-0.png)
[scroll image](/microbit/reference/scroll-image)
![](/static/mb/scroll-image-0.png)
[create image](/microbit/reference/create-image)
![](/static/mb/create-image-0.png)
### ~
### ~column
### Pins
[digital read pin](/microbit/reference/pins/digital-read-pin)
![](/static/mb/digital-read-pin-0.png)
[digital write pin](/microbit/reference/pins/digital-write-pin)
![](/static/mb/digital-write-pin-0.png)
[analog read pin](/microbit/reference/pins/analog-read-pin)
![](/static/mb/analog-read-pin-0.png)
[analog write pin](/microbit/reference/pins/analog-write-pin)
![](/static/mb/blocks/contents-23.png)
[analog set period](/microbit/reference/pins/analog-set-period)
![](/static/mb/analog-set-period-0.png)
[servo write pin](/microbit/reference/pins/servo-write-pin)
![](/static/mb/servo-write-pin-0.png)
[servo set pulse](/microbit/reference/pins/servo-set-pulse)
![](/static/mb/servo-set-pulse-0.png)
[map](/microbit/reference/map)
![](/static/mb/map-0.png)
## Devices
Functions in this category require to be connected to a remote device.
[tell camera to](/microbit/reference/devices/tell-camera-to)
![](/static/mb/tell-camera-to-0.png)
[tell remote control to](/microbit/reference/devices/tell-remote-control-to)
![](/static/mb/tell-remote-control-to-0.png)
[raise alert to](/microbit/reference/devices/raise-alert-to)
![](/static/mb/raise-alert-to-0.png)
[on notified](/microbit/reference/on-notified)
![](/static/mb/on-notified-0.png)
[on gamepad button](/microbit/reference/on-gamepad-button)
![](/static/mb/on-gamepad-button-0.png)
[on notified](/microbit/reference/on-notified)
![](/static/mb/on-notified-0.png)
[signal strength](/microbit/reference/signal-strength)
![](/static/mb/blocks/contents-24.png)
[on signal strength changed](/microbit/reference/on-signal-strength-changed)
![](/static/mb/blocks/contents-25.png)
### ~

35
docs/reference/basic.md Normal file
View 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
View File

@ -0,0 +1,11 @@
# Control
```cards
control.inBackground(() => {
});
control.reset();
```

12
docs/reference/game.md Normal file
View 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
View File

@ -0,0 +1,21 @@
# Images
```cards
images.createImage(`
. . . . .
. . . . .
. . # . .
. . . . .
. . . . .
`);
images.createBigImage(`
. . . . .
. . . . .
. . # . .
. . . . .
. . . . .
`);
```

42
docs/reference/input.md Normal file
View 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(() => {
});
```

View File

@ -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
View 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
View 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
View File

@ -0,0 +1,26 @@
# Loops
Repeat code.
[for](/reference/loops/for)
```blocks
for(let i = 0;i<5;i++) {}
```
[repeat](/reference/loops/repeat)
![](/static/mb/blocks/contents-0.png)
[while](/reference/loops/while)
```blocks
while(true) {}
```
[forever](/reference/basic/forever)
```blocks
basic.forever(() => {})
```

37
docs/reference/math.md Normal file
View 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
View 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
View 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
View 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);
```

View 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

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
View 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

View File

@ -1,7 +0,0 @@
{
"corepkg": "microbit",
"bundleddirs": [
"libs/microbit",
"libs/microbit-radio"
]
}

File diff suppressed because one or more lines are too long

View File

@ -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
View 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
View 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
View 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
View 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"
}

View 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
View 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"
}
}

View 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);
}
}

View File

@ -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
View 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.

View File

@ -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
View 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
View File

@ -0,0 +1,5 @@
// Auto-generated. Do not edit.
declare namespace radio {
}
// Auto-generated. Do not edit. Really.

View File

@ -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"
}

View 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);
}
}

View File

@ -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
View 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.

View File

@ -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
View 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);
}
}

View File

@ -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);
}
}

View File

@ -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
View 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);
}
}

View File

@ -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
View 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
View 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.

View File

@ -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
View 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
View 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;
}
}

View File

@ -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
View 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);
}
}

View File

@ -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 {
}
}

View File

@ -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
View 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
View 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;
*/
}
}

View File

@ -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;
}
}

View File

@ -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));
}
}

View File

@ -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
View 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);
}
}

View File

@ -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
View 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
View 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));
}
}

View File

@ -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
View 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
View 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
View 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
View 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