Compare commits

...

49 Commits

Author SHA1 Message Date
f9f96f33f0 0.3.7 2016-07-29 11:37:58 +01:00
0b33073be1 Bump pxt-core to 0.3.10 2016-07-29 11:37:57 +01:00
65594842fc Fix issue with multi digit numbers not scrolling all the way off screen as is the case on the physical pxt. 2016-07-28 15:54:10 -07:00
c6ed665f84 Fix for issue 176: basic.showNumber timing in the simulator
- updated basic.cpp::showNumber to use printChar instead of print.
2016-07-28 15:04:56 -07:00
79462deb24 Merge pull request #190 from Microsoft/microsoftsam/issue179
Fix for issue 179: Watch Challenges goes to Rock Paper Scissors instead of the challenges code
2016-07-28 14:21:18 -07:00
5c05f3e241 Fix for issue 179: Watch Challenges goes to Rock Paper Scissors instead of the challenges code 2016-07-28 13:13:33 -07:00
4f7dd75fbe Finished animation API 2016-07-28 12:16:18 -07:00
338e507b51 temporary fix for reference 2016-07-28 12:03:03 -07:00
601231a5dc 0.3.6 2016-07-28 11:54:23 -07:00
f0850336e5 Bump pxt-core to 0.3.9 2016-07-28 11:54:18 -07:00
a6b2187ec5 Edited advanced page 2016-07-28 10:56:37 -07:00
28ae4f4230 better board name detection 2016-07-28 10:22:05 -07:00
09933b6a8d advanced section 2016-07-28 09:15:31 -07:00
45bb6e7cb3 0.3.5 2016-07-28 12:47:58 +01:00
33c234a87e Bump pxt-core to 0.3.8 2016-07-28 12:47:57 +01:00
e9aa343d67 0.3.4 2016-07-28 11:51:44 +01:00
d83039430c Bump pxt-core to 0.3.7 2016-07-28 11:51:43 +01:00
5b2e877aef Merge branch 'master' of github.com:Microsoft/pxt-microbit 2016-07-28 11:49:04 +01:00
c5b28f5b8e Document testing 2016-07-28 11:47:45 +01:00
e765021bf9 Compile lang-tests to binary 2016-07-28 11:38:35 +01:00
dbcd9e535c Get generic part of lang-test from pxt-core package 2016-07-28 11:35:17 +01:00
cff88d67ad Update README.md 2016-07-27 13:48:57 -07:00
3f241e8bc9 Merge pull request #180 from Microsoft/snippetfixes
Fixes to documentation snippets
2016-07-27 13:30:39 -07:00
69c3d2d249 Update README.md 2016-07-27 13:28:57 -07:00
bc04d30595 some updates to setup instructions 2016-07-27 13:15:30 -07:00
63a26835b1 Format code 2016-07-27 19:32:58 +01:00
79113115e0 docs update 2016-07-27 10:57:18 -07:00
573ed7f6f2 updated localization strings in bundled packages 2016-07-27 08:42:58 -07:00
61da1032d6 0.3.3 2016-07-27 07:26:24 -07:00
36d455c693 Bump pxt-core to 0.3.5 2016-07-27 07:26:20 -07:00
42c766b6d7 updated shim definition 2016-07-26 16:17:54 -07:00
6f00384891 Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2016-07-26 13:52:01 -07:00
8440f7c763 adding "pin is pressed" block 2016-07-26 13:51:41 -07:00
8a8e864f99 fix reference section 2016-07-26 14:18:44 -04:00
7a3402b782 add FAQ for language 2016-07-26 14:10:41 -04:00
5e9a5b29f4 fix formatting problem 2016-07-26 14:10:41 -04:00
aff9d1ee60 clean up docs 2016-07-26 09:03:42 -07:00
8add7e8efb updated radio strings / docs page 2016-07-26 08:47:45 -07:00
e7dfd0531b 0.3.2 2016-07-26 13:12:48 +01:00
d2b1f70ce2 Bump pxt-core to 0.3.2 2016-07-26 13:12:48 +01:00
28b28d0b52 Change array declaration for first snippet in headbands 2016-07-25 11:11:51 +01:00
0ee2b285c0 Deleted list of bad snippets 2016-07-25 11:10:01 +01:00
d5cb085264 Rename function call in number documentation 2016-07-25 11:01:10 +01:00
c055a5d329 Syntax fixes to LED plotting docs 2016-07-25 11:00:34 +01:00
8fe8b78f4c Syntax fixes for hero lesson 2016-07-25 10:39:02 +01:00
f627f125c0 Syntax fixes for headbands lesson 2016-07-25 10:35:15 +01:00
7d3254477a Fix case of math in documentation snippet 2016-07-25 10:22:15 +01:00
3149ed4c1d Line numbers 2016-07-25 10:15:35 +01:00
baeafcdebe List of all snippets with errors 2016-07-25 09:39:34 +01:00
38 changed files with 347 additions and 1096 deletions

View File

