Compare commits
22 Commits
Author | SHA1 | Date | |
---|---|---|---|
e9aa343d67 | |||
d83039430c | |||
5b2e877aef | |||
c5b28f5b8e | |||
e765021bf9 | |||
dbcd9e535c | |||
cff88d67ad | |||
3f241e8bc9 | |||
69c3d2d249 | |||
bc04d30595 | |||
63a26835b1 | |||
79113115e0 | |||
573ed7f6f2 | |||
28b28d0b52 | |||
0ee2b285c0 | |||
d5cb085264 | |||
c055a5d329 | |||
8fe8b78f4c | |||
f627f125c0 | |||
7d3254477a | |||
3149ed4c1d | |||
baeafcdebe |
@ -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)"
|
||||
|
32
README.md
32
README.md
@ -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.
|
||||
|
@ -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 {
|
||||
|
@ -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")
|
||||
|
@ -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")
|
||||
|
@ -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);
|
||||
|
||||
|
||||
```
|
||||
|
@ -21,4 +21,4 @@ bluetooth.onBluetoothDisconnected(() => {
|
||||
|
||||
```package
|
||||
microbit-bluetooth
|
||||
```
|
||||
```
|
||||
|
@ -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(() => {
|
||||
|
||||
|
@ -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(`
|
||||
. . . . .
|
||||
. # . # .
|
||||
. . # . .
|
||||
# ; . . #
|
||||
# . . . #
|
||||
. # # # .
|
||||
`)
|
||||
```
|
||||
|
@ -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);
|
||||
```
|
||||
|
||||
|
@ -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]);
|
||||
}
|
@ -6,6 +6,7 @@
|
||||
"lang-test0.ts"
|
||||
],
|
||||
"public": true,
|
||||
"additionalFilePath": "../../node_modules/pxt-core/libs/lang-test0",
|
||||
"dependencies": {
|
||||
"microbit": "file:../microbit"
|
||||
}
|
||||
|
77
libs/lang-test1/lang-test1.ts
Normal file
77
libs/lang-test1/lang-test1.ts
Normal 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
12
libs/lang-test1/pxt.json
Normal 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"
|
||||
}
|
||||
}
|
@ -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"
|
||||
}
|
26
libs/microbit-devices/_locales/microbit-devices-strings.json
Normal file
26
libs/microbit-devices/_locales/microbit-devices-strings.json
Normal 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"
|
||||
}
|
@ -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",
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "pxt-microbit",
|
||||
"version": "0.3.3",
|
||||
"version": "0.3.4",
|
||||
"description": "BBC micro:bit target for PXT",
|
||||
"keywords": [
|
||||
"JavaScript",
|
||||
@ -29,6 +29,6 @@
|
||||
"typescript": "^1.8.7"
|
||||
},
|
||||
"dependencies": {
|
||||
"pxt-core": "0.3.5"
|
||||
"pxt-core": "0.3.7"
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user