@ -4,6 +4,9 @@ node_js:
script:
- "node node_modules/pxt-core/built/pxt.js travis"
- "(cd libs/lang-test0; node ../../node_modules/pxt-core/built/pxt.js run)"
- "(cd libs/lang-test1; node ../../node_modules/pxt-core/built/pxt.js run)"
- "(cd libs/lang-test0; node ../../node_modules/pxt-core/built/pxt.js test)"
- "(cd libs/lang-test1; node ../../node_modules/pxt-core/built/pxt.js test)"
- "node node_modules/pxt-core/built/pxt.js testdir tests"
- "node node_modules/pxt-core/built/pxt.js uploaddoc"
- "(cd libs/hello; node ../../node_modules/pxt-core/built/pxt.js testconv https://az851932.vo.msecnd.net/files/td-converter-tests-v0.json)"

View File

@ -9,12 +9,19 @@ PXT ([Microsoft Programming Experience Toolkit](https://github.com/Microsoft/pxt
## Local server
The local server allows to run the editor and the documentation from your computer.
### Setup
The following commands are a 1-time setup after synching the repo on your machine.
* clone this repo to your computer
* install the PXT command line
* if not yet installed, install [Node.js 4.4.5 or higher](https://nodejs.org/en/download/)
* [clone this repo](https://help.github.com/articles/cloning-a-repository/) to your computer and go in the project folder
```
git clone https://github.com/microsoft/pxt-microbit
cd pxt-microbit
```
* install the PXT command line (add ``sudo`` for Mac/Linux shells).
```
npm install -g pxt
```
@ -37,7 +44,9 @@ If you need modify the `.cpp` files, turn on yotta compilation with the ``-yt``
pxt serve -yt
```
To make sure you're running the latest tools, run (add ``sudo`` for Mac/Linux shells)
## Updates
To update your PXT version and make sure you're running the latest tools, run (add ``sudo`` for Mac/Linux shells)
```
pxt update
```
@ -54,6 +63,23 @@ that wraps ``codethemicrobit.com`` and provides additional features.
* Install Visual Studio 2015 Update 2 or higher. Make sure the Windows 10 templates are installed.
* open the ``win10/app.sln`` solution and launch the ``codethemicrobit`` project.
## Testing
The build automatically runs the following:
* make sure the built-in packages compile
* `pxt run` in `libs/lang-test*` - this will run the test in command line runner;
there is a number of asserts in both of these
* `pxt testdir` in `tests` - this makes sure all the files compile and generates .hex files
* run the TD->TS converter on a number of test scripts from `microbit.co.uk` and make sure the results compile
To test something on the device:
* do a `pxt deploy` in `libs/lang-test*` - they should show `1` or `2` on the screen (and not unhappy face)
* run `pxt testdir` in `tests` and deploy some of the hex files from `tests/built`
The `lang-test0` source comes from the `pxt-core` package. It's also tested with `pxt run` there.
## Code of Conduct
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.

View File

@ -28,11 +28,12 @@ export function deployCoreAsync(res: ts.pxt.CompileResult) {
function getBitDrivesAsync(): Promise<string[]> {
if (process.platform == "win32") {
let rx = new RegExp("^([A-Z]:).* " + pxt.appTarget.compile.deployDrives)
return execAsync("wmic PATH Win32_LogicalDisk get DeviceID, VolumeName, FileSystem")
.then(buf => {
let res: string[] = []
buf.toString("utf8").split(/\n/).forEach(ln => {
let m = /^([A-Z]:).* MICROBIT/.exec(ln)
let m = rx.exec(ln)
if (m) {
res.push(m[1] + "/")
}
@ -41,8 +42,9 @@ function getBitDrivesAsync(): Promise<string[]> {
})
}
else if (process.platform == "darwin") {
let rx = new RegExp(pxt.appTarget.compile.deployDrives)
return readDirAsync("/Volumes")
.then(lst => lst.filter(s => /MICROBIT/.test(s)).map(s => "/Volumes/" + s + "/"))
.then(lst => lst.filter(s => rx.test(s)).map(s => "/Volumes/" + s + "/"))
} else {
return Promise.resolve([])
}

View File

@ -86,7 +86,7 @@ if (led.point(1,1) && led.point(2,2)) {
When you compare two Numbers, you get a Boolean value, such as the comparison `x < 5` in the code below:
```blocks
let x = math.random(5)
let x = Math.random(5)
if(x < 5) {
basic.showString("low");
} else {

View File

@ -27,5 +27,10 @@ Visit the cards below to starting programming JavaScript and TypeScript with the
},{
"name": "Classes",
"url": "/js/classes"
}]
},{
"name": "FAQ",
"url": "/js/faq"
}
]
```

58
docs/js/faq.md Normal file
View File

@ -0,0 +1,58 @@
# Frequently asked questions
# What is the language supported for the micro:bit?
For the micro:bit, we support a "static" subset of TypeScript (itself a superset of JavaScript):
## Supported language features
* variables with `let`, `const`, and `var`
* functions with lexical scoping and recursion
* top-level code in the file; hello world really is `console.log("Hello world")`
* `if ... else if ... else` statements
* `while` and `do ... while` loops
* `for(;;)` loops (see below about `for ... in/of`)
* `break/continue`; also with labeled loops
* `switch` statement (on numbers only)
* `debugger` statement for breakpoints
* conditional operator `? :`; lazy boolean operators
* namespaces (a form of modules)
* all arithmetic operators (including bitwise operators); note that in microcontroller targets
all arithmetic is performed on integers, also when simulating in the browser
* strings (with a few common methods)
* [string templates](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals) (`` `x is ${x}` ``)
* arrow functions `() => ...`
* classes with fields, methods and constructors; `new` keyword
* array literals `[1, 2, 3]`
* enums
## Unsupported language features
We generally stay away from the more dynamic parts of JavaScript.
Things you may miss and we may implement:
* exceptions (`throw`, `try ... catch`, `try ... finally`)
* `for ... of` statements
* object literals `{ foo: 1, bar: "two" }`
* method-like properties (get/set accessors)
* class inheritance
For JS-only targets we may implement the following:
* regular expressions
* classes implementing interfaces
Things that we are not very likely to implement:
* file-based modules (`import * from ...`, `module.exports` etc); we do support namespaces
* spread operator
* `yield` expression and ``function*``
* `await` expression and `async function`
* `typeof` expression
* tagged templates ``tag `text ${expression} more text` ``; regular templates are supported
* binding with arrays or objects: `let [a, b] = ...; let { x, y } = ...`
* `with` statement
* `eval`
* `delete` statement
* `for ... in` statements
* JSX (HTML as part of JavaScript)

View File

@ -35,7 +35,7 @@ basic.showNumber(1);
basic.showNumber(2);
```
## The empty statement
### The empty statement
In JavaScript, there is the concept of an *empty statement*, which is whitespace followed by
a semicolon in the context where a statement is expected.

View File

@ -5,7 +5,7 @@
Your beginning code should look like this:
```blocks
let coll = (<string[]>[])
let coll: string[] = []
coll.push("puppy")
coll.push("clock")
coll.push("night")
@ -27,7 +27,7 @@ game.startCountdown(30000)
Let's add more words for the player to act out! But first, we need to increase the time in one round to give the player more time get through all the words. Let's change the `game->start countdown` statement.
```blocks
let coll = (<string[]>[])
let coll: string[] = []
coll.push("puppy")
coll.push("clock")
coll.push("night")
@ -52,7 +52,8 @@ game.startCountdown(60000)
Now let's add 5 more words to our list of charade words. Right above the the line `word:=coll->at(index)` add 5 lines that say `coll->add("")`. In this example, we will add the words **bicycle, telephone, sun, car, and ant** but you can add whatever words you like.
```blocks
let coll.push("puppy")
let coll: string[] = []
coll.push("puppy")
coll.push("clock")
coll.push("night")
coll.push("cat")

View File

@ -19,7 +19,7 @@ A 'collection' is a group of variables of the same type stored together. A 'coll
## 2. Consider the following lines of code.
```blocks
let coll = (<string[]>[])
let coll: string[] = []
coll.push("puppy")
coll.push("clock")
```
@ -35,7 +35,7 @@ basic.showString(coll[0], 150)
## 3. Consider the following lines of code.
```blocks
let coll = (<string[]>[])
let coll: string[] = []
coll.push("puppy")
coll.push("clock")
coll.push("cat")
@ -52,7 +52,7 @@ basic.showString(coll[2], 150)
## 4. Consider the following line of code.
```blocks
let coll = (<string[]>[])
let coll: string[] = []
```
Write the five (5) lines of code that will add the following five words to `data->coll`: puppy, clock, night, cat, cow.
@ -60,7 +60,8 @@ Write the five (5) lines of code that will add the following five words to `data
<br/>
```blocks
let coll.push("puppy")
let coll: string[] = []
coll.push("puppy")
coll.push("clock")
coll.push("night")
coll.push("cat")

View File

@ -211,7 +211,7 @@ Let's setup the logic for the food and the ghost to be in different quadrants. F
let hero = game.createSprite(2, 2);
let food = game.createSprite(4, 4);
let ghost = game.createSprite(0, 0);
let ghost.change(LedSpriteProperty.Blink, 100);
ghost.change(LedSpriteProperty.Blink, 100);
food = led.brightness() == 8;
while (true) {
basic.pause(400);
@ -265,7 +265,7 @@ while (true) {
}
}
0.set(LedSpriteProperty.X, 4);
ghost.set(LedSpriteProperty.X, 4);
```

View File

@ -148,12 +148,6 @@ Trim any leftover fabric, threads or tape.
Your watch is ready!
### ~avatar avatar
Excellent, you're ready to continue with the [challenges](/projects/rock-paper-scissors)!
### ~
### Acknowledgements
Artistic design by Melinda Hoeneisen.

View File

@ -22,15 +22,3 @@ control.inBackground(() => {
});
```
## Advanced
```namespaces
devices.tellCameraTo(MesCameraEvent.TakePhoto);
bluetooth.onBluetoothConnected(() => {});
```
```package
microbit-devices
microbit-bluetooth
```

View File

@ -21,4 +21,4 @@ bluetooth.onBluetoothDisconnected(() => {
```package
microbit-bluetooth
```
```

View File

@ -1,148 +0,0 @@
# Game Library
The game library supports simple single-player time-based games. The player has a **sprite**, number of **lives** and a **score**. The game has a sprite, number of **levels** and a **countdown clock**. The general goal of a game will be to move the sprite and achieve a top score before time runs out or the number of lives goes to zero.
The code below shows a simple game where the user gets to press the button ``A`` as much times as possible in 10 seconds.
```blocks
input.onButtonPressed(Button.A, () => {
game.addScore(1)
})
game.startCountdown(10000)
```
### [Create sprite](/reference/game/create-sprite)
Create sprite with x, y coordinates and returns a LED Sprite. Create a new LED sprite.
![](/static/mb/create-sprite-0.png)
```
export function createSprite(x: number, y: number) : micro_bitSprites.LedSprite
```
### [Move](/reference/game/move)
Sprite move by a certain number
![](/static/mb/game-library/move-0.png)
```
export function move(_this: micro_bitSprites.LedSprite, leds: number)
```
### [Turn](/reference/game/turn)
Rotates a sprite to the right by a certain number of degrees
![](/static/mb/game-library/turn-0.png)
```
export function turnRight(_this: micro_bitSprites.LedSprite, degrees: number)
```
Rotates a sprite to the left by a certain number of degrees
```
export function turnLeft(_this: micro_bitSprites.LedSprite, degrees: number)
```
### [Change](/reference/game/change)
Sprite will change the x position by this number
![](/static/mb/change-0.png)
```
export function changeXBy(_this: micro_bitSprites.LedSprite, x: number)
```
Sprite will change the y position by this number
```
export function changeYBy(_this: micro_bitSprites.LedSprite, y: number)
```
### [Set](/reference/game/set)
Sprite will change the x position by this number
```
export function setX(_this: micro_bitSprites.LedSprite, x: number)
```
Sprite will change the y position by this number
![](/static/mb/change-0.png)
```
export function changeYBy(_this: micro_bitSprites.LedSprite, y: number)
```
### [If on edge, bounce](/reference/game/if-on-edge-bounce)
Sprite - If the sprite is on the edge, the sprite will bounce
![](/static/mb/game-library/if-on-edge-bounce-0.png)
```
export function ifOnEdgeBounce(_this: micro_bitSprites.LedSprite)
```
### [Change score by](/reference/game/change-score-by)
When a player achieves a goal, you can increase the game score
* add score points to the current score
![](/static/mb/game-library/pic1.png)
```
export function addScore(points: number)
```
### [Score](/reference/game/score)
* set the current score to a particular value.
```
export function setScore(value: number)
```
* get the current score value
![](/static/mb/game-library/pic2.png)
```
export function score() : number
```
### [Countdown](/reference/game/start-countdown)
If your game has a time limit, you can start a countdown in which case `game->current time` returns the remaining time.
* start a countdown with the maximum duration of the game in milliseconds.
![](/static/mb/game-library/pic3.png)
```
export function startCountdown(ms: number)
```
### [Game over](/reference/game/game-over)
If the `life` reaches zero or the time expires (see countdown), the game enters the **game over** mode. When the game is over, `game->is running` returns false
* check if the game still running.
```
let running = game.isRunning()
```
You can also end the game by calling the `game -> game over` function:
![](/static/mb/game-library/pic0.png)
```
game.gameOver()
```

View File

@ -16,7 +16,7 @@ export function showFrame(img: micro_bit.Image, frame: number)
### Difference from `plot frame`
The `show frame` function is the same as [plot frame](/reference/image/plot-frame), but contains a built-in delay after the LED screen has been updated (whereas `plot frame` has no built-in delay)
The `show frame` function is the same as [plot frame](/reference/images/plot-frame), but contains a built-in delay after the LED screen has been updated (whereas `plot frame` has no built-in delay)
### Example

View File

@ -14,6 +14,7 @@ input.onPinPressed(TouchPin.P0, () => {
});
input.buttonIsPressed(Button.A);
input.compassHeading();
input.pinIsPressed(TouchPin.P0);
input.temperature();
input.acceleration(Dimension.X);
input.lightLevel();
@ -21,7 +22,6 @@ input.rotation(Rotation.Pitch);
input.magneticForce(Dimension.X);
input.runningTime();
input.setAccelerometerRange(AcceleratorRange.OneG);
input.pinIsPressed(TouchPin.P0);
input.calibrate();
input.onLogoDown(() => {

View File

@ -3,11 +3,11 @@
Display an [Image](/reference/images/image) on the BBC micro:bit's [LED screen](/device/screen). NOTE: `basic -> plot image` has been replaced by `basic -> show leds`.
```sig
basic.plotLeds(`
basic.showLeds(`
. . . . .
. # . # .
. . # . .
# ; . . #
# . . . #
. # # # .
`)
```
@ -16,14 +16,14 @@ basic.plotLeds(`
* leds - a series of LED on/off states that form an image (see steps below)
### Example: simley
### Example: smiley
```blocks
basic.plotLeds(`
basic.showLeds(`
. . . . .
. # . # .
. . # . .
# ; . . #
# . . . #
. # # # .
`)
```

View File

@ -9,14 +9,24 @@ led.stopAnimation()
### Example
This program...
This program sets up the ``stop animation`` part of the program,
and then shows a string that you can stop with button ``B``.
```blocks
basic.showString("STOP ME! STOP ME! PLEASE, WON'T SOMEBODY STOP ME?");
input.onButtonPressed(Button.B, () => {
led.stopAnimation();
});
'```
basic.showString("STOP ME! STOP ME! PLEASE, WON'T SOMEBODY STOP ME?");
```
### ~hint
It's important to set up ``stop animation`` before showing the
animation, so the ``stop animation`` part of the program will be ready
to go.
### ~
### See Also
[show animation](/reference/basic/show-animation)

View File

@ -14,7 +14,7 @@ radio.receivedNumberAt(0);
radio.receiveString();
radio.receivedSignalStrength();
radio.setGroup(0);
radio.setTransmitPower(0);
radio.setTransmitPower(7);
radio.writeValueToSerial();
radio.setTransmitSerialNumber(true);
radio.setTransmitSerialNumber(false);
```

View File

@ -1,18 +1,26 @@
# Write Value To Serial
Writes the full data received data via ``radio`` to serial in JSON format.
**Note** - This method only works for [send number](/reference/radio/send-number) and [send value](/reference/radio/send-value). It does not work for [send string](/reference/radio/send-string) (although a string can be sent with [send value](/reference/radio/send-value)).
Writes the data received by ``radio`` to serial in JSON format.
```sig
radio.writeValueToSerial();
```
## Data received format
The format for received data printed to serial is as follows
- [send number](/reference/radio/send-number) - ```{v:ValueSent,t:MicrobitTimeAlive,s:Unused}```
- [send value](/reference/radio/send-number) - ```{v:Value,t:MicrobitTimeAlive,s:Unused,n:"Name"}```
- [send string](/reference/radio/send-string) - ```{}``` (currently unavailable)
### ~hint
This method only works for [send number](/reference/radio/send-number)
and [send value](/reference/radio/send-value). It does not work for
[send string](/reference/radio/send-string), although you can send a
string as part of [send value](/reference/radio/send-value).
### ~
### Data received format
The format for received data printed to serial is as follows:
- [send number](/reference/radio/send-number): ```{v:ValueSent,t:MicrobitTimeAlive,s:Unused}```
- [send value](/reference/radio/send-value): ```{v:ValueSent,t:MicrobitTimeAlive,s:Unused,n:"Name"}```
### Simulator
@ -20,7 +28,9 @@ This function only works on the micro:bit, not in browsers.
### Examples
When ```radio``` data is received (after pressing A button on 2nd micro:bit), output temperature data to serial.
When ```radio``` data is received (after pressing the ``A`` button on
the second micro:bit), this program sends temperature data to
serial.
```blocks
input.onButtonPressed(Button.A, () => {
@ -30,9 +40,11 @@ radio.onDataReceived(() => {
radio.writeValueToSerial();
});
```
Example output to serial when A button pressed:
Sample output to serial when ``A`` button pressed:
```{v:27,t:323,s:0}```
### See also
[send number](/reference/radio/send-number), [send value](/reference/radio/send-number), [on data received](/reference/radio/on-data-received)
[send number](/reference/radio/send-number),
[send value](/reference/radio/send-value),
[on data received](/reference/radio/on-data-received)

View File

@ -46,8 +46,6 @@ for
forever
game-library
game-over
if

View File

@ -61,7 +61,7 @@ The [math library](/blocks/math) includes math related functions.
For example, the `absolute` function returns the returns the absolute value of input parameter `x`:
```blocks
let abs = math.absolute(-42);
let abs = Math.abs(-42);
basic.showNumber(abs);
```

View File

@ -1,774 +0,0 @@
//
// 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]);
}

View File

@ -6,6 +6,7 @@
"lang-test0.ts"
],
"public": true,
"additionalFilePath": "../../node_modules/pxt-core/libs/lang-test0",
"dependencies": {
"microbit": "file:../microbit"
}

View File

@ -0,0 +1,77 @@
//
// 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);
}
}
console.log("Starting...")
basic.showNumber(0);
testBuffer()
basic.showNumber(2);
console.log("ALL TESTS OK")
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-test1/pxt.json Normal file
View File

@ -0,0 +1,12 @@
{
"name": "lang-test1",
"description": "Test for the TypeScript -> HEX compiler; microbit specific parts",
"installedVersion": "file:.",
"files": [
"lang-test1.ts"
],
"public": true,
"dependencies": {
"microbit": "file:../microbit"
}
}

View File

@ -0,0 +1,26 @@
{
"bluetooth": "Support for additional Bluetooth services.",
"bluetooth.onBluetoothConnected": "Register code to run when the micro:bit is connected to over Bluetooth",
"bluetooth.onBluetoothConnected|block": "on bluetooth connected",
"bluetooth.onBluetoothConnected|param|body": "Code to run when a Bluetooth connection is established",
"bluetooth.onBluetoothDisconnected": "Register code to run when a bluetooth connection to the micro:bit is lost",
"bluetooth.onBluetoothDisconnected|block": "on bluetooth disconnected",
"bluetooth.onBluetoothDisconnected|param|body": "Code to run when a Bluetooth connection is lost",
"bluetooth.startAccelerometerService": "Starts the Bluetooth accelerometer service",
"bluetooth.startAccelerometerService|block": "bluetooth accelerometer service",
"bluetooth.startButtonService": "Starts the Bluetooth button service",
"bluetooth.startButtonService|block": "bluetooth button service",
"bluetooth.startIOPinService": "Starts the Bluetooth IO pin service.",
"bluetooth.startIOPinService|block": "bluetooth io pin service",
"bluetooth.startLEDService": "Starts the Bluetooth LED service",
"bluetooth.startLEDService|block": "bluetooth led service",
"bluetooth.startMagnetometerService": "Starts the Bluetooth magnetometer service",
"bluetooth.startMagnetometerService|block": "bluetooth magnetometer service",
"bluetooth.startTemperatureService": "Starts the Bluetooth temperature service",
"bluetooth.startTemperatureService|block": "bluetooth temperature service",
"bluetooth.uartRead": "Reads from the Bluetooth UART service buffer, returning its contents when the specified delimiter character is encountered.",
"bluetooth.uartRead|block": "bluetooth uart read %del=bluetooth_uart_delimiter_conv",
"bluetooth.uartWrite": "Writes to the Bluetooth UART service buffer. From there the data is transmitted over Bluetooth to a connected device.",
"bluetooth.uartWrite|block": "bluetooth uart write %data",
"bluetooth|block": "bluetooth"
}

View File

@ -0,0 +1,26 @@
{
"devices": "Control a phone with the BBC micro:bit via Bluetooth.",
"devices.onGamepadButton": "Register code to run when the micro:bit receives a command from the paired gamepad.",
"devices.onGamepadButton|block": "on gamepad button|%NAME",
"devices.onGamepadButton|param|body": "code to run when button is pressed",
"devices.onGamepadButton|param|name": "button name",
"devices.onNotified": "Registers code to run when the device notifies about a particular event.",
"devices.onNotified|block": "on notified|%event",
"devices.onNotified|param|body": "code handler when event is triggered",
"devices.onNotified|param|event": "event description",
"devices.onSignalStrengthChanged": "Registers code to run when the device notifies about a change of signal strength.",
"devices.onSignalStrengthChanged|block": "on signal strength changed",
"devices.onSignalStrengthChanged|param|body": "Code run when the signal strength changes.",
"devices.raiseAlertTo": "Sends an ``alert`` command to the parent device.",
"devices.raiseAlertTo|block": "raise alert to|%property",
"devices.raiseAlertTo|param|event": "event description",
"devices.signalStrength": "Returns the last signal strength reported by the paired device.",
"devices.signalStrength|block": "signal strength",
"devices.tellCameraTo": "Sends a ``camera`` command to the parent device.",
"devices.tellCameraTo|block": "tell camera to|%property",
"devices.tellCameraTo|param|event": "event description",
"devices.tellRemoteControlTo": "Sends a ``remote control`` command to the parent device.",
"devices.tellRemoteControlTo|block": "tell remote control to|%property",
"devices.tellRemoteControlTo|param|event": "event description",
"devices|block": "devices"
}

View File

@ -1,101 +1,32 @@
{
"basic": "Provides access to basic micro:bit functionality.",
"basic.clearScreen": "Turn off all LEDs",
"basic.forever": "Repeats the code forever in the background. On each iteration, allows other codes to run.",
"basic.pause": "Pause for the specified time in milliseconds",
"basic.plotLeds": "Draws an image on the LED screen.",
"basic.showAnimation": "Shows a sequence of LED screens as an animation.",
"basic.showLeds": "Draws an image on the LED screen.",
"basic.showNumber": "Scroll a number on the screen. If the number fits on the screen (i.e. is a single digit), do not scroll.",
"basic.showString": "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.",
"control": "Runtime and event utilities.",
"control.inBackground": "Schedules code that run in the background.",
"control.reset": "Resets the BBC micro:bit.",
"game": "A single-LED sprite game engine",
"game.addScore": "Adds points to the current score",
"game.gameOver": "Displays a game over animation.",
"game.score": "Gets the current score",
"game.setScore": "Sets the current score value",
"game.startCountdown": "Starts a game countdown timer",
"images": "Creation, manipulation and display of LED images.",
"images.createBigImage": "Creates an image with 2 frames.",
"images.createImage": "Creates an image that fits on the LED screen.",
"input": "Events and data from sensors",
"input.acceleration": "Get the acceleration value in milli-gravitys (when the board is laying flat with the screen up, x=0, y=0 and z=-1024)",
"input.buttonIsPressed": "Get the button state (pressed or not) for ``A`` and ``B``.",
"input.calibrate": "Obsolete, compass calibration is automatic.",
"input.compassHeading": "Get the current compass compass heading in degrees.",
"input.lightLevel": "Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright.",
"input.magneticForce": "Get the magnetic force value in ``micro-Teslas`` (``µT``). This function is not supported in the simulator.",
"input.onButtonPressed": "Do something when a button (``A``, ``B`` or both ``A+B``) is pressed",
"input.onGesture": "Attaches code to run when the screen is facing up.",
"input.onLogoDown": "Attaches code to run when the logo is oriented downwards and the board is vertical.",
"input.onLogoUp": "Attaches code to run when the logo is oriented upwards and the board is vertical.",
"input.onPinPressed": "Do something when a pin(``P0``, ``P1`` or both ``P2``) is pressed.",
"input.onScreenDown": "Attaches code to run when the screen is facing down.",
"input.onScreenUp": "Attaches code to run when the screen is facing up.",
"input.onShake": "Attaches code to run when the device is shaken.",
"input.pinIsPressed": "Get the pin state (pressed or not). Requires to hold the ground to close the circuit.",
"input.rotation": "The pitch of the device, rotation along the ``x-axis``, in degrees.",
"input.runningTime": "Gets the number of milliseconds elapsed since power on.",
"input.setAccelerometerRange": "Sets the accelerometer sample range in gravities.",
"input.temperature": "Gets the temperature in Celsius degrees (°C).",
"led": "Control of the LED screen.",
"led.brightness": "Get the screen brightness from 0 (off) to 255 (full bright).",
"led.fadeIn": "Fades in the screen display.",
"led.fadeOut": "Fades out the screen brightness.",
"led.plot": "Turn on the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.",
"led.plotAll": "Turns all LEDS on",
"led.plotBarGraph": "Displays a vertical bar graph based on the `value` and `high` value.\nIf `high` is 0, the chart gets adjusted automatically.",
"led.point": "Get the on/off state of the specified LED using x, y coordinates. (0,0) is upper left.",
"led.screenshot": "Takes a screenshot of the LED screen and returns an image.",
"led.setBrightness": "Set the screen brightness from 0 (off) to 255 (full bright).",
"led.setDisplayMode": "Sets the display mode between black and white and greyscale for rendering LEDs.",
"led.stopAnimation": "Cancels the current animation and clears other pending animations.",
"led.toggle": "Toggles a particular pixel",
"led.toggleAll": "Inverts the current LED display",
"led.unplot": "Turn off the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.",
"music": "Generation of music tones through pin ``P0``.",
"music.beat": "Returns the duration of a beat in milli-seconds",
"music.changeTempoBy": "Change the tempo by the specified amount",
"music.noteFrequency": "Gets the frequency of a note.",
"music.playTone": "Plays a tone through pin ``P0`` for the given duration.",
"music.rest": "Rests (plays nothing) for a specified time through pin ``P0``.",
"music.ringTone": "Plays a tone through pin ``P0``.",
"music.setTempo": "Sets the tempo to the specified amount",
"music.tempo": "Returns the tempo in beats per minute. Tempo is the speed (bpm = beats per minute) at which notes play. The larger the tempo value, the faster the notes will play.",
"pins": "Control currents in Pins for analog/digital signals, servos, i2c, ...",
"pins.analogPitch": "Emits a Pulse-width modulation (PWM) signal to the current pitch pin. Use `analog set pitch pin` to define the pitch pin.",
"pins.analogReadPin": "Read the connector value as analog, that is, as a value comprised between 0 and 1023.",
"pins.analogSetPeriod": "Configures the Pulse-width modulation (PWM) of the analog output to the given value in **microseconds** or `1/1000` milliseconds.\nIf this pin is not configured as an analog output (using `analog write pin`), the operation has no effect.",
"pins.analogSetPitchPin": "Sets the pin used when using `pins->analog pitch`.",
"pins.analogWritePin": "Set the connector value as analog. Value must be comprised between 0 and 1023.",
"pins.digitalReadPin": "Read the specified pin or connector as either 0 or 1",
"pins.digitalWritePin": "Set a pin or connector value to either 0 or 1.",
"pins.i2cReadNumber": "Read one number from 7-bit I2C address.",
"pins.i2cWriteNumber": "Write one number to a 7-bit I2C address.",
"pins.map": "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.",
"pins.onPulsed": "Configures this pin to a digital input, and generates events where the timestamp is the duration that this pin was either ``high`` or ``low``.",
"pins.pulseDuration": "Gets the duration of the last pulse in micro-seconds. This function should be called from a ``onPulse`` handler.",
"pins.servoSetPulse": "Configures this IO pin as an analog/pwm output, configures the period to be 20 ms, and sets the pulse width, based on the value it is given **microseconds** or `1/1000` milliseconds.",
"pins.servoWritePin": "Writes a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement).",
"radio": "Communicate data using radio packets",
"radio.onDataReceived": "Registers code to run when a packet is received over radio.",
"radio.onDataReceived|block": "on data received",
"radio.receiveNumber": "Reads the next packet as a number from the radio queue.",
"radio.receiveNumber|block": "receive number",
"radio.receiveString": "Reads the next packet as a string and returns it.",
"radio.receiveString|block": "receive string",
"radio.receivedNumberAt": "Reads a number at a given index, between ``0`` and ``3``, from the packet received by ``receive number``. Not supported in simulator.",
"radio.receivedNumberAt|block": "receive number|at %VALUE",
"radio.receivedNumberAt|param|index": "index of the number to read from 0 to 3. 1 eg",
"radio.receivedSignalStrength": "Gets the received signal strength indicator (RSSI) from the packet received by ``receive number``. Not supported in simulator.\nnamespace=radio",
"radio.receivedSignalStrength|block": "received signal strength",
"radio.sendNumber": "Broadcasts a number over radio to any connected micro:bit in the group.",
"radio.sendNumber|block": "send number %value",
"radio.sendString": "Broadcasts a number over radio to any connected micro:bit in the group.",
"radio.sendString|block": "send string %msg",
"radio.sendValue": "Broadcasts a name / value pair along with the device serial number\nand running time to any connected BBC micro:bit in the group.",
"radio.sendValue|block": "send|value %name|= %value",
"radio.sendValue|param|name": "the field name (max 12 characters), eg: \"data\"",
"radio.sendValue|param|value": "the numberic value",
"radio.setGroup": "Sets the group id for radio communications. A micro:bit can only listen to one group ID at any time.\n@ param id the group id between ``0`` and ``255``, 1 eg",
"radio.setGroup|block": "set group %ID",
"radio.setTransmitPower": "Change the output power level of the transmitter to the given value.",
"radio.setTransmitPower|block": "set transmit power %power",
"radio.setTransmitPower|param|power": "a value in the range 0..7, where 0 is the lowest power and 7 is the highest. eg: 7",
"radio.setTransmitSerialNumber": "Set the radio to transmit the serial number in each message.",
"radio.setTransmitSerialNumber|block": "set tranmist serial number %transmit",
"radio.writeValueToSerial": "Reads a value sent with `stream value` and writes it\nto the serial stream as JSON",
"serial": "Reading and writing data over a serial connection.",
"serial.readLine": "Reads a line of text from the serial port.",
"serial.writeLine": "Prints a line of text to the serial",
"serial.writeNumber": "Prints a numeric value to the serial",
"serial.writeString": "Sends a piece of text through Serial connection.",
"serial.writeValue": "Writes a ``name: value`` pair line to the serial."
"radio.writeValueToSerial|block": "write value to serial",
"radio|block": "radio"
}

View File

@ -92,7 +92,7 @@
"input.onShake": "Attaches code to run when the device is shaken.",
"input.onShake|param|body": "TODO",
"input.pinIsPressed": "Get the pin state (pressed or not). Requires to hold the ground to close the circuit.",
"input.pinIsPressed|block": "pin|%NAME|is pressed",
"input.pinIsPressed|block": "pin %NAME|is pressed",
"input.pinIsPressed|param|name": "pin used to detect the touch",
"input.rotation": "The pitch of the device, rotation along the ``x-axis``, in degrees.",
"input.rotation|block": "rotation (°)|%NAME",

View File

@ -23,7 +23,7 @@ namespace basic {
if (value < 0 || value >= 10) {
uBit.display.scroll(t, interval);
} else {
uBit.display.print(t.charAt(0), interval * 5);
uBit.display.printChar(t.charAt(0), interval * 5);
}
}

View File

@ -167,6 +167,17 @@ namespace input {
return false;
}
/**
* 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=56
//% blockId="device_pin_is_pressed" block="pin %NAME|is pressed" icon="\uf094"
//% blockGap=8
bool pinIsPressed(TouchPin name) {
auto pin = getPin((int)name);
return pin && pin->isTouched();
}
/**
* Get the current compass compass heading in degrees.
@ -270,16 +281,6 @@ namespace input {
//% 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

View File

@ -230,6 +230,15 @@ declare namespace input {
//% icon="\uf192" blockGap=8 shim=input::buttonIsPressed
function buttonIsPressed(button: Button): boolean;
/**
* 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=56
//% blockId="device_pin_is_pressed" block="pin %NAME|is pressed" icon="\uf094"
//% blockGap=8 shim=input::pinIsPressed
function pinIsPressed(name: TouchPin): boolean;
/**
* Get the current compass compass heading in degrees.
*/
@ -290,13 +299,6 @@ declare namespace input {
//% 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

View File

@ -185,7 +185,6 @@ Functions in this category require to be connected to a remote device.
### Libraries
* [game library](/js/game-library)
* [serial library](/js/serial-library)
### ~

View File

@ -47,7 +47,6 @@ Learn how to create a guessing game with **global variables** `var str: "this is
* **on screen down** [read more...](/functions/on-screen-down)
* **on screen up** [read more...](/functions/on-screen-up)
* **math random** : [read more...](/js/math)
* **game library** [read more...](/js/game-library)
## Resources

View File

@ -1,6 +1,6 @@
{
"name": "pxt-microbit",
"version": "0.3.1",
"version": "0.3.7",
"description": "BBC micro:bit target for PXT",
"keywords": [
"JavaScript",
@ -29,6 +29,6 @@
"typescript": "^1.8.7"
},
"dependencies": {
"pxt-core": "0.3.1"
"pxt-core": "0.3.10"
}
}

View File

@ -52,7 +52,7 @@
"compile": {
"isNative": false,
"hasHex": true,
"deployDrives": "^MICROBIT",
"deployDrives": "(MICROBIT|MBED)",
"driveName": "MICROBIT",
"hexMimeType": "application/x-microbit-hex"
},

View File

@ -725,7 +725,8 @@ namespace pxsim.ImageMethods {
board().animationQ.enqueue({
interval: interval,
frame: () => {
if (off >= leds.width || off < 0) return false;
//TODO: support right to left.
if (off >= leds.width + 5 || off < 0) return false;
stride > 0 ? display.shiftLeft(stride) : display.shiftRight(-stride);
let c = Math.min(stride, leds.width - off);
leds.copyTo(off, c, display, 5 - stride)