Compare commits

...

314 Commits

Author SHA1 Message Date
0d0a68122d 0.7.40 2017-01-19 00:19:15 -08:00
4ad660568e Bump pxt-core to 0.10.10 2017-01-19 00:19:14 -08:00
58e82a571d 0.7.39 2017-01-18 16:14:11 -08:00
e629b866d5 Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2017-01-18 16:13:08 -08:00
f0ac2b7a05 fixing debug message 2017-01-18 16:12:58 -08:00
e3c8db28e4 0.7.38 2017-01-18 14:48:43 -08:00
2c0e19a120 Bump pxt-core to 0.10.9 2017-01-18 14:48:42 -08:00
595eb788b2 removed console.log for pxt.debug 2017-01-17 16:51:21 -08:00
2e15d22e9e 0.7.37 2017-01-17 16:29:52 -08:00
57082654a9 0.7.36 2017-01-17 14:55:44 -08:00
8cbf7d38e3 0.7.35 2017-01-17 14:51:28 -08:00
a99a7325bf 0.7.34 2017-01-17 14:13:06 -08:00
fa3ed9dd21 0.7.33 2017-01-17 11:37:35 -08:00
45fd40a553 adding on pin pressed in getting-started 2017-01-17 11:37:20 -08:00
5a18bea9eb 0.7.32 2017-01-17 11:28:38 -08:00
d310312841 Bump pxt-core to 0.10.8 2017-01-17 11:28:35 -08:00
a4b93f7199 support for deletable on start 2017-01-17 11:18:22 -08:00
538a4b7bbf 0.7.31 2017-01-13 18:11:03 -08:00
0078e7bc12 Bump pxt-core to 0.10.7 2017-01-13 18:11:02 -08:00
d2726133a9 Revert "Control event value in simulator (#343)"
This reverts commit 00f4c9cbb3.
2017-01-13 18:04:38 -08:00
00f4c9cbb3 Control event value in simulator (#343)
* implement pxsim.control.eventValue and pxsim.control.eventTimestamp in the simulator
2017-01-13 16:46:52 -08:00
e15da5dee1 0.7.30 2017-01-13 15:47:16 -08:00
85dda4ea84 Bump pxt-core to 0.10.4 2017-01-13 15:47:15 -08:00
a3ffe4e1cf Set latest Electron to 0.7.29 (#342) 2017-01-13 14:11:46 -08:00
90c4d4f73b 0.7.29 2017-01-13 13:55:44 -08:00
6484d559d6 Bump pxt-core to 0.10.2 2017-01-13 13:55:43 -08:00
357436f14d refactored servostate (#341)
* refactored servostate

* Bump pxt-core to 0.10.1
2017-01-12 23:09:53 -08:00
85fe96b3fd 0.7.28 2017-01-12 16:08:35 -08:00
cdac932c42 Bump pxt-core to 0.9.5 2017-01-12 16:08:32 -08:00
dcfc2a110d Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2017-01-12 16:07:19 -08:00
e9561f54c3 removing custom loader logic 2017-01-12 16:07:10 -08:00
86f6b58d38 fix"string compare works differently in simulator/on target" (#340)
* fix for "string compare works differently in simulator/on target", fixes #901
2017-01-12 15:50:39 -08:00
eee52a5c04 0.7.27 2017-01-12 15:27:07 -08:00
1a0b0eac71 Bump pxt-core to 0.9.4 2017-01-12 15:27:04 -08:00
5a98ae0bb8 0.7.26 2017-01-12 11:54:33 -08:00
a9eea9a618 Bump pxt-core to 0.9.3 2017-01-12 11:54:30 -08:00
3086c521e3 0.7.25 2017-01-12 11:33:08 -08:00
6788f79650 Bump pxt-core to 0.9.2 2017-01-12 11:33:05 -08:00
5900239045 changing editor button colors 2017-01-12 10:45:39 -08:00
248267ec2c 0.7.24 2017-01-10 17:47:09 -08:00
9429075555 Bump pxt-core to 0.8.14 2017-01-10 17:47:07 -08:00
1fa871f2e7 Support for serial events (#339)
* added "serial->on data received"

* updated info

* updated docs

* added readline to read entire buffer

* lazy initialize of serial buffers

* init async on event

* updated docs
2017-01-10 16:27:02 -08:00
04dab7df2c One letter showString shouldn't disappear (#338)
* Fix for "One letter showString shouldn't disappear", fixes #798

* miss semicolon
2017-01-10 16:25:40 -08:00
b6474467bc Electron release (#333)
Set latest Electron app release to 0.7.23
2017-01-10 14:16:13 -08:00
79ead74af4 0.7.23 2017-01-10 10:31:04 -08:00
0f8ff95b72 Bump pxt-core to 0.8.13 2017-01-10 10:30:58 -08:00
05028c4527 Serial events (#337)
* added "serial->on data received"

* updated info

* updated docs

* added readline to read entire buffer

* lazy initialize of serial buffers

* init async on event

* updated docs
2017-01-10 10:26:44 -08:00
4054da3483 0.7.22 2017-01-09 21:33:47 -08:00
7052d27d6d Bump pxt-core to 0.8.12 2017-01-09 21:33:44 -08:00
365af8d672 Merge pull request #335 from Microsoft/default
Default values for array
2017-01-09 20:35:56 -08:00
5086ca308c 0.7.21 2017-01-09 16:08:58 -08:00
c1af770afc Bump pxt-core to 0.8.11 2017-01-09 16:08:58 -08:00
e175e70d01 Merge branch 'master' into editortoolbox 2017-01-09 16:01:35 -08:00
cbc228dca3 negative scroll fix
fix for Microsoft/pxt#813
2017-01-09 14:17:19 -08:00
462127c661 Loader (#336)
* Custom microbit loader

* updated animation

* use standardized name

* moving loader support to pxt
2017-01-09 07:51:00 -08:00
487da05eca Fix for https://github.com/Microsoft/pxt/issues/1057 2017-01-09 10:58:24 +00:00
c938618d29 adding default values for beyond the array.length access 2017-01-08 19:08:09 -08:00
91321dab83 Support for default values in array. 2017-01-08 18:43:14 -08:00
0cb3d6e44e Changes accompanying the editor toolbox. 2017-01-07 17:35:54 -08:00
7a98b06424 Custom microbit loader (#334)
* Custom microbit loader

* updated animation

* use standardized name
2017-01-06 17:39:48 -08:00
69c80d3aff Add css and default icon to NPM package for Electron app (#332) 2017-01-06 16:29:48 -08:00
1d82f08668 update instructions to use inline buttons 2017-01-06 14:41:33 -08:00
4681a68ffd added avatar image 2017-01-06 09:51:19 -08:00
0a69b773de missing package annotation 2017-01-06 07:19:00 -08:00
3f66a1c16d 0.7.20 2017-01-06 07:13:39 -08:00
d78781ad5a Bump pxt-core to 0.8.8 2017-01-06 07:13:38 -08:00
46281c3cd0 fixing broken links in docs 2017-01-06 06:12:39 -08:00
a58f67064f 0.7.19 2017-01-06 06:03:43 -08:00
efe784441f Bump pxt-core to 0.8.7 2017-01-06 06:03:41 -08:00
05174f094a updated translations 2017-01-06 06:03:33 -08:00
42773a1a0a updatd weights of radio 2017-01-06 05:43:50 -08:00
32f96d09d4 removing "getting-started" link 2017-01-06 04:58:00 -08:00
05d88cb4ba updated getting -started 2017-01-06 04:32:53 -08:00
7fe8dad1f6 0.7.18 2017-01-05 22:39:36 -08:00
858766ea3e Bump pxt-core to 0.8.6 2017-01-05 22:39:34 -08:00
81fe9afbb7 remove begin 2017-01-05 13:35:28 -08:00
65c615f256 Merge branch 'master' into tutorialmode 2017-01-05 13:33:41 -08:00
9c5c699fe7 0.7.17 2017-01-05 13:31:30 -08:00
dcede1703a fixing link 2017-01-05 13:31:05 -08:00
5d33ab019d 0.7.16 2017-01-05 13:30:30 -08:00
f7ec452ea0 updated steps 2017-01-05 13:30:14 -08:00
20260e8933 fixes to docs 2017-01-05 13:28:06 -08:00
d7704934e8 0.7.15 2017-01-05 13:17:24 -08:00
f1eafb0a6e Bump pxt-core to 0.8.5 2017-01-05 13:17:21 -08:00
27d6a8281a Inchworm (#331)
* images for inchworm project

* binding pictures

* updated inchworm lesson
2017-01-05 10:00:36 -08:00
c5128aa497 Merge branch 'master' into tutorialmode 2017-01-05 08:19:39 -08:00
a59394646c fixed docs 2017-01-05 07:37:46 -08:00
6851169dbe 0.7.14 2017-01-05 07:10:13 -08:00
36b3486194 Bump pxt-core to 0.8.3 2017-01-05 07:10:12 -08:00
5d8ccd1d6d adding namespace to api categories (#330)
* adding namespace to api categories

* add icon for led

* adding icons for control, game, images, pins and serial.
2017-01-05 07:01:50 -08:00
c713fe9bf4 0.7.13 2017-01-04 13:08:54 -08:00
f682e5e694 insertAt support for array (#328)
* Adding insertAt and setLength to array

* implemented review comments

* Bump pxt-core to 0.8.2
2017-01-04 13:07:58 -08:00
d2d776fd01 Updating getting started tutorial 2017-01-04 10:06:47 -08:00
641a5e9673 Merge branch 'master' into tutorialmode 2017-01-03 12:14:34 -08:00
93d90a2bde Few extra typing fixes. 2017-01-03 12:14:25 -08:00
a54504f31c Updating bluebird typings path 2017-01-03 11:38:21 -08:00
03111368e0 add more blocks 2017-01-02 22:14:40 -08:00
a973b2aec6 Merge branch 'master' into tutorialmode 2017-01-02 15:10:11 -08:00
a7adf0e6c6 minor ui fixes 2017-01-02 15:09:49 -08:00
c10761128e Tutorial mode changes 2017-01-01 18:52:22 -08:00
9965f169b2 0.7.12 2016-12-31 07:28:12 -08:00
8bf755c15c fixing eddystone uid encoding 2016-12-31 07:25:27 -08:00
d0b2a7db62 0.7.11 2016-12-31 06:49:30 -08:00
780192da3b Bump pxt-core to 0.7.13 2016-12-31 06:49:28 -08:00
07c1f08d18 fix for Microsoft/pxt#1014 2016-12-31 06:36:05 -08:00
25ac847266 converging with other targets on blockly toolbox width 2016-12-31 02:51:24 -08:00
63c8342b86 ui changes accompanying pxt mobile ui fixes 2016-12-31 01:43:45 -08:00
ea2bd7ba10 Merge pull request #326 from Microsoft/array
Array enhancements
2016-12-30 15:09:16 -08:00
cec2d1e8af 0.7.10 2016-12-30 15:05:31 -08:00
1b289b688b Bump pxt-core to 0.7.12 2016-12-30 15:05:28 -08:00
0cf91580cb Merge pull request #327 from Microsoft/pr/toggletheming
Blocks / JS menu toggle theming
2016-12-30 15:00:32 -08:00
392ebc8d07 0.7.9 2016-12-30 14:18:06 -08:00
9068aab12b Bump pxt-core to 0.7.11 2016-12-30 14:18:03 -08:00
85327a4e69 0.7.8 2016-12-30 13:50:03 -08:00
021260b3a4 Bump pxt-core to 0.7.10 2016-12-30 13:50:00 -08:00
4def93d7c5 Blocks / JS menu toggle theming 2016-12-30 13:07:16 -08:00
9aca0c19fc Merge branch 'master' into array 2016-12-23 19:53:06 -08:00
3fcbdbdd82 Array reimplementation as single segment with support for missing values 2016-12-23 19:49:15 -08:00
4b7b6eebca 0.7.7 2016-12-23 08:59:08 -08:00
2da0cf1178 support for buffer signature (#325) 2016-12-23 08:58:38 -08:00
141cb24e3d 0.7.6 2016-12-22 23:18:35 -08:00
35483487af Bump pxt-core to 0.7.9 2016-12-22 23:18:32 -08:00
ec3a805326 0.7.5 2016-12-22 11:35:58 -08:00
780d8bcf8d Bump pxt-core to 0.7.6 2016-12-22 11:35:56 -08:00
f9a12cac64 Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2016-12-22 11:32:01 -08:00
03c2df3277 fixed default projects 2016-12-22 11:31:50 -08:00
a7e98ccb3d Change default product names for Electron app; Add release manifest 2016-12-21 12:31:00 -08:00
1014d2f361 0.7.4 2016-12-20 16:30:14 -08:00
89f20a64d5 Bump pxt-core to 0.7.5 2016-12-20 16:30:12 -08:00
fae36a74af 0.7.3 2016-12-20 13:06:13 -08:00
7e57c59b6f Bump pxt-core to 0.7.4 2016-12-20 13:06:09 -08:00
3141e12f4c support for 8G gestures 2016-12-20 13:05:06 -08:00
4ebe9f595a fix for Microsoft/pxt#961 2016-12-20 12:38:00 -08:00
50f0e85884 docs updates 2016-12-20 12:31:25 -08:00
e28b5d48d4 0.7.2 2016-12-19 16:08:31 -08:00
562e96e09e Bump pxt-core to 0.7.2 2016-12-19 16:08:21 -08:00
6c5088f811 update LESS variables 2016-12-19 16:08:01 -08:00
d5ccb7ad02 0.7.1 2016-12-19 14:11:17 -08:00
ade5176d21 upgraded to 0.7 2016-12-19 14:10:57 -08:00
d2f6d51c19 0.6.46 2016-12-19 14:10:12 -08:00
92b60a251d On start support (#324)
* annotating APIs to support onstart

* missed file

* updated templates

* adding new lines in main.ts

* fixing docs

* removing onstart

* updated docs

* updated various docs

* more docs

* adding upgrade policies for blocks

* updated pxt reference

* placing on start under "basic"
2016-12-19 14:09:35 -08:00
de9f2d7e67 More appropriate Electron app bundle ID on Mac OS 2016-12-19 07:59:52 -08:00
4de5e3bd11 0.6.45 2016-12-18 20:57:52 -08:00
86a33e8f65 Bump pxt-core to 0.6.7 2016-12-18 20:57:50 -08:00
89010b6a8a 0.6.44 2016-12-16 20:26:41 -08:00
48d4668a7a Bump pxt-core to 0.6.6 2016-12-16 20:26:39 -08:00
a2755dc4d2 annotate apis to support multiple forever blocks 2016-12-16 16:47:36 -08:00
52e67c6bfc 0.6.43 2016-12-16 15:29:33 -08:00
5a6f23a7d0 Bump pxt-core to 0.6.5 2016-12-16 15:29:26 -08:00
d1b36f2022 0.6.42 2016-12-16 14:57:24 -08:00
284579181b Bump pxt-core to 0.6.4 2016-12-16 14:57:09 -08:00
20fcb05538 0.6.41 2016-12-16 14:40:12 -08:00
e1a2074ef5 Bump pxt-core to 0.6.3 2016-12-16 14:39:58 -08:00
fa3e33dab9 Default product.json for enabling Electron builds (#323) 2016-12-16 12:16:06 -08:00
300a98b858 0.6.40 2016-12-13 21:58:35 -08:00
5986671bcb Bump pxt-core to 0.6.1 2016-12-13 21:58:29 -08:00
efd5c46143 0.6.39 2016-12-14 09:16:58 +11:00
62c1a1da35 Bump pxt-core to 0.5.102 2016-12-14 09:16:57 +11:00
ebbc7c983d 0.6.38 2016-12-13 12:49:06 -08:00
173fc4bf7b Bump pxt-core to 0.5.101 2016-12-13 12:49:04 -08:00
47f1eadd27 0.6.37 2016-12-13 12:33:39 -08:00
8c06277a92 Bump pxt-core to 0.5.100 2016-12-13 12:33:37 -08:00
395f482f11 Merge pull request #322 from Microsoft/pr/monacotoolbox
Pr/monacotoolbox
2016-12-13 12:29:42 -08:00
bbd21a84d6 annotating apis to support toolbox 2016-12-13 12:14:32 -08:00
fcf680e9bd automatically detect/add missing package references in project 2016-12-12 10:42:02 -08:00
8ac848c812 Merge branch 'master' into pr/monacotoolbox 2016-12-12 08:39:45 +11:00
dd591af224 Turning flag for monaco toolbox on 2016-12-11 09:01:08 +13:00
e5a7a81198 Better monaco flyout contrast 2016-12-11 08:52:02 +13:00
7a5228a5d0 Reverting toolbox color 2016-12-11 06:52:08 +13:00
fe5c8e520a monaco draggable block 2016-12-11 06:34:11 +13:00
96d354a8a8 Merge pull request #316 from OwenBrotherwood/patch-1
Correction for max. length of advertised url to 17
2016-12-09 15:13:12 -08:00
02480b1c54 updated master to 0.6.36 2016-12-09 13:51:23 -08:00
4fd321cccf 0.6.36 2016-12-09 13:43:41 -08:00
4641c9456f Bump pxt-core to 0.5.99 2016-12-09 13:43:37 -08:00
498b5ec095 0.6.35 2016-12-09 11:57:34 -08:00
912be2ddfd Bump pxt-core to 0.5.98 2016-12-09 11:57:32 -08:00
6d7f8c5841 0.6.34 2016-12-09 11:15:51 -08:00
a782f4731a Bump pxt-core to 0.5.97 2016-12-09 11:15:48 -08:00
6e067bffd5 using built-deploy deployment features
deploy to drives has been migrated to PXT
2016-12-08 21:10:46 -08:00
4a4007ba41 fixing uploader link 2016-12-08 12:33:31 -08:00
c9db08a2c6 0.6.33 2016-12-08 12:18:56 -08:00
5ec303b95c Bump pxt-core to 0.5.96 2016-12-08 12:18:53 -08:00
3d0523a298 fix for roll/pitch in simulator.
fix for https://github.com/Microsoft/pxt/issues/893
2016-12-08 12:14:34 -08:00
3469ad6f8d Added note about protocol encoding. 2016-12-08 12:01:35 -08:00
d791738d84 fixing y values in accelerometer simulator
fix for https://github.com/Microsoft/pxt/issues/893
2016-12-08 11:57:17 -08:00
355c341d36 0.6.32 2016-12-08 10:56:49 -08:00
1adb4a2bac Bump pxt-core to 0.5.95 2016-12-08 10:56:46 -08:00
03c0339e9a fixing docs snippets 2016-12-08 09:16:27 -08:00
1649811015 expose "delete" in blocks.
fix for https://github.com/Microsoft/pxt/issues/870
2016-12-08 08:54:05 -08:00
14f16f9b2c expose game.setScore in blocks
fix for https://github.com/Microsoft/pxt/issues/881
2016-12-08 08:51:18 -08:00
66d3c6c7e8 fix for https://github.com/Microsoft/pxt/issues/549 2016-12-08 08:28:28 -08:00
7f27432222 Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2016-12-08 00:12:49 -08:00
870b26a85a updated lessons to use radio 2016-12-08 00:10:00 -08:00
aa6cb58dca Merge pull request #320 from Microsoft/delete
Placement new occurances need explicit delete
2016-12-07 18:09:35 -08:00
6398a42dad Placement new occurances need explicit delete 2016-12-07 18:00:03 -08:00
cfc3eae77c adding monacotoolboxbuttons margin 2016-12-07 17:03:28 -08:00
438b745d32 Merge branch 'master' into pr/monacotoolbox 2016-12-07 17:02:07 -08:00
21473f5b9b Fixing array deallocation leak (#317)
* Fixing array deallocation leak

* Moving delete down to the individual destroy methods
2016-12-07 15:44:35 -08:00
c85b6f9507 using calibrated powers for Eddystone 2016-12-07 11:37:33 -08:00
019b00209e moving blocks to advanced 2016-12-07 09:49:19 -08:00
6c11dbcdf4 added setTransmitPower in BLE 2016-12-07 09:05:03 -08:00
91197c5cec updated BLE settings 2016-12-07 08:07:08 -08:00
9e5d9787c7 linking to pxt issue tracker 2016-12-06 21:51:51 -08:00
1c11a4823b adjusting the blockly flyout opacity. 2016-12-06 21:48:21 -08:00
d457c3e8d0 exposing delete in blocks 2016-12-06 16:19:35 -08:00
2ae21efb7b Moving blockly toolbox button margins to target. 2016-12-06 15:06:16 -08:00
30211aa006 Correction for max. length of advertised url to 17
https://github.com/google/eddystone/tree/master/eddystone-url#frame-specification states 1-17
When one makes a general google for the max length, some have written 18 and some 17 :(
The difference could lie in the https://github.com/google/eddystone/tree/master/eddystone-url#url-scheme-prefix which adds an extra byte but it's use is to in someway allow for more bytes in the 1-17.
The implementation in the micro:bit Lancaster is unknown as to how the url-scheme-prefix is or is not used: there does not seem to be a scheme for "Just take the 1-17" for the url.

At the moment, "play it safe" and write 17 ?
2016-12-06 20:51:44 +01:00
485a42758c 0.6.31 2016-12-06 11:32:24 -08:00
0da5a5a349 Bump pxt-core to 0.5.91 2016-12-06 11:32:22 -08:00
efca68672a Support for monaco toolbox 2016-12-06 00:34:42 -08:00
41ce2f66fa removing add package less variable 2016-12-05 23:55:46 -08:00
9393fc166e Styling add package and undo blockly buttons 2016-12-05 21:24:57 -08:00
cfb4382941 support for monaco toolbox 2016-12-05 19:01:14 -08:00
aaca24ff5b using add package color less variable 2016-12-05 18:09:23 -08:00
0ce9be1a2b removing toolbox right border. 2016-12-05 17:59:20 -08:00
a88eb7fe02 Changing main menu color, primary color and adding tiny borders around blockly toolbox 2016-12-05 17:30:04 -08:00
06e4f7fb5c Updated BLE project settings 2016-12-05 15:33:40 -08:00
1b36485208 0.6.30 2016-12-05 15:10:13 -08:00
3b54cefa95 Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2016-12-05 15:02:51 -08:00
52857c9541 added beacon configuration 2016-12-05 15:02:39 -08:00
d10c2a20bd More IE fixes. Using important to override blocky related CSS. 2016-12-05 13:43:57 -08:00
e2482cdf91 0.6.29 2016-12-05 13:22:06 -08:00
c045d87e4c Bump pxt-core to 0.5.90 2016-12-05 13:22:03 -08:00
34e23934b0 better bluetooth settings 2016-12-05 13:02:11 -08:00
354196e01e missing block annotation on led.enable 2016-12-05 09:17:42 -08:00
bb2e8d0aef 'devices' depends on 'bluetooth' 2016-12-05 09:05:54 -08:00
90f4e895d4 0.6.28 2016-12-03 23:22:42 -08:00
58c554caa6 Bump pxt-core to 0.5.88 2016-12-03 23:22:40 -08:00
6c688a7e59 Fix Edge / IE issue where the blockly toolbox background isn't respected. 2016-12-02 18:33:42 -08:00
71244065bb 0.6.27 2016-12-02 13:20:00 -08:00
bbb1bc3dd7 Merge pull request #314 from Microsoft/pr/theming
Theming the microbit target
2016-12-02 13:18:10 -08:00
806d0e2cff 0.6.26 2016-12-02 12:58:15 -08:00
e0c4af1cae Bump pxt-core to 0.5.87 2016-12-02 12:58:13 -08:00
475821564e fixing justworks support 2016-12-02 09:45:59 -08:00
9d65dd605b Monaco editor theming. 2016-12-01 22:05:37 -08:00
67eec44411 Minor fixes. 2016-12-01 21:58:16 -08:00
280b555f86 Theming the microbit target 2016-12-01 18:35:10 -08:00
2fcd32de0d 0.6.25 2016-11-30 23:36:40 -08:00
78694e86a2 0.6.24 2016-11-30 16:07:34 -08:00
aeaa3d7bc1 updated localization files 2016-11-30 16:07:04 -08:00
af8ce3fccf allow for double, breve note durations 2016-11-30 16:06:17 -08:00
47ef096b0f 0.6.23 2016-11-30 11:05:33 -08:00
86c5c27b12 Bump pxt-core to 0.5.85 2016-11-30 11:05:31 -08:00
520c9217a5 Merge pull request #313 from Microsoft/packageconfigs
support for specifying different pairings
2016-11-30 10:54:14 -08:00
4a34f2b932 support for specifying different pairings 2016-11-30 10:35:42 -08:00
034897b0a6 fixing docs issues 2016-11-30 05:00:34 -08:00
b504abc6da 0.6.22 2016-11-30 04:55:33 -08:00
6dbfb9e96e Bump pxt-core to 0.5.84 2016-11-30 04:55:31 -08:00
d1021a30ca Merge pull request #312 from Microsoft/eddystone
Eddystone
2016-11-30 04:55:08 -08:00
8d37be7cbe use optional config to allow override flags in referenced project 2016-11-30 04:35:24 -08:00
97066e1ba4 enabling justworks pairing mode for bluetooth 2016-11-30 04:30:53 -08:00
097564748c fixing simulator 2016-11-30 04:27:08 -08:00
d873cbb6c3 updated api definitions 2016-11-30 04:24:52 -08:00
adef3a6487 updated docs 2016-11-30 04:19:17 -08:00
be0984cc4a integrating eddystone into bluetooth package 2016-11-30 04:06:15 -08:00
f0947cddaa updated signatures 2016-11-29 23:39:52 -08:00
c5c5362b5d Merge branch 'master' into eddystone 2016-11-29 23:27:49 -08:00
bcbbb1366a Merge pull request #311 from Microsoft/coregone
merging ksbit.h into pxt.h
2016-11-29 23:26:24 -08:00
19fb5ecf01 merging ksbit.h into pxt.h 2016-11-29 21:35:26 -08:00
0401aa60d2 Merge pull request #310 from Microsoft/coregone
merging pxt-microbit-core into the target
2016-11-29 15:23:02 -08:00
e0c016fbf4 moving definition out of ksbit.h 2016-11-29 15:15:22 -08:00
f046f0e50c merging pxt-microbit-core into the target 2016-11-29 15:06:34 -08:00
90f48ac77a Enable reference help switch in javascript editor. 2016-11-29 14:53:26 -08:00
23f83df6df Merge pull request #309 from Microsoft/musicpin
support for setting music pin using analogSetPitchPin
2016-11-29 13:41:16 -08:00
98e4f80399 updated crowdin info 2016-11-29 13:12:32 -08:00
b1fcc51bc8 preparing support for eddystone 2016-11-29 09:21:23 -08:00
63e24ce90a support for setting music pin using analogSetPitchPin 2016-11-29 08:59:54 -08:00
63d0b86508 0.6.21 2016-11-29 00:04:43 -08:00
672f3b94ca Bump pxt-core to 0.5.81 2016-11-29 00:04:41 -08:00
f0b91b07c1 fix typo 2016-11-29 00:04:21 -08:00
2923d045b1 0.6.20 2016-11-28 22:59:39 -08:00
3cf36b4549 Bump pxt-core to 0.5.80 2016-11-28 22:59:38 -08:00
a42aa553e6 Merge pull request #308 from Microsoft/cmdsbuild
fixing imports in cmds.ts
2016-11-28 22:50:05 -08:00
b12598e421 working around import issue 2016-11-28 22:07:40 -08:00
9a85075456 0.6.19 2016-11-28 21:24:44 -08:00
ce7b630870 Bump pxt-core to 0.5.79 2016-11-28 21:24:41 -08:00
9ac308da92 0.6.18 2016-11-28 21:11:21 -08:00
6315ca90e5 Bump pxt-core to 0.5.78 2016-11-28 21:11:19 -08:00
ecfe0a7f16 0.6.17 2016-11-28 20:44:04 -08:00
f701bca23f Bump pxt-core to 0.5.77 2016-11-28 20:44:02 -08:00
7313c76e8b Updating with the MIT license text and contributing guideline 2016-11-28 17:11:45 -08:00
77003b30f2 fixed scroll-image reference 2016-11-28 11:38:37 -08:00
274bb9e042 0.6.16 2016-11-17 05:47:13 -08:00
e316f068e2 Bump pxt-core to 0.5.76 2016-11-17 05:47:11 -08:00
c75e77593a adding loc annotations 2016-11-17 05:30:10 -08:00
ecbf8409ea Merge pull request #307 from Microsoft/scrollimage
Fixing scrollImage to actually scroll
2016-11-17 04:44:44 -08:00
411fe52813 Fixing scrollimage to actually scroll. 2016-11-16 18:16:49 -08:00
0d04376413 0.6.15 2016-11-15 20:10:08 -08:00
5deffe832c Bump pxt-core to 0.5.75 2016-11-15 20:10:07 -08:00
528f696b8c Removing gettingStarted property from pxtarget.json. Using sideDoc instead. 2016-11-14 14:24:21 -08:00
dfb5f7dd11 0.6.14 2016-11-14 07:13:33 -08:00
a4fb934a18 Bump pxt-core to 0.5.73 2016-11-14 07:13:31 -08:00
59b11ec2a9 Updating the mutate attribute of radio block (#306) 2016-11-14 07:12:24 -08:00
d961e14e5c bumped to 0.6.13 2016-11-11 15:14:54 -08:00
83c8c07b94 0.6.13 2016-11-11 15:07:50 -08:00
152f84cd79 Bump pxt-core to 0.5.72 2016-11-11 15:07:47 -08:00
ef58b54fdb adding projects menu 2016-11-11 15:06:41 -08:00
50e2f3fa94 0.6.12 2016-11-11 14:05:00 -08:00
14f4e6092a Bump pxt-core to 0.5.71 2016-11-11 14:04:56 -08:00
f7a005c656 Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2016-11-11 13:37:51 -08:00
7e19fbb3ca updated translations 2016-11-11 13:37:29 -08:00
e706809037 Adding getting-started option 2016-11-11 13:36:40 -08:00
5d6bc2f5df updated loc files 2016-11-11 10:44:21 -08:00
22433317b9 Updating the mutate attribute of radio block 2016-11-11 08:16:27 -08:00
fabf09477c fixing broken link 2016-11-11 06:54:17 -08:00
f9e0fe1b8d 0.6.11 2016-11-11 06:48:59 -08:00
c49fb27d4c Bump pxt-core to 0.5.68 2016-11-11 06:48:58 -08:00
24b20543c5 moving less, semantic to dev dependencies 2016-11-10 22:56:33 -08:00
be97665ea2 0.6.10 2016-11-10 14:53:50 -08:00
657cdeb53e Bump pxt-core to 0.5.66 2016-11-10 14:53:48 -08:00
08575d352b pxt-microbit can now be required and exports useful information about its bundled pxt-core (#305) 2016-11-10 12:12:57 -08:00
c9ba7af3f3 0.6.9 2016-11-10 08:53:57 -08:00
917072a336 Bump pxt-core to 0.5.64 2016-11-10 08:53:54 -08:00
fd5357b273 simplify projects 2016-11-10 08:37:13 -08:00
156 changed files with 4407 additions and 1311 deletions

2
.gitignore vendored
View File

@ -15,7 +15,7 @@ clients/win10/app/bld
clients/win10/*.opendb
clients/**/bin/**
clients/**/obj/**
clients/electron/projects
electron-out
hexcache
*.user

26
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,26 @@
# Contributing Code
PXT accepts bug fix pull requests. For a bug fix PR to be accepted, it must first have a tracking issue that has been marked approved. Your PR should link to the bug you are fixing. If you've submitted a PR for a bug, please post a comment in the bug to avoid duplication of effort.
PXT also accepts new feature pull requests. For a feature-level PR to be accepted, it first needs to have design discussion. Design discussion can take one of two forms a) a feature request in the issue tracker that has been marked as approved or b) the PR must be accompanied by a full design spec and this spec is later approved in the open design discussion. Features are evaluated against their complexity, impact on other features, roadmap alignment, and maintainability.
These two blogs posts on contributing code to open source projects are a good reference: [Open Source Contribution Etiquette](http://tirania.org/blog/archive/2010/Dec-31.html) by Miguel de Icaza and [Don't "Push" Your Pull Requests](https://www.igvita.com/2011/12/19/dont-push-your-pull-requests/) by Ilya Grigorik.
## Security
If you believe you have found a security issue in PXT, please share it with us privately following the guidance at the Microsoft [Security TechCenter](https://technet.microsoft.com/en-us/security/ff852094). Reporting it via this channel helps minimize risk to projects built with PXT.
## Legal
You will need to complete a Contributor License Agreement (CLA) before your pull request can be accepted. This agreement testifies that you are granting us permission to use the source code you are submitting, and that this work is being submitted under appropriate license that we can use it.
You can complete the CLA by going through the steps at https://cla.microsoft.com. Once we have received the signed CLA, we'll review the request. You will only need to do this once.
## Housekeeping
Your pull request should:
* Include a description of what your change intends to do
* Be a child commit of a reasonably recent commit in the master branch
* Pass all unit tests
* Have a clear commit message
* Include adequate tests

25
LICENSE.txt Normal file
View File

@ -0,0 +1,25 @@
PXT - Programming Experience Toolkit
The MIT License (MIT)
Copyright (c) Microsoft Corporation
All rights reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -7,6 +7,10 @@ PXT ([Microsoft Programming Experience Toolkit](https://github.com/Microsoft/pxt
[![Build Status](https://travis-ci.org/Microsoft/pxt-microbit.svg?branch=master)](https://travis-ci.org/Microsoft/pxt-microbit)
## Issue tracking
All issue tracking for this repo happens at https://github.com/Microsoft/pxt, see you there!
## Local server
The local server allows to run the editor and the documentation from your computer.

View File

@ -1,2 +0,0 @@
node_modules
projects

View File

@ -1,5 +0,0 @@
# PXT micro:bit Electron app
A very basic wrapper around the web app. To install, copy the contents of this
directory to somewhere outside the main `pxt-microbit` repository. Then run `npm
install && npm start`.

View File

@ -1,15 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>code the micro:bit</title>
</head>
<body>
<webview id="webview" style="position:absolute; left:0; top:0; right:0; bottom:0"/>
<script>
const webview = document.getElementById("webview")
const url = `http://localhost:3232/${window.location.hash}`
webview.src = url
</script>
</body>
</html>

View File

@ -1,39 +0,0 @@
const {app, BrowserWindow, Menu} = require('electron')
const pxt = require('pxt-core')
const path = require('path')
let win
const cliPath = path.join(process.cwd(), "node_modules/pxt-microbit")
function startServerAndCreateWindow() {
pxt.mainCli(cliPath, ["serve", "-no-browser"])
createWindow()
}
function createWindow () {
win = new BrowserWindow({
width: 800,
height: 600,
title: "code the micro:bit"
})
Menu.setApplicationMenu(null)
win.loadURL(`file://${__dirname}/index.html#local_token=${pxt.globalConfig.localToken}`)
win.on('closed', () => {
win = null
})
}
app.on('ready', startServerAndCreateWindow)
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit()
}
})
app.on('activate', () => {
if (win === null) {
createWindow()
}
})

View File

@ -1,14 +0,0 @@
{
"name" : "code-the-microbit",
"version" : "1.0.0",
"description": "Blocks / Javascript editor",
"author": "Microsoft",
"main" : "main.js",
"scripts": {
"start": "node_modules/.bin/electron ."
},
"devDependencies": {
"electron": "*",
"pxt-microbit": "*"
}
}

View File

@ -1,59 +0,0 @@
/// <reference path="../node_modules/pxt-core/built/pxt.d.ts"/>
import * as fs from "fs";
import * as path from "path";
import * as child_process from "child_process";
let writeFileAsync: any = Promise.promisify(fs.writeFile)
let execAsync: (cmd: string, options?: { cwd?: string }) => Promise<Buffer> = Promise.promisify(child_process.exec)
let readDirAsync = Promise.promisify(fs.readdir)
export function deployCoreAsync(res: ts.pxtc.CompileResult) {
return getBitDrivesAsync()
.then(drives => {
if (drives.length == 0) {
console.log("cannot find any drives to deploy to");
return Promise.resolve(0);
}
console.log(`copy ${ts.pxtc.BINARY_HEX} to ` + drives.join(", "));
let writeHexFile = (filename: string) => {
return writeFileAsync(filename + ts.pxtc.BINARY_HEX, res.outfiles[ts.pxtc.BINARY_HEX])
.then(() => console.log("wrote hex file to " + filename));
};
return Promise.map(drives, d => writeHexFile(d))
.then(() => drives.length);
});
}
function getBitDrivesAsync(): Promise<string[]> {
if (process.platform == "win32") {
const rx = new RegExp("^([A-Z]:).* " + pxt.appTarget.compile.deployDrives)
return execAsync("wmic PATH Win32_LogicalDisk get DeviceID, VolumeName, FileSystem")
.then(buf => {
let res: string[] = []
buf.toString("utf8").split(/\n/).forEach(ln => {
let m = rx.exec(ln)
if (m) {
res.push(m[1] + "/")
}
})
return res
})
}
else if (process.platform == "darwin") {
const rx = new RegExp(pxt.appTarget.compile.deployDrives)
return readDirAsync("/Volumes")
.then(lst => lst.filter(s => rx.test(s)).map(s => "/Volumes/" + s + "/"))
} else if (process.platform == "linux") {
const rx = new RegExp(pxt.appTarget.compile.deployDrives)
const user = process.env["USER"]
return readDirAsync(`/media/${user}`)
.then(lst => lst.filter(s => rx.test(s)).map(s => `/media/${user}/${s}/`))
} else {
return Promise.resolve([])
}
}

7
cmds/pxtrequire.ts Normal file
View File

@ -0,0 +1,7 @@
/// <reference path="../node_modules/pxt-core/typings/globals/node/index.d.ts"/>
/// <reference path="../node_modules/pxt-core/built/pxtlib.d.ts" />
import * as path from "path";
export let pxtCore = require("pxt-core");
// require.resolve() gives path to [pxt dir]/built/pxt.js, so move up twice to get pxt root dir
export let pxtCoreDir = path.resolve(require.resolve("pxt-core"), "..", "..");

View File

@ -1,6 +1,6 @@
# Blocks language
### @description Langugage constructs for the Block editor.
### @description Language constructs for the Block editor.
```namespaces
for (let i = 0;i<5;++i) {}
@ -11,4 +11,4 @@ Math.random(5);
## See Also
[logic](/blocks/logic), [loops](/blocks/loops), [math](/blocks/math), [variables](/blocks/variables)
[logic](/blocks/logic), [loops](/blocks/loops), [math](/blocks/math), [variables](/blocks/variables), [on-start](/blocks/on-start)

View File

@ -86,12 +86,14 @@ if (led.point(1,1) && led.point(2,2)) {
When you compare two Numbers, you get a Boolean value, such as the comparison `x < 5` in the code below:
```blocks
let x = Math.random(5)
if(x < 5) {
basic.showString("low");
} else {
basic.showString("high");
}
input.onButtonPressed(Button.A, () => {
let x = Math.random(5)
if(x < 5) {
basic.showString("low");
} else {
basic.showString("high");
}
})
```
See the documentation on [Numbers](/reference/types/number) for more information on comparing two Numbers. You can also [compare strings](/reference/types/string-functions) using the `equals` function.

View File

@ -14,13 +14,15 @@ Click on the dark blue gear icon (see above) to add an *else* or *if* to the cur
### Example: adjusting screen brightness
```blocks
if(input.lightLevel()<100){
led.setBrightness(255);
}
```
If the [light level](/reference/input/light-level) is `< 100`, this code sets the brightness to `255` when the button A is pressed:
If the [light level](/reference/input/light-level) is `< 100`, this code sets the brightness to `255`:
```blocks
input.onButtonPressed(Button.A, () => {
if(input.lightLevel()<100){
led.setBrightness(255);
}
})
```
### See also

View File

@ -4,14 +4,21 @@
Run part of the program the number of times you say.
```block
for(let i = 0; i <= 4; ++i) {
}
```
### Example: Count to 4
This program will show the numbers 0, 1, 2, 3, and 4 one after another on the LED screen.
```blocks
for(let i = 0; i < 5; ++i) {
basic.showNumber(i)
}
input.onButtonPressed(Button.A, () => {
for(let i = 0; i < 5; ++i) {
basic.showNumber(i)
}
})
```
### See also

View File

@ -2,7 +2,7 @@
Repeat code while a [Boolean](/blocks/logic/boolean) `condition` is true.
```blocks
```block
while(true) {
}
```
@ -16,11 +16,13 @@ The condition is tested before any code runs. Which means that if the condition
The following example uses a while loop to make a diagonal line on the LED screen (points `0, 0`, `1, 1`, `2, 2`, `3, 3`, `4, 4`).
```blocks
let index = 4;
while(index >= 0) {
led.plot(index, index);
index--;
}
input.onButtonPressed(Button.A, () => {
let index = 4;
while(index >= 0) {
led.plot(index, index);
index--;
}
})
```
### See also

22
docs/blocks/on-start.md Normal file
View File

@ -0,0 +1,22 @@
# On Start
An event that runs when the program starts.
The ``on start`` is a special event that runs when the program starts, before any other event.
Use this event to initialize your program.
## Example
In this example, ``on start`` sets a dimmer brightness on the screen and the button handler shows a string.
```blocks
input.onButtonPressed(Button.A, () => {
basic.showString("Hello!")
})
led.setBrightness(50)
```
## What about JavaScript?
``on-start`` only exists in the block editor. In JavaScript, all code executes sequentially from the first line.

View File

@ -33,7 +33,7 @@ basic.forever(() => {
When this program runs, you will see a smiley face, then a blank
screen, then a smiley again -- it never stops! (That's because of the
``forever`` block.)
`[basic.forever(() => {})]` block.)
Click **Download** to move your program to the @boardname@!
Make sure to follow the instructions.

View File

@ -17,7 +17,7 @@ input.onButtonPressed(Button.A, () => {
#### ~hint
The ``showString`` block can show letters, numbers, and punctuation
The `[basic.showString("HI")]` block can show letters, numbers, and punctuation
on the @boardname@ screen.
#### ~
@ -33,7 +33,7 @@ input.onButtonPressed(Button.B, () => {
#### ~hint
You can find the letter `B` by clicking the letter `A` on the
``onButtonPressed`` block.
`[input.onButtonPressed(Button.A, () => {})]` block.
#### ~

View File

@ -23,8 +23,8 @@ input.onButtonPressed(Button.B, () => {
```
### ~hint
The ``pick random true or false`` block randomly tells the ``if``
block `true` or `false`. If the ``pick`` block picked `true`, the
The `[Math.randomBoolean()]` block randomly tells the ``if``
block `true` or `false`. If value picked is `true`, the
``if`` block shows the letter `H`. Otherwise, it shows the letter `T`.
That's it!

View File

@ -9,7 +9,7 @@ There are 25 bright LEDs on the @boardname@ screen. Let's use them to create som
### Happy unhappy face
Draw an unhappy face instead of the blank screen. Click on the dots
in the second ``show leds`` block until it matches the blocks below.
in the second `[basic.showLeds("")]` block until it matches the blocks below.
Now you have an **animation** (cartoon) that shows a happy face,
then an unhappy one, then a happy one again, forever (or until
you turn off your @boardname@)!
@ -36,7 +36,7 @@ Click **Download** to move your program to the @boardname@!
### Your turn!
Pile up more ``show leds`` blocks to create an animation! Create an
Pile up more `[basic.showLeds("")]` blocks to create an animation! Create an
animation with at least 5 pictures. What does this animation show?
```blocks
@ -87,12 +87,6 @@ basic.forever(() => {
```
Click **Download** to move your program to the @boardname@!
#### ~hint
You can find the ``show leds`` block in the **Basic** part of the editor.
#### ~
### ~button /getting-started/buttons
NEXT: BUTTONS
### ~

View File

@ -1,3 +1,3 @@
{
"appref": "v0.5.33"
"appref": "v0.6.36"
}

View File

@ -57,7 +57,7 @@ Fun games to build with your @boardname@.
"imageUrl":"/static/mb/projects/wallet.png"
}, {
"name": "Watch",
"url":"/projects/the-watch",
"url":"/projects/watch",
"imageUrl":"/static/mb/projects/a10-watch.png"
}]
```
@ -66,6 +66,10 @@ Fun games to build with your @boardname@.
```codecard
[{
"name": "Inchworm",
"url":"/projects/inchworm",
"imageUrl":"/static/mb/projects/inchworm.jpg"
}, {
"name": "Timing gates",
"url":"/projects/timing-gates",
"imageUrl":"/static/mb/projects/timing-gates.jpg"
@ -92,4 +96,4 @@ Fun games to build with your @boardname@.
### See Also
[Flashing Heart](/projects/flashing-heart), [Smiley Buttons](/projects/smiley-buttons), [Love Meter](/projects/love-meter), [Rock Paper Scissors](/projects/rock-paper-scissors), [Compass](/projects/compass), [Hack your headphones](/projects/hack-your-headphones), [Banana keyboard](/projects/banana-keyboard), [Telegraph](/projects/telegraph), [Radio](/projects/radio), [Guitar](/projects/guitar), [Watch](/projects/the-watch)
[Flashing Heart](/projects/flashing-heart), [Smiley Buttons](/projects/smiley-buttons), [Love Meter](/projects/love-meter), [Rock Paper Scissors](/projects/rock-paper-scissors), [Compass](/projects/compass), [Hack your headphones](/projects/hack-your-headphones), [Banana keyboard](/projects/banana-keyboard), [Telegraph](/projects/telegraph), [Radio](/projects/radio), [Guitar](/projects/guitar), [Wallet](/projects/wallet), [Watch](/projects/watch)

View File

@ -10,12 +10,10 @@ Welcome! This guided tutorial will show you how to program a script that display
### ~
## Step 1
Create a loop that will continuously update the reading of the compass.
```blocks
basic.forever(() => {

View File

@ -1,26 +1,8 @@
# flashing heart
![](/static/mb/projects/a1-display.png)
### ~avatar avatar
```sim
basic.forever(() => {
basic.showLeds(`
. # . # .
# # # # #
# # # # #
. # # # .
. . # . .`
);
basic.pause(500);
basic.clearScreen();
basic.pause(500);
})
```
Use the LEDs to display a flashing heart, and then create
an animation of a broken heart. :(
Use the LEDs to display a flashing heart!
### ~
@ -55,19 +37,19 @@ basic.clearScreen();
## Step 3
Put a [forever loop](/reference/basic/forever) around it.
Put a [forever loop](/reference/basic/forever) around it to repeat the animation.
```blocks
basic.forever(() => {
basic.showLeds(`
. # . # .
# # # # #
# # # # #
. # # # .
. . # . .`
);
basic.pause(500);
basic.clearScreen();
basic.showLeds(`
. # . # .
# # # # #
# # # # #
. # # # .
. . # . .`
);
basic.pause(500);
basic.clearScreen();
})
```
@ -77,45 +59,50 @@ Add a [pause](/reference/basic/pause) to wait after clearing the screen.
```blocks
basic.forever(() => {
basic.showLeds(`
. # . # .
# # # # #
# # # # #
. # # # .
. . # . .`
);
basic.pause(500);
basic.clearScreen();
basic.pause(500);
basic.showLeds(`
. # . # .
# # # # #
# # # # #
. # # # .
. . # . .`
);
basic.pause(500);
basic.clearScreen();
basic.pause(500);
})
```
## Step 5
## Send your heartbeats over radio!
Add a second image of a broken heart.
Do you have a second @boardname@ at hand? You could use radio and send your heartbeats to other
@boardname@ and show a heart when you receive one.
* move the code in the **forever** inside
a [on data packet received](/reference/radio/on-data-packet-received) handler.
The handler will run whenever a message is received from another @boardname@.
* use [send number](/reference/radio/send-number) and [pause](/reference/basic/pause)
to broadcast a packet of data every second.
```blocks
basic.forever(() => {
basic.showLeds(`
. # . # .
# # # # #
# # # # #
. # # # .
. . # . .`
);
basic.pause(500);
basic.clearScreen();
basic.pause(500);
basic.showLeds(`
. # . # .
# . # # #
# . . . #
. # # # .
. . # . .`
);
basic.pause(500);
basic.clearScreen();
basic.pause(500);
radio.sendNumber(0)
basic.pause(1000)
})
radio.onDataPacketReceived(({receivedNumber}) => {
basic.showLeds(`
. # . # .
# # # # #
# # # # #
. # # # .
. . # . .`);
basic.pause(500)
basic.clearScreen()
basic.pause(500)
})
```
Download the .hex file onto both @boardname@ and try it out!
```package
radio
```

View File

@ -1,7 +1,5 @@
# Guitar
![guitar icon](/static/mb/projects/guitar.png)
### @description A beginner-intermediate maker activity, building a guitar with the @boardname@
### ~avatar avatar
@ -9,7 +7,7 @@
Make a @boardname@ guitar with this guided tutorial!
### ~
*playing @boardname@ guitar*
https://youtu.be/GYmdTFvxz80
## Duration

View File

@ -19,17 +19,17 @@ Build your own music player @boardname@ from headphones.
* Headphones
* Crocodile clips
## Activities
* [Connect your headphone](/projects/hack-your-headphones/make)
* [Play sounds!]()
# ~hint
**No crocodile clips!?!?!** Use wires or Aluminium foil! [Read more...](/device/foil-circuits)
# ~
## Activities
* [Connect your headphone](/projects/hack-your-headphones/make)
* [Play sounds!]()
### ~button /projects/hack-your-headphones/make
Let's get started!

View File

@ -10,7 +10,9 @@ Let's start by adding a variable where you can store data. Then rename the varia
```blocks
let light = input.lightLevel();
input.onButtonPressed(Button.A, () => {
let light = input.lightLevel();
});
```
We want to play music on button pressed in order to register an event handler that will execute whenever when you run a script and click on button pressed on the simulator. We must start by opening the Input drawer and adding `on button pressed` A. Then add a block `rest` to plays nothing for a `1/16` beat. Modify your code so that your code looks like this.

40
docs/projects/inchworm.md Normal file
View File

@ -0,0 +1,40 @@
# Inchworm
### @description A inchworm like robot built with the micro:bit
### ~avatar avatar
Make a funny inchworm robot!
### ~
https://youtu.be/BiZLjugXMbM
## Duration
3 Activities, approx 30-45 min each based on familiarity with the coding concepts
## Materials
* Cardboard pieces (recycle!)
* Glue gun or Tape (masking, duct tape, and/or packing tape)
* Scissors that can cut cardboard
* 1 @boardname@, battery holder and 2 AAA batteries
* 3 Crocodile clips
* 1 micro servo 9g SG90
* 1 paper clip
![Materials](/static/mb/projects/inchworm/materials.jpg)
## Activities
* [Servo](/projects/inchworm/servo)
* [Chassis](/projects/inchworm/chassis)
* [Code](/projects/inchworm/code)
### ~button /projects/inchworm/servo
Let's get started!
### ~

View File

@ -0,0 +1,88 @@
# Chassis
### @description Building the cardboard inchworm
### ~avatar avatar
Turn a piece of cardboard into an inchworm!
### ~
## Duration: ~45 minutes
## Materials
* Cardboard
* Scissors or cutters
* glue gun or tape
* 1 paper clip
## Step 1: cardboard
Cutout a cardboard rectangle. You can use the @boardname@ as a ruler to figure out the size.
![](/static/mb/projects/inchworm/chassis1.jpg)
## Step 2: center fold
Fold the cardboard in half over the short edge.
![](/static/mb/projects/inchworm/chassis2.jpg)
## Step 3: legs
Fold each end so they rest flat on the ground.
![](/static/mb/projects/inchworm/chassis3.jpg)
## Step 4: front teeth
Fold each corners on one end of the cardbard. This will be the front of the inchworm which is supposed to grip the ground.
![](/static/mb/projects/inchworm/chassis4.jpg)
## Step 5: back teeth
Using a scissor or a cutter (watch the fingers!), cut out various strips in the other edge. Fold one after the other.
![](/static/mb/projects/inchworm/chassis5.jpg)
## Step 6: mounting the board
Using tape or a glue gun, mount the @boardname@ on one side and the microservo on the cardobard.
![](/static/mb/projects/inchworm/chassis6.jpg)
## Step 7: mounting the servo
Attach the servo on the **edge** of the other cardboard side.
![](/static/mb/projects/inchworm/chassis7.jpg)
## Step 8: Cable clean up (optional)
Use tape to route the cables nicely on the inchworm.
![](/static/mb/projects/inchworm/chassis8.jpg)
## Step 9: attaching paper clip to servo
Unfold a paper clip and attach it to the servo arm.
![](/static/mb/projects/inchworm/clip2.jpg)
## Step 10: attaching paper clip to cardboard
Slide the folder paper clip into the cardboard, and use tape to secure it.
You might need to toy around with the size of the clip so that the servo rotation opens the inchworm sufficiently.
![](/static/mb/projects/inchworm/clip3.jpg)
## Step 11: it's ready!
Your inchworm is ready!
![](/static/mb/projects/inchworm/ready.jpg)
### ~button /projects/inchworm/code
NEXT: Code
### ~

View File

@ -0,0 +1,52 @@
# Code
### @description code to make the inchworm alive
### ~avatar avatar
Add code to make the inchworm move.
### ~
## Duration: ~30 minutes
## Step 1: walk forever
In order for the inchworm to move, the @boardname@ needs to command the servo to go between ``0`` and ``180`` degrees
at a certain pace. In the code below, the user pressed button ``A`` to launch the inchworm.
```blocks
input.onButtonPressed(Button.A, () => {
pins.servoWritePin(AnalogPin.P0, 0);
basic.pause(500);
pins.servoWritePin(AnalogPin.P0, 180);
basic.pause(500);
});
```
### ~ hint
You may have noticed that the inchworm can be rather slow or simply won't move. Try to improve the design of your legs, teeth
so that the inchworm goes as fast as possible. Trying it on carpet also great helps avoiding skidding.
### ~
## Step 2: radio controlled inchworm
You will need 2 @boardname@ for this part. By using the radio, we can make the inchworm controlled by another @boardname@.
Download the code below to the @boardname@ on the inchworm and another "controller" @boardname@. Whenere A is pressed, the inchworm will move once.
```blocks
radio.onDataPacketReceived(({receivedNumber}) => {
pins.servoWritePin(AnalogPin.P0, 0)
basic.pause(500)
pins.servoWritePin(AnalogPin.P0, 180)
basic.pause(500)
})
input.onButtonPressed(Button.A, () => {
radio.sendNumber(0)
})
```
```package
radio
```

View File

@ -0,0 +1,130 @@
# Preparing the servo
### @description Connecting the servo to crocodile clips
### ~avatar avatar
Equip the microservo with crocodile clips.
### ~
## Duration: ~30 minutes
## Materials
* Cutting pliers or wire cutter
* Tape (masking, duct tape, and/or packing tape)
* 3 crocodile clips, yellow, red and black.
* 1 micro servo 9g (SG90)
## Using a microservo with the @boardname@
The @boardname@ provides just enough current to operate the SG90 microservo.
The servo requires 3 connections: GND, 3V and a logic pin.
In this tutorial, we will equip the servo with crocodile clips to make it easier to use.
However, you could also use a shield or female to crocodile clips to acheive the same effect.
If you are running a class or activity, you should consider preparing all servos before hand.
### ~ hint
Kitronik wrote an excellent in-depth guide about using servos with the @boardname@.
Check it out at https://www.kitronik.co.uk/blog/using-bbc-microbit-control-servo/ .
### ~
## Step 1: cutout the connector
Using the cutting pliers, cut out the dark plastic connector.
![](/static/mb/projects/inchworm/servo1.jpg)
## Step 2: strip out cables
Using the plier or a wire stripper, strip the plastic from the cables.
![](/static/mb/projects/inchworm/servotrim.jpg)
## Step 3: threading the servo cablers
Thread the servo cables.
![](/static/mb/projects/inchworm/servo3.jpg)
## Step 4: crocobile clip claps
Cut a crocodile cable in two and strip out the casing.
If possible try to use the same cable colors as the servo!
![](/static/mb/projects/inchworm/servo4.jpg)
## Step 5: thread cables together
Place the cables next to each other
![](/static/mb/projects/inchworm/servo5.jpg)
... and thread them together.
![](/static/mb/projects/inchworm/servo6.jpg)
### ~ hint
It is very **important** to ensure that there is a good connection between the 2 cables.
If the connection is weak, the microservo will not receive enough current and it will not work.
If you have access to a soldering iron, we strongly recommend to solver this connection.
### ~
## Step 4: protect the connection
Protect the connection with electrical or duct tape.
![](/static/mb/projects/inchworm/servo7.jpg)
## Step 5: repeat for all cables
Repeat the same process until all cables are connected.
![](/static/mb/projects/inchworm/servo8.jpg)
## Step 6: testing!
It's time to test that your connection are all proper and that the servo will function **when the @boardname@ is powered by battery**.
* Connect the microservo to the @boardname@. Black cable on ``GND``, red cable on ``3V`` and remaining cable on ``P0``.
![](/static/mb/projects/inchworm/circuit1.jpg)
### ~ hint
When attaching the crocodile clips to the pins, don't hesitate to grab the side of the board with the jaws.
![](/static/mb/projects/inchworm/circuit2.jpg)
### ~
* Download the following code to your @boardname@
```blocks
let a = 0
basic.forever(() => {
a = input.acceleration(Dimension.X)
pins.servoWritePin(AnalogPin.P0, pins.map(
a,
-512,
512,
0,
180
))
})
```
* When powered by USB, make sure that the servo moves when you tilt the board.
* When powered by batteries **only**, make sure that the servo moves when you tilt the board.
If your servo seems to sutter and stay stuck at a particular position, it means that it is not receiving enough power.
This is probably due to a weak connection or low battery level. Check each connection and check your batteries.
### ~button /projects/inchworm/chassis
NEXT: Chassis
### ~

View File

@ -1,8 +1,10 @@
# love meter
![](/static/mb/projects/a3-pins.png)
### ~avatar avatar
Use pins P0, P1 and P2 to change the display by creating a circuit with your body.
Use pins and your body to change the display!
### ~
## Step 1

View File

@ -1,10 +1,8 @@
# magic button trick
Perform a magic trick where you appear to make the **A** and **B** button of your @boardname@ swap over just by moving a sticky label.
### ~avatar avatar
Welcome! This activity will teach you how to use the @boardname@'s compass to detect a nearby magnet
Build a magic trick that uses the @boardname@'s compass to detect a nearby magnet!
### ~
This is a simple magic trick you can perform to amaze your friends, where by moving the sticky labels on your @boardname@'s **A** and **B** button you appear to make the buttons really switch over. To see the trick performed watch the video below.
@ -39,7 +37,7 @@ input.onButtonPressed(Button.B, () => {
We will use the @boardname@'s compass to detect the magnet. Compass's tell us what direction we are pointing by detecting the Earth's magnetic field but they can also detect any other magnet nearby. We will use that to check if our magnet is next to the @boardname@ by using the [magnetic force](/reference/input/magnetic-force) block found in the input menu's 'more' section. As we only want to measure the strength we change the drop down to select 'strength':
```blocks
```block
input.magneticForce(Dimension.Strength)
```
@ -52,16 +50,19 @@ If you have ever played with magnets you know they have two ends, often called a
So in the code below we will check if the absolute value of our magnetic field strength reading is more than 100 and save the result of that check in a new variable called 'isSwitched':
```blocks
let isSwitched = Math.abs(input.magneticForce(Dimension.Strength)) > 100
let force = Math.abs(input.magneticForce(Dimension.Strength));
let isSwitched = force > 100
```
## Step 4: running our 'magnet nearby' check all the time
At the moment our code to detect the magnet being nearby will only run once so we need to put it into a [forever](/reference/basic/forever) block so that it keeps getting run again and again checking for the magnet to come near to the @boardname@. We should also make sure 'isSwitched' is false when our program starts.
```blocks
let force = 0;
let isSwitched = false;
basic.forever(() => {
let isSwitched = Math.abs(input.magneticForce(Dimension.Strength)) > 100
force = Math.abs(input.magneticForce(Dimension.Strength));
isSwitched = force > 100
})
```
@ -70,10 +71,11 @@ basic.forever(() => {
Now we can check the value of our variable 'isSwitched' whenever we want and we will know that the magnet is nearby if it's value is 'true'. Let's use that to change how the buttons work and complete the code for our trick. We will add an 'if, else' block to each button's code and check if we should swap over what each button displays because 'isSwitched' is equal to true:
```blocks
let force = 0;
let isSwitched = false;
basic.forever(() => {
isSwitched = Math.abs(input.magneticForce(Dimension.Strength)) > 100
force = Math.abs(input.magneticForce(Dimension.Strength));
isSwitched = force > 100
})
input.onButtonPressed(Button.A, () => {

View File

@ -1,51 +1,11 @@
# rock paper scissors
![](/static/mb/projects/a4-motion.png)
### ~avatar avatar
```sim
input.onGesture(Gesture.Shake, () => {
let img = Math.random(3)
if (img == 0) {
basic.showLeds(`
# # # # #
# . . . #
# . . . #
# . . . #
# # # # #
`)
} else if (img == 1) {
basic.showLeds(`
. . . . .
. # # # .
. # # # .
. # # # .
. . . . .
`)
} else {
basic.showLeds(`
# # . . #
# # . # .
. . # . .
# # . # .
# # . . #
`)
}
})
```
In this project, you will build a Rock Paper Scissors game with the @boardname@.
You can play the game with a friend who has it on a @boardname@.
You can also play it with friends who are just using their hands.
Build a rock paper scissors game!
### ~
## Materials needed
* Your @boardname@ -- that's it!
## Step 1: Getting started
We want the @boardname@ to choose rock, paper, or scissors when you shake it.

View File

@ -1,8 +1,10 @@
# smiley buttons
![](/static/mb/projects/a2-buttons.png)
### ~avatar
Use buttons to show a smiley or frowny face.
Use buttons to show a smiley face!
### ~
## Step 1
@ -10,8 +12,8 @@ Use [show leds](/reference/basic/show-leds) to make a smiley face:
```blocks
basic.showLeds(`
. # . # .
. # . # .
# # . # #
# # . # #
. . . . .
# . . . #
. # # # .`
@ -20,56 +22,93 @@ basic.showLeds(`
## Step 2
Add an input block for when [button A is pressed](/reference/input/button-is-pressed), and put a
frowny face inside it:
Add an input block for when [button A is pressed](/reference/input/button-is-pressed),
and **move** the smiley face inside it:
```blocks
basic.showLeds(`
. # . # .
. # . # .
. . . . .
# . . . #
. # # # .`
);
input.onButtonPressed(Button.A, () => {
basic.showLeds(`
. # . # .
. # . # .
. . . . .
. # # # .
# . . . #`
);
});
```
## Step 3
Now add blocks so that when [button B is pressed](/reference/input/button-is-pressed), a smiley appears:
```blocks
basic.showLeds(`
. # . # .
. # . # .
. . . . .
# . . . #
. # # # .`
);
input.onButtonPressed(Button.A, () => {
basic.showLeds(`
. # . # .
. # . # .
. . . . .
. # # # .
# . . . #`
);
});
input.onButtonPressed(Button.B, () => {
basic.showLeds(`
. # . # .
. # . # .
# # . # #
# # . # #
. . . . .
# . . . #
. # # # .`
);
});
```
Try pressing button A!
## Step 3
Now add blocks so that when [button B is pressed](/reference/input/on-button-pressed),
a frowney appears:
```blocks
input.onButtonPressed(Button.A, () => {
basic.showLeds(`
# # . # #
# # . # #
. . . . .
# . . . #
. # # # .`
);
});
input.onButtonPressed(Button.B, () => {
basic.showLeds(`
# # . # #
# # . # #
. . . . .
. # # # .
# . . . #`
);
});
```
Try pressing ``A`` or ``B``!
## Send your smileys over radio
Do you have a second @boardname@ at hand? You could use radio and send your smileys or frownies to other
@boardname@.
Since radio can send numbers, we decide that ``0`` is the code for displaying a smiley
and ``1`` is the code for a frowney.
Change your code as follows:
* [radio send number](/reference/radio/send-number) sends a number
to any other @boardname@ in range
* [radio on data packet received](/reference/radio/on-data-packet-received) runs code
when data is received over radio
```blocks
input.onButtonPressed(Button.A, () => {
radio.sendNumber(0)
})
input.onButtonPressed(Button.B, () => {
radio.sendNumber(1)
})
radio.onDataPacketReceived(({receivedNumber}) => {
if (receivedNumber == 0) {
basic.showLeds(`
# # . # #
# # . # #
. . . . .
# . . . #
. # # # .
`)
} else {
basic.showLeds(`
# # . # #
# # . # #
. . . . .
. # # # .
# . . . #
`)
}
})
```
```package
radio
```

View File

@ -1,7 +1,5 @@
# Wallet
![wallet icon](/static/mb/projects/wallet.png)
### @description A beginner maker activity, building a duct tape wallet with the @boardname@
### ~avatar avatar
@ -12,23 +10,6 @@ Make a @boardname@ wallet with this guided tutorial!
![wallet image](/static/mb/projects/wallet/wallet.jpg)
## Duration
2 Activities, approx 30-45 min each based on familiarity with the coding concepts
## Materials
* Paper sheet
* Tape (masking, duct tape, and/or packing tape)
* Scissors
* 1 @boardname@, battery holder and 2 AAA batteries
* Marker or pen
## Activities
* [Make](/projects/wallet/make)
* [Code](/projects/wallet/code)
### ~button /projects/wallet/make
Let's get started!

20
docs/projects/watch.md Normal file
View File

@ -0,0 +1,20 @@
# the watch
### ~avatar
Build your own @boardname@ watch from an old pair of jeans and T-shirt!
### ~
![](/static/mb/lessons/the-watch-1.png)
### ~button /projects/watch/make
Let's get started!
### ~
### Acknowledgements
Artistic design by Melinda Hoeneisen.

View File

@ -1,12 +1,14 @@
![](/static/mb/projects/a10-watch.png)
# the watch - Make
# the watch
### @description Maker Project for Watch
![](/static/mb/lessons/the-watch-0.png)
### ~avatar avatar
In this project, you will build your own wearable @boardname@ watch from an old pair of jeans and T-shirt. Project duration: 15 minutes.
Make a watch for your @boardname@
![](/static/mb/lessons/the-watch-1.png)
### ~
## Duration: ~30 minutes
## Materials
@ -147,8 +149,3 @@ Trim any leftover fabric, threads or tape.
![](/static/mb/lessons/the-watch-23.png)
Your watch is ready!
### Acknowledgements
Artistic design by Melinda Hoeneisen.

View File

@ -30,7 +30,7 @@ control.inBackground(() => {
```
## Bluetooth
```namespaces
devices.tellCameraTo(MesCameraEvent.TakePhoto);
bluetooth.onBluetoothConnected(() => {});

View File

@ -18,15 +18,15 @@ and updates the screen with the direction.
basic.forever(() => {
let heading = input.compassHeading()
if (heading < 45) {
basic.showString("N", 100)
basic.showString("N")
} else if (heading < 135) {
basic.showString("E", 100)
basic.showString("E")
}
else if (heading < 225) {
basic.showString("S", 100)
basic.showString("S")
}
else {
basic.showString("W", 100)
basic.showString("W")
}
})
```
@ -40,7 +40,7 @@ You can use a program like this to count things with your @boardname@.
```blocks
let num = 0
basic.forever(() => {
basic.showNumber(num, 150)
basic.showNumber(num)
})
input.onButtonPressed(Button.A, () => {
num = num + 1
@ -56,10 +56,10 @@ Try this on your @boardname@:
```blocks
basic.forever(() => {
basic.showNumber(6789, 150)
basic.showNumber(6789)
})
input.onButtonPressed(Button.A, () => {
basic.showNumber(2, 150)
basic.showNumber(2)
})
```

View File

@ -19,6 +19,7 @@ bluetooth.startMagnetometerService();
bluetooth.startTemperatureService();
bluetooth.onBluetoothConnected(() => {});
bluetooth.onBluetoothDisconnected(() => {});
bluetooth.setTransmitPower(7);
```
## UART
@ -31,6 +32,14 @@ bluetooth.uartWriteNumber(0);
bluetooth.uartWriteValue("", 0);
```
## Eddystone
```cards
bluetooth.advertiseUid(42, 1, 7, true);
bluetooth.advertiseUrl("https://pxt.microbit.org/", 7, true);
bluetooth.stopAdvertising();
```
```package
bluetooth
```
@ -47,4 +56,7 @@ For more advanced information on the @boardname@ Bluetooth UART service includin
[uartWriteString](/reference/bluetooth/uart-write-string),
[uartWriteNumber](/reference/bluetooth/uart-write-number),
[uartWriteValue](/reference/bluetooth/uart-write-value),
[onBluetoothConnected](/reference/bluetooth/on-bluetooth-connected), [onBluetoothDisconnected](/reference/bluetooth/on-bluetooth-disconnected)
[onBluetoothConnected](/reference/bluetooth/on-bluetooth-connected),
[onBluetoothDisconnected](/reference/bluetooth/on-bluetooth-disconnected),
[advertiseUrl](/reference/bluetooth/advertise-url),
[stopAdvertising](/reference/bluetooth/stop-advertising)

View File

@ -0,0 +1,37 @@
# Avertise UID Buffer
Advertises a UID via the Eddystone protocol over Bluetooth.
## ~hint
### Eddystone
Bluetooth beacons are used to indicate proximity to a place or object of interest.
Beacons use Bluetooth advertising to broadcast a small amount of data,
which can be received and acted upon by anyone in range with a suitable device and software, typically a smartphone and application.
There are various beacon message formats, which define the way Bluetooth advertising packets are used as containers for beacon data.
iBeacon is Apple's beacon message format. Eddystone comes from Google.
Read more at https://lancaster-university.github.io/microbit-docs/ble/eddystone/ .
## ~
```sig
bluetooth.advertiseUidBuffer(pins.createBuffer(16), 7, true);
```
### Parameters
* ``buffer`` - a 16 bytes buffer containing the namespace (first 10 bytes) and instance (last 6 bytes).
* ``power`` - a [number](/reference/types/number) representing the power level between 0 (short) and 7 (maximum range).
* ``connectable`` - a [boolean](/blocks/logic/boolean) indicating whether or not the micro:bit should accept connections.
## See Also
[stop-advertising](/reference/bluetooth/stop-advertising), [advertise-uid](/reference/bluetooth/advertise-uid)
```package
bluetooth
```

View File

@ -0,0 +1,46 @@
# Avertise UID
Advertises a UID via the Eddystone protocol over Bluetooth.
## ~hint
### Eddystone
Bluetooth beacons are used to indicate proximity to a place or object of interest.
Beacons use Bluetooth advertising to broadcast a small amount of data,
which can be received and acted upon by anyone in range with a suitable device and software, typically a smartphone and application.
There are various beacon message formats, which define the way Bluetooth advertising packets are used as containers for beacon data.
iBeacon is Apple's beacon message format. Eddystone comes from Google.
Read more at https://lancaster-university.github.io/microbit-docs/ble/eddystone/ .
## ~
```sig
bluetooth.advertiseUid(42, 1, 7, true);
```
### Parameters
* ``namespace`` last 4 bytes of the namespace uid (6 to 9)
* ``instance`` last 4 bytes of the instance (2 to 5)
* ``power`` - a [number](/reference/types/number) representing the power level between 0 (short) and 7 (maximum range).
* ``connectable`` - a [boolean](/blocks/logic/boolean) indicating whether or not the micro:bit should accept connections.
## Encoding
The bytes of ``namespace`` and ``instance`` are encoded to generate the 10 bytes UID namespace and 6 bytes UID instance.
```
UID namespace: [0, ..., namespace]
UID instance: [0, ..., instance]
```
## See Also
[stop-advertising](/reference/bluetooth/stop-advertising), [advertise-uid-buffer](/reference/bluetooth/advertise-uid-buffer)
```package
bluetooth
```

View File

@ -0,0 +1,42 @@
# Avertise Url
Advertises a URL via the Eddystone protocol over Bluetooth.
## ~hint
### Eddystone
Bluetooth beacons are used to indicate proximity to a place or object of interest.
Beacons use Bluetooth advertising to broadcast a small amount of data,
which can be received and acted upon by anyone in range with a suitable device and software, typically a smartphone and application.
There are various beacon message formats, which define the way Bluetooth advertising packets are used as containers for beacon data.
iBeacon is Apple's beacon message format. Eddystone comes from Google.
Read more at https://lancaster-university.github.io/microbit-docs/ble/eddystone/ .
## ~
```sig
bluetooth.advertiseUrl("https://pxt.microbit.org/", 7, true);
```
### Parameters
* ``url`` - a [string](/reference/types/string) containing the URL to broadcast, at most 17 characters long, excluding the protocol (eg: ``https://``) which gets encoded as 1 byte.
* ``power`` - a [number](/reference/types/number) representing the power level between 0 (short) and 7 (maximum range).
* ``connectable`` - a [boolean](/blocks/logic/boolean) indicating whether or not the micro:bit should accept connections.
### Example: Broadcast a secret code
```blocks
bluetooth.advertiseUrl("https://pxt.io?secret=42", 7, true);
```
## See Also
[stop-advertising](/reference/bluetooth/stop-advertising), [advertise-uid](/reference/bluetooth/advertise-uid)
```package
bluetooth
```

View File

@ -0,0 +1,26 @@
# Bluetooth Set Transmit Power
### ~hint
![](/static/bluetooth/Bluetooth_SIG.png)
For another device like a smartphone to use any of the Bluetooth "services" which the @boardname@ has, it must first be [paired with the @boardname@](/reference/bluetooth/bluetooth-pairing). Once paired, the other device may connect to the @boardname@ and exchange data relating to many of the @boardname@'s features.
### ~
Change the output power level of the transmitter to the given value.
```sig
bluetooth.setTransmitPower(7);
```
### Parameters
* `power`: a [number](/reference/types/number) in the range ``0..7``, where ``0`` is the lowest power and ``7`` is the highest.
### See also
[About Bluetooth](/reference/bluetooth/about-bluetooth), [@boardname@ Bluetooth profile overview ](http://lancaster-university.github.io/microbit-docs/ble/profile/), [@boardname@ Bluetooth profile reference](http://lancaster-university.github.io/microbit-docs/resources/bluetooth/microbit-profile-V1.9-Level-2.pdf), [Bluetooth on @boardname@ resources](http://bluetooth-mdw.blogspot.co.uk/p/bbc-microbit.html), [Bluetooth SIG](https://www.bluetooth.com)
```package
bluetooth
```

View File

@ -0,0 +1,38 @@
# Stop Advertising
Stops advertising URL via the Eddystone protocol over Bluetooth.
## ~hint
### Eddystone
Bluetooth beacons are used to indicate proximity to a place or object of interest.
Beacons use Bluetooth advertising to broadcast a small amount of data,
which can be received and acted upon by anyone in range with a suitable device and software, typically a smartphone and application.
There are various beacon message formats, which define the way Bluetooth advertising packets are used as containers for beacon data.
iBeacon is Apple's beacon message format. Eddystone comes from Google.
Read more at https://lancaster-university.github.io/microbit-docs/ble/eddystone/ .
## ~
```sig
bluetooth.stopAdvertising();
```
### Example: stop advertising on button pressed
```blocks
input.onButtonPressed(Button.A, () => {
bluetooth.stopAdvertising();
})
```
## See Also
[advertise-url](/reference/bluetooth/advertise-url)
```package
bluetooth
```

View File

@ -25,6 +25,15 @@ let freq = music.noteFrequency(Note.C)
music.playTone(freq, 1000)
```
### Using other pins
Use [analogSetPitchPin](/reference/pins/analog-set-pitch-pin) to change that pin used to generate music.
```blocks
pins.analogSetPitchPin(AnalogPin.P1);
```
### See also
[rest](/reference/music/rest), [ring tone](/reference/music/ring-tone) , [tempo](/reference/music/tempo), [set tempo](/reference/music/set-tempo),

View File

@ -32,6 +32,14 @@ basic.forever(() => {
})
```
### Using other pins
Use [analogSetPitchPin](/reference/pins/analog-set-pitch-pin) to change that pin used to generate music.
```blocks
pins.analogSetPitchPin(AnalogPin.P1);
```
### See also
[rest](/reference/music/rest), [play tone](/reference/music/play-tone),

View File

@ -1,6 +1,7 @@
# Analog Pitch
Emits a Pulse With Modulation (PWM) signal to the current pitch [pin](/device/pins). Use [analog set pitch pin](/reference/pins/analog-set-pitch-pin) to set the current pitch pin.
Emits a Pulse With Modulation (PWM) signal to the pin ``P0``.
Use [analog set pitch pin](/reference/pins/analog-set-pitch-pin) to set the current pitch pin.
```sig
pins.analogPitch(440, 300)
@ -17,6 +18,7 @@ pins.analogPitch(440, 300)
pins.analogSetPitchPin("P0")
let frequency1 = 440
let duration = 1000
pins.analogSetPitchPin(AnalogPin.P1);
pins.analogPitch(frequency1, duration)
```

View File

@ -7,8 +7,11 @@ serial.writeLine("");
serial.writeNumber(0);
serial.writeValue("x", 0);
serial.writeString("");
serial.readUntil(",");
serial.readLine();
serial.readString();
serial.redirect(SerialPin.P0, SerialPin.P0, BaudRate.BaudRate115200);
serial.onDataReceived(",", () => {})
```
### See Also

View File

@ -0,0 +1,29 @@
# Serial On Data Received
Registers an event to be fired when one of the delimiter is matched.
```sig
serial.onDataReceived(",", () => {})
```
### Parameters
* `delimiters` is a [string](/reference/types/string) containing any of the character to match
### Example
Read values separated by `,`:
```blocks
serial.onDataReceived(serial.delimiters(Delimiters.Comma), () => {
basic.showString(serial.readUntil(serial.delimiters(Delimiters.Comma)))
})
```
### See also
[serial](/device/serial),
[serial write line](/reference/serial/write-line),
[serial write value](/reference/serial/write-value)

View File

@ -0,0 +1,27 @@
# Serial Read String
Read the buffered serial data as a string
```sig
serial.readString();
```
### Returns
* a [string](/reference/types/string) containing input from the serial port. Empty if no data available.
### Example
The following program scrolls text on the screen as it arrives from serial.
```blocks
basic.forever(() => {
basic.showString(serial.readString());
});
```
### See also
[serial](/device/serial),
[serial write line](/reference/serial/write-line),
[serial write value](/reference/serial/write-value)

View File

@ -0,0 +1,28 @@
# Serial Read Until
Read a text from the serial port until a delimiter is found.
```sig
serial.readUntil(",");
```
### Returns
* a [string](/reference/types/string) containing input from the serial port, such as a response typed by a user
### Example
The following example reads strings separated by commands (``,``).
```blocks
basic.forever(() => {
let answer = serial.readUntil(",");
serial.writeLine(answer);
});
```
### See also
[serial](/device/serial),
[serial write line](/reference/serial/write-line),
[serial write value](/reference/serial/write-value)

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

61
docs/static/avatar.svg vendored Normal file
View File

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
role="img"
aria-labelledby="title desc"
xml:space="preserve"
enable-background="new 0 0 280 32.755"
height="52.672001"
width="52.672001"
version="1.1"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="logo.square.black.svg"><sodipodi:namedview
pagecolor="#ff00ff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1536"
inkscape:window-height="801"
id="namedview14"
showgrid="false"
inkscape:zoom="2.0836233"
inkscape:cx="83.390493"
inkscape:cy="16.071144"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" /><rect
id="backgroundrect"
width="195.47368"
height="34.210526"
x="0"
y="18.461473"
class=""
style="fill:none;stroke:none" /><title
id="title"
lang="en-GB">BBC micro:bit</title><desc
id="desc"
lang="en-GB">BBC micro:bit logo</desc><metadata
id="metadata37"><rdf:rdf><cc:work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:work></rdf:rdf><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title>BBC micro:bit</dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs35" /><path
inkscape:connector-curvature="0"
class=""
d="m 37.363,29.377 c -1.677,0 -3.035,-1.364 -3.035,-3.042 0,-1.678 1.357,-3.038 3.035,-3.038 1.684,0 3.039,1.36 3.039,3.038 0,1.678 -1.355,3.042 -3.039,3.042 M 15.052,23.3 c -1.677,0 -3.042,1.357 -3.042,3.035 0,1.678 1.363,3.042 3.042,3.042 1.674,0 3.036,-1.364 3.036,-3.042 0,-1.678 -1.363,-3.035 -3.036,-3.035 m -0.003,-5.99 22.576,0 c 4.979,0 9.027,4.047 9.027,9.027 0,4.979 -4.049,9.031 -9.027,9.031 l -22.576,0 c -4.977,0 -9.0299993,-4.053 -9.0299993,-9.031 C 6.0180007,21.357 10.072,17.31 15.049,17.31 m 22.576,24.076 c 8.299,0 15.047,-6.75 15.047,-15.049 0,-8.299 -6.748,-15.051 -15.047,-15.051 l -22.576,0 C 6.7500007,11.286 6.9250488e-7,18.038 6.9250488e-7,26.337 6.9250488e-7,34.636 6.7500007,41.386 15.049,41.386 l 22.576,0"
id="path21"
style="fill:#000000"
sodipodi:nodetypes="csssccsssccsssscccsssssc" /></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

61
docs/static/loader.svg vendored Normal file
View File

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
role="img"
aria-labelledby="title desc"
xml:space="preserve"
enable-background="new 0 0 280 32.755"
height="52.672001"
width="52.672001"
version="1.1"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="logo.square.white.svg"><sodipodi:namedview
pagecolor="#ff00ff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1536"
inkscape:window-height="801"
id="namedview14"
showgrid="false"
inkscape:zoom="2.0836233"
inkscape:cx="83.390493"
inkscape:cy="16.071144"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" /><rect
id="backgroundrect"
width="195.47368"
height="34.210526"
x="0"
y="18.461473"
class=""
style="fill:none;stroke:none" /><title
id="title"
lang="en-GB">BBC micro:bit</title><desc
id="desc"
lang="en-GB">BBC micro:bit logo</desc><metadata
id="metadata37"><rdf:rdf><cc:work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:work></rdf:rdf><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title>BBC micro:bit</dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs35" /><path
inkscape:connector-curvature="0"
class=""
d="m 37.363,29.377 c -1.677,0 -3.035,-1.364 -3.035,-3.042 0,-1.678 1.357,-3.038 3.035,-3.038 1.684,0 3.039,1.36 3.039,3.038 0,1.678 -1.355,3.042 -3.039,3.042 M 15.052,23.3 c -1.677,0 -3.042,1.357 -3.042,3.035 0,1.678 1.363,3.042 3.042,3.042 1.674,0 3.036,-1.364 3.036,-3.042 0,-1.678 -1.363,-3.035 -3.036,-3.035 m -0.003,-5.99 22.576,0 c 4.979,0 9.027,4.047 9.027,9.027 0,4.979 -4.049,9.031 -9.027,9.031 l -22.576,0 c -4.977,0 -9.0299993,-4.053 -9.0299993,-9.031 C 6.0180007,21.357 10.072,17.31 15.049,17.31 m 22.576,24.076 c 8.299,0 15.047,-6.75 15.047,-15.049 0,-8.299 -6.748,-15.051 -15.047,-15.051 l -22.576,0 C 6.7500007,11.286 6.9250488e-7,18.038 6.9250488e-7,26.337 6.9250488e-7,34.636 6.7500007,41.386 15.049,41.386 l 22.576,0"
id="path21"
style="fill:#ffffff"
sodipodi:nodetypes="csssccsssccsssscccsssssc" /></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
docs/static/mb/projects/inchworm.jpg vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

View File

@ -0,0 +1,74 @@
# Getting started
### Step 1
Place blocks in the workspace to scroll text on the screen.
```blocks
basic.showString("Hello!")
```
### Step 2
Click ``|Download|`` to transfer your code in your @boardname@!
### Step 3
Great, the text scrolled! But then it stopped.
Let's make it scroll when button **A** is pressed.
```block
input.onButtonPressed(Button.A, () => {
basic.showString("Hello!")
});
```
### Step 4
Click ``|Download|`` to transfer your code
and press **A** to scroll your text.
### Step 5
Place more blocks to display a smiley when button **B** is pressed.
Use the dropdown to find ``B``!
```block
input.onButtonPressed(Button.B, () => {
basic.showLeds(`
# # . # #
# # . # #
. . . . .
# . . . #
. # # # .
`)
})
```
### Step 6
Drag more blocks to display a frownie when @boardname@ is shaken.
```block
input.onGesture(Gesture.Shake, () => {
basic.showLeds(`
# # . # #
# # . # #
. . . . .
. # # # .
# . . . #
`)
})
```
### Step 7
Drag more blocks to display a random number when pin ``P0`` is touched.
Hold your right thumb on the ``GND`` metal pin
at press the ``0`` pin with your right hand to trigger this event.
```block
input.onPinPressed(TouchPin.P0, () => {
basic.showNumber(Math.random(7))
})
```

View File

@ -38,7 +38,7 @@ That's it!
### Installation Instructions
* Download the [Microsoft.Uploader.Microbit.zip](https://pxt.microbit.org/microbit-uploader.zip) file to your local computer.
* Download the [Microsoft.Uploader.Microbit.zip](https://www.touchdevelop.com/microbituploader.zip) file to your local computer.
* Unzip the .zip file to your desktop.
* Launch the Microsoft.Uploader.exe file before working on your @boardname@.

14
electron/product.json Normal file
View File

@ -0,0 +1,14 @@
{
"applicationName": "pxt-microbit-oss",
"dataFolderName": ".pxt-microbit-oss",
"darwinBundleIdentifier": "com.microsoft.pxtmicrobitoss",
"nameShort": "PXT microbit - OSS",
"nameLong": "PXT micro:bit - OSS",
"targetId": "pxt-microbit",
"win32AppId": "{{92db071a-6f58-4938-8c97-13c873f4da13}",
"win32AppUserModelId": "Microsoft.PXTmicrobitOss",
"win32DirName": "Microsoft PXT microbit - OSS",
"win32MutexName": "pxtmicrobitoss",
"win32NameVersion": "Microsoft PXT microbit-OSS",
"win32RegValueName": "PXTmicrobitOss"
}

9
electron/release.json Normal file
View File

@ -0,0 +1,9 @@
{
"versions": {
"0": {
"latest": "v0.7.29",
"banned": [],
"prompt": "v0.7.29"
}
}
}

View File

@ -1,62 +1,4 @@
<xml xmlns="http://www.w3.org/1999/xhtml">
<block type="device_forever">
<statement name="HANDLER">
<block type="device_show_leds">
<field name="LED00">FALSE</field>
<field name="LED10">FALSE</field>
<field name="LED20">FALSE</field>
<field name="LED30">FALSE</field>
<field name="LED40">FALSE</field>
<field name="LED01">FALSE</field>
<field name="LED11">TRUE</field>
<field name="LED21">FALSE</field>
<field name="LED31">TRUE</field>
<field name="LED41">FALSE</field>
<field name="LED02">FALSE</field>
<field name="LED12">FALSE</field>
<field name="LED22">FALSE</field>
<field name="LED32">FALSE</field>
<field name="LED42">FALSE</field>
<field name="LED03">TRUE</field>
<field name="LED13">FALSE</field>
<field name="LED23">FALSE</field>
<field name="LED33">FALSE</field>
<field name="LED43">TRUE</field>
<field name="LED04">FALSE</field>
<field name="LED14">TRUE</field>
<field name="LED24">TRUE</field>
<field name="LED34">TRUE</field>
<field name="LED44">FALSE</field>
<next>
<block type="device_show_leds">
<field name="LED00">FALSE</field>
<field name="LED10">FALSE</field>
<field name="LED20">FALSE</field>
<field name="LED30">FALSE</field>
<field name="LED40">FALSE</field>
<field name="LED01">FALSE</field>
<field name="LED11">FALSE</field>
<field name="LED21">FALSE</field>
<field name="LED31">FALSE</field>
<field name="LED41">FALSE</field>
<field name="LED02">FALSE</field>
<field name="LED12">FALSE</field>
<field name="LED22">FALSE</field>
<field name="LED32">FALSE</field>
<field name="LED42">FALSE</field>
<field name="LED03">FALSE</field>
<field name="LED13">FALSE</field>
<field name="LED23">FALSE</field>
<field name="LED33">FALSE</field>
<field name="LED43">FALSE</field>
<field name="LED04">FALSE</field>
<field name="LED14">FALSE</field>
<field name="LED24">FALSE</field>
<field name="LED34">FALSE</field>
<field name="LED44">FALSE</field>
</block>
</next>
</block>
</statement>
</block>
<block type="pxt-on-start"></block>
<block type="device_forever"></block>
</xml>

View File

@ -1,16 +1 @@
basic.forever(() => {
basic.showLeds(`
. # . # .
# . # . #
# . . . #
. # . # .
. . # . .
`)
basic.showLeds(`
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
`)
})

View File

@ -1,9 +1,24 @@
{
"bluetooth": "Support for additional Bluetooth services.",
"bluetooth": "Support for additional Bluetooth services.\n\nSupport for additional Bluetooth services.",
"bluetooth.advertiseUid": "Advertise an Eddystone UID",
"bluetooth.advertiseUidBuffer": "Advertise an Eddystone UID",
"bluetooth.advertiseUidBuffer|param|connectable": "true to keep bluetooth connectable for other services, false otherwise.",
"bluetooth.advertiseUidBuffer|param|nsAndInstance": "16 bytes buffer of namespace (bytes 0-9) and instance (bytes 10-15)",
"bluetooth.advertiseUidBuffer|param|power": "power level between 0 and 7, eg: 7",
"bluetooth.advertiseUid|param|connectable": "true to keep bluetooth connectable for other services, false otherwise.",
"bluetooth.advertiseUid|param|instance": "4 last bytes of the instance uid",
"bluetooth.advertiseUid|param|ns": "4 last bytes of the namespace uid",
"bluetooth.advertiseUid|param|power": "power level between 0 and 7, eg: 7",
"bluetooth.advertiseUrl": "Advertise an Eddystone URL",
"bluetooth.advertiseUrl|param|connectable": "true to keep bluetooth connectable for other services, false otherwise.",
"bluetooth.advertiseUrl|param|power": "power level between 0 and 7, eg: 7",
"bluetooth.advertiseUrl|param|url": "the url to transmit. Must be no longer than the supported eddystone url length, eg: \"https://pxt.io/\"",
"bluetooth.onBluetoothConnected": "Register code to run when the micro:bit is connected to over Bluetooth",
"bluetooth.onBluetoothConnected|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|param|body": "Code to run when a Bluetooth connection is lost",
"bluetooth.setTransmitPower": "Sets the bluetooth transmit power between 0 (minimal) and 7 (maximum).",
"bluetooth.setTransmitPower|param|power": "power level between 0 (minimal) and 7 (maximum), eg: 7.",
"bluetooth.startAccelerometerService": "Starts the Bluetooth accelerometer service",
"bluetooth.startButtonService": "Starts the Bluetooth button service",
"bluetooth.startIOPinService": "Starts the Bluetooth IO pin service.",
@ -11,6 +26,7 @@
"bluetooth.startMagnetometerService": "Starts the Bluetooth magnetometer service",
"bluetooth.startTemperatureService": "Starts the Bluetooth temperature service",
"bluetooth.startUartService": "Starts the Bluetooth UART service",
"bluetooth.stopAdvertising": "Stops advertising Eddystone end points",
"bluetooth.uartReadUntil": "Reads from the Bluetooth UART service buffer, returning its contents when the specified delimiter character is encountered.",
"bluetooth.uartWriteNumber": "Prints a numeric value to the serial",
"bluetooth.uartWriteString": "Writes to the Bluetooth UART service buffer. From there the data is transmitted over Bluetooth to a connected device.",

View File

@ -1,6 +1,9 @@
{
"bluetooth.advertiseUid|block": "bluetooth advertise UID|namespace (bytes 6-9)%ns|instance (bytes 2-6)%instance|with power %power|connectable %connectable",
"bluetooth.advertiseUrl|block": "bluetooth advertise url %url|with power %power|connectable %connectable",
"bluetooth.onBluetoothConnected|block": "on bluetooth connected",
"bluetooth.onBluetoothDisconnected|block": "on bluetooth disconnected",
"bluetooth.setTransmitPower|block": "bluetooth set transmit power %power",
"bluetooth.startAccelerometerService|block": "bluetooth accelerometer service",
"bluetooth.startButtonService|block": "bluetooth button service",
"bluetooth.startIOPinService|block": "bluetooth io pin service",
@ -8,6 +11,7 @@
"bluetooth.startMagnetometerService|block": "bluetooth magnetometer service",
"bluetooth.startTemperatureService|block": "bluetooth temperature service",
"bluetooth.startUartService|block": "bluetooth uart service",
"bluetooth.stopAdvertising|block": "bluetooth stop advertising",
"bluetooth.uartReadUntil|block": "bluetooth uart|read until %del=serial_delimiter_conv",
"bluetooth.uartWriteNumber|block": "bluetooth uart|write number %value",
"bluetooth.uartWriteString|block": "bluetooth uart|write string %data",

View File

@ -0,0 +1,6 @@
{
"bluetooth.uartWriteNumber": "Gibt einen numerischen Wert an die serielle",
"bluetooth.uartWriteValue": "Schreibt ein ``Namen: Wert`` Wertepaar auf die serielle Schnittstelle.",
"bluetooth.uartWriteValue|param|name": "Name des Wertestreams, z.B.: x",
"bluetooth.uartWriteValue|param|value": "Schreiben"
}

View File

@ -7,11 +7,10 @@ using namespace pxt;
/**
* Support for additional Bluetooth services.
*/
//% color=#0082FB weight=20
//% color=#0082FB weight=96 icon="\uf294"
namespace bluetooth {
MicroBitUARTService *uart = NULL;
/**
* Starts the Bluetooth accelerometer service
*/
@ -119,5 +118,60 @@ namespace bluetooth {
//% parts="bluetooth"
void onBluetoothDisconnected(Action body) {
registerWithDal(MICROBIT_ID_BLE, MICROBIT_BLE_EVT_DISCONNECTED, body);
}
}
const int8_t CALIBRATED_POWERS[] = {-49, -37, -33, -28, -25, -20, -15, -10};
/**
* Advertise an Eddystone URL
* @param url the url to transmit. Must be no longer than the supported eddystone url length, eg: "https://pxt.io/"
* @param power power level between 0 and 7, eg: 7
* @param connectable true to keep bluetooth connectable for other services, false otherwise.
*/
//% blockId=eddystone_advertise_url block="bluetooth advertise url %url|with power %power|connectable %connectable"
//% parts=bluetooth weight=11 blockGap=8
//% help=bluetooth/advertise-url blockExternalInputs=1
void advertiseUrl(StringData* url, int power, bool connectable) {
power = min(MICROBIT_BLE_POWER_LEVELS-1, max(0, power));
int8_t level = CALIBRATED_POWERS[power];
uBit.bleManager.advertiseEddystoneUrl(ManagedString(url), level, connectable);
uBit.bleManager.setTransmitPower(power);
}
/**
* Advertise an Eddystone UID
* @param nsAndInstance 16 bytes buffer of namespace (bytes 0-9) and instance (bytes 10-15)
* @param power power level between 0 and 7, eg: 7
* @param connectable true to keep bluetooth connectable for other services, false otherwise.
*/
//% parts=bluetooth weight=12 advanced=true
void advertiseUidBuffer(Buffer nsAndInstance, int power, bool connectable) {
ManagedBuffer buf(nsAndInstance);
if (buf.length() != 16) return;
power = min(MICROBIT_BLE_POWER_LEVELS-1, max(0, power));
int8_t level = CALIBRATED_POWERS[power];
uint8_t uidNs[10]; buf.readBytes(uidNs, 0, 10);
uint8_t uidInst[6]; buf.readBytes(uidInst, 10, 6);
uBit.bleManager.advertiseEddystoneUid((const char*)uidNs, (const char*)uidInst, level, connectable);
}
/**
* Sets the bluetooth transmit power between 0 (minimal) and 7 (maximum).
* @param power power level between 0 (minimal) and 7 (maximum), eg: 7.
*/
//% parts=bluetooth weight=5 help=bluetooth/set-transmit-power advanced=true
//% blockId=bluetooth_settransmitpower block="bluetooth set transmit power %power"
void setTransmitPower(int power) {
uBit.bleManager.setTransmitPower(min(MICROBIT_BLE_POWER_LEVELS-1, max(0, power)));
}
/**
* Stops advertising Eddystone end points
*/
//% blockId=eddystone_stop_advertising block="bluetooth stop advertising"
//% parts=bluetooth weight=10
//% help=bluetooth/stop-advertising advanced=true
void stopAdvertising() {
uBit.bleManager.stopAdvertising();
}
}

View File

@ -1,7 +1,7 @@
/**
* Support for additional Bluetooth services.
*/
//% color=#0082FB weight=20
//% color=#0082FB weight=96 icon="\uf294"
namespace bluetooth {
/**
* Writes to the Bluetooth UART service buffer. From there the data is transmitted over Bluetooth to a connected device.
@ -46,4 +46,21 @@ namespace bluetooth {
// dummy implementation for simulator
return "???"
}
/**
* Advertise an Eddystone UID
* @param ns 4 last bytes of the namespace uid
* @param instance 4 last bytes of the instance uid
* @param power power level between 0 and 7, eg: 7
* @param connectable true to keep bluetooth connectable for other services, false otherwise.
*/
//% blockId=eddystone_advertise_uid block="bluetooth advertise UID|namespace (bytes 6-9)%ns|instance (bytes 2-6)%instance|with power %power|connectable %connectable"
//% parts=bluetooth weight=12 blockGap=8
//% help=bluetooth/advertise-uid blockExternalInputs=1
export function advertiseUid(ns: number, instance: number, power: number, connectable: boolean) {
const buf = pins.createBuffer(16);
buf.setNumber(NumberFormat.Int32BE, 6, ns);
buf.setNumber(NumberFormat.Int32BE, 12, instance);
bluetooth.advertiseUidBuffer(buf, power, connectable);
}
}

View File

@ -6,7 +6,8 @@
"enums.d.ts",
"shims.d.ts",
"bluetooth.ts",
"bluetooth.cpp"
"bluetooth.cpp",
"_locales/de/bluetooth-jsdoc-strings.json"
],
"public": true,
"dependencies": {
@ -16,20 +17,70 @@
"config": {
"microbit-dal": {
"bluetooth": {
"enabled": 1,
"pairing_mode": 1,
"enabled": 1
}
}
},
"optionalConfig": {
"microbit-dal": {
"bluetooth": {
"private_addressing": 0,
"open": 0,
"whitelist": 1,
"advertising_timeout": 0,
"tx_power": 6,
"dfu_service": 1,
"event_service": 1,
"device_info_service": 1
"device_info_service": 1,
"eddystone_url": 1,
"eddystone_uid": 1,
"open": 0,
"pairing_mode": 1,
"whitelist": 1,
"security_level": "SECURITY_MODE_ENCRYPTION_NO_MITM"
},
"gatt_table_size": "0x700"
}
}
},
"userConfigs": [
{
"description": "Unsecure: Anyone can connect via Bluetooth.",
"config": {
"microbit-dal": {
"bluetooth": {
"open": 1,
"pairing_mode": 0,
"whitelist": 0,
"security_level": null
}
}
}
},
{
"description": "JustWorks pairing (default): Button press to pair.",
"config": {
"microbit-dal": {
"bluetooth": {
"open": null,
"pairing_mode": null,
"whitelist": null,
"security_level": null
}
}
}
},
{
"description": "Passkey pairing: Button press and 6 digit key to pair.",
"config": {
"microbit-dal": {
"bluetooth": {
"open": 0,
"pairing_mode": 1,
"whitelist": 1,
"security_level": "SECURITY_MODE_ENCRYPTION_WITH_MITM"
}
}
}
}
]
},
"installedVersion": "vzlhfd"
}

View File

@ -4,7 +4,7 @@
/**
* Support for additional Bluetooth services.
*/
//% color=#0082FB weight=20
//% color=#0082FB weight=96 icon="\uf294"
declare namespace bluetooth {
/**
@ -80,6 +80,42 @@ declare namespace bluetooth {
//% blockId=bluetooth_on_disconnected block="on bluetooth disconnected"
//% parts="bluetooth" shim=bluetooth::onBluetoothDisconnected
function onBluetoothDisconnected(body: () => void): void;
/**
* Advertise an Eddystone URL
* @param url the url to transmit. Must be no longer than the supported eddystone url length, eg: "https://pxt.io/"
* @param power power level between 0 and 7, eg: 7
* @param connectable true to keep bluetooth connectable for other services, false otherwise.
*/
//% blockId=eddystone_advertise_url block="bluetooth advertise url %url|with power %power|connectable %connectable"
//% parts=bluetooth weight=11 blockGap=8
//% help=bluetooth/advertise-url blockExternalInputs=1 shim=bluetooth::advertiseUrl
function advertiseUrl(url: string, power: number, connectable: boolean): void;
/**
* Advertise an Eddystone UID
* @param nsAndInstance 16 bytes buffer of namespace (bytes 0-9) and instance (bytes 10-15)
* @param power power level between 0 and 7, eg: 7
* @param connectable true to keep bluetooth connectable for other services, false otherwise.
*/
//% parts=bluetooth weight=12 advanced=true shim=bluetooth::advertiseUidBuffer
function advertiseUidBuffer(nsAndInstance: Buffer, power: number, connectable: boolean): void;
/**
* Sets the bluetooth transmit power between 0 (minimal) and 7 (maximum).
* @param power power level between 0 (minimal) and 7 (maximum), eg: 7.
*/
//% parts=bluetooth weight=5 help=bluetooth/set-transmit-power advanced=true
//% blockId=bluetooth_settransmitpower block="bluetooth set transmit power %power" shim=bluetooth::setTransmitPower
function setTransmitPower(power: number): void;
/**
* Stops advertising Eddystone end points
*/
//% blockId=eddystone_stop_advertising block="bluetooth stop advertising"
//% parts=bluetooth weight=10
//% help=bluetooth/stop-advertising advanced=true shim=bluetooth::stopAdvertising
function stopAdvertising(): void;
}
// Auto-generated. Do not edit. Really.

View File

@ -1,62 +1,3 @@
<xml xmlns="http://www.w3.org/1999/xhtml">
<block type="device_forever">
<statement name="HANDLER">
<block type="device_show_leds">
<field name="LED00">FALSE</field>
<field name="LED10">FALSE</field>
<field name="LED20">FALSE</field>
<field name="LED30">FALSE</field>
<field name="LED40">FALSE</field>
<field name="LED01">FALSE</field>
<field name="LED11">TRUE</field>
<field name="LED21">FALSE</field>
<field name="LED31">TRUE</field>
<field name="LED41">FALSE</field>
<field name="LED02">FALSE</field>
<field name="LED12">FALSE</field>
<field name="LED22">FALSE</field>
<field name="LED32">FALSE</field>
<field name="LED42">FALSE</field>
<field name="LED03">TRUE</field>
<field name="LED13">FALSE</field>
<field name="LED23">FALSE</field>
<field name="LED33">FALSE</field>
<field name="LED43">TRUE</field>
<field name="LED04">FALSE</field>
<field name="LED14">TRUE</field>
<field name="LED24">TRUE</field>
<field name="LED34">TRUE</field>
<field name="LED44">FALSE</field>
<next>
<block type="device_show_leds">
<field name="LED00">FALSE</field>
<field name="LED10">FALSE</field>
<field name="LED20">FALSE</field>
<field name="LED30">FALSE</field>
<field name="LED40">FALSE</field>
<field name="LED01">FALSE</field>
<field name="LED11">FALSE</field>
<field name="LED21">FALSE</field>
<field name="LED31">FALSE</field>
<field name="LED41">FALSE</field>
<field name="LED02">FALSE</field>
<field name="LED12">FALSE</field>
<field name="LED22">FALSE</field>
<field name="LED32">FALSE</field>
<field name="LED42">FALSE</field>
<field name="LED03">FALSE</field>
<field name="LED13">FALSE</field>
<field name="LED23">FALSE</field>
<field name="LED33">FALSE</field>
<field name="LED43">FALSE</field>
<field name="LED04">FALSE</field>
<field name="LED14">FALSE</field>
<field name="LED24">FALSE</field>
<field name="LED34">FALSE</field>
<field name="LED44">FALSE</field>
</block>
</next>
</block>
</statement>
</block>
<block type="pxt-on-start"></block>
</xml>

View File

@ -1,16 +1 @@
basic.forever(() => {
basic.showLeds(`
. # . # .
# . # . #
# . . . #
. # . # .
. . # . .
`)
basic.showLeds(`
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
`)
})

373
libs/core/ManagedBuffer.cpp Normal file
View File

@ -0,0 +1,373 @@
#include "MicroBit.h"
#include "ManagedBuffer.h"
#include <limits.h>
static const char empty[] __attribute__ ((aligned (4))) = "\xff\xff\0\0\0";
/**
* Internal constructor helper.
* Configures this ManagedBuffer to refer to the static empty buffer.
*/
void ManagedBuffer::initEmpty()
{
ptr = (BufferData*)(void*)empty;
}
/**
* Default Constructor.
* Creates an empty ManagedBuffer.
*
* Example:
* @code
* ManagedBuffer p();
* @endcode
*/
ManagedBuffer::ManagedBuffer()
{
initEmpty();
}
/**
* Constructor.
* Creates an empty ManagedBuffer of the given size.
*
* @param length The length of the buffer to create.
*
* Example:
* @code
* ManagedBuffer p(16); // Creates a ManagedBuffer 16 bytes long.
* @endcode
*/
ManagedBuffer::ManagedBuffer(int length)
{
this->init(NULL, length);
}
/**
* Constructor.
* Creates a new ManagedBuffer of the given size,
* and fills it with the data provided.
*
* @param data The data with which to fill the buffer.
* @param length The length of the buffer to create.
*
* Example:
* @code
* uint8_t buf = {13,5,2};
* ManagedBuffer p(buf, 3); // Creates a ManagedBuffer 3 bytes long.
* @endcode
*/
ManagedBuffer::ManagedBuffer(uint8_t *data, int length)
{
this->init(data, length);
}
/**
* Copy Constructor.
* Add ourselves as a reference to an existing ManagedBuffer.
*
* @param buffer The ManagedBuffer to reference.
*
* Example:
* @code
* ManagedBuffer p();
* ManagedBuffer p2(i); // Refers to the same buffer as p.
* @endcode
*/
ManagedBuffer::ManagedBuffer(const ManagedBuffer &buffer)
{
ptr = buffer.ptr;
ptr->incr();
}
/**
* Constructor.
* Create a buffer from a raw BufferData pointer. It will ptr->incr(). This is to be used by specialized runtimes.
*
* @param p The pointer to use.
*/
ManagedBuffer::ManagedBuffer(BufferData *p)
{
ptr = p;
ptr->incr();
}
/**
* Internal constructor-initialiser.
*
* @param data The data with which to fill the buffer.
* @param length The length of the buffer to create.
*
*/
void ManagedBuffer::init(uint8_t *data, int length)
{
if (length <= 0) {
initEmpty();
return;
}
ptr = (BufferData *) malloc(sizeof(BufferData) + length);
ptr->init();
ptr->length = length;
// Copy in the data buffer, if provided.
if (data)
memcpy(ptr->payload, data, length);
else
memset(ptr->payload, 0, length);
}
/**
* Destructor.
* Removes buffer resources held by the instance.
*/
ManagedBuffer::~ManagedBuffer()
{
ptr->decr();
}
/**
* Copy assign operation.
*
* Called when one ManagedBuffer is assigned the value of another using the '=' operator.
* Decrements our reference count and free up the buffer as necessary.
* Then, update our buffer to refer to that of the supplied ManagedBuffer,
* and increase its reference count.
*
* @param p The ManagedBuffer to reference.
*
* Example:
* @code
* uint8_t buf = {13,5,2};
* ManagedBuffer p1(16);
* ManagedBuffer p2(buf, 3);
*
* p1 = p2;
* @endcode
*/
ManagedBuffer& ManagedBuffer::operator = (const ManagedBuffer &p)
{
if(ptr == p.ptr)
return *this;
ptr->decr();
ptr = p.ptr;
ptr->incr();
return *this;
}
/**
* Equality operation.
*
* Called when one ManagedBuffer is tested to be equal to another using the '==' operator.
*
* @param p The ManagedBuffer to test ourselves against.
* @return true if this ManagedBuffer is identical to the one supplied, false otherwise.
*
* Example:
* @code
*
* uint8_t buf = {13,5,2};
* ManagedBuffer p1(16);
* ManagedBuffer p2(buf, 3);
*
* if(p1 == p2) // will be true
* uBit.display.scroll("same!");
* @endcode
*/
bool ManagedBuffer::operator== (const ManagedBuffer& p)
{
if (ptr == p.ptr)
return true;
else
return (ptr->length == p.ptr->length && (memcmp(ptr->payload, p.ptr->payload, ptr->length)==0));
}
/**
* Sets the byte at the given index to value provided.
* @param position The index of the byte to change.
* @param value The new value of the byte (0-255).
* @return MICROBIT_OK, or MICROBIT_INVALID_PARAMETER.
*
* Example:
* @code
* ManagedBuffer p1(16);
* p1.setByte(0,255); // Sets the firts byte in the buffer to the value 255.
* @endcode
*/
int ManagedBuffer::setByte(int position, uint8_t value)
{
if (0 <= position && position < ptr->length)
{
ptr->payload[position] = value;
return MICROBIT_OK;
}
else
{
return MICROBIT_INVALID_PARAMETER;
}
}
/**
* Determines the value of the given byte in the buffer.
*
* @param position The index of the byte to read.
* @return The value of the byte at the given position, or MICROBIT_INVALID_PARAMETER.
*
* Example:
* @code
* ManagedBuffer p1(16);
* p1.setByte(0,255); // Sets the firts byte in the buffer to the value 255.
* p1.getByte(0); // Returns 255.
* @endcode
*/
int ManagedBuffer::getByte(int position)
{
if (0 <= position && position < ptr->length)
return ptr->payload[position];
else
return MICROBIT_INVALID_PARAMETER;
}
/**
* Get current ptr, do not decr() it, and set the current instance to an empty buffer.
* This is to be used by specialized runtimes which pass BufferData around.
*/
BufferData *ManagedBuffer::leakData()
{
BufferData* res = ptr;
initEmpty();
return res;
}
int ManagedBuffer::fill(uint8_t value, int offset, int length)
{
if (offset < 0 || offset > ptr->length)
return MICROBIT_INVALID_PARAMETER;
if (length < 0)
length = ptr->length;
length = min(length, ptr->length - offset);
memset(ptr->payload + offset, value, length);
return MICROBIT_OK;
}
ManagedBuffer ManagedBuffer::slice(int offset, int length) const
{
offset = min(ptr->length, offset);
if (length < 0)
length = ptr->length;
length = min(length, ptr->length - offset);
return ManagedBuffer(ptr->payload + offset, length);
}
void ManagedBuffer::shift(int offset, int start, int len)
{
if (len < 0) len = ptr->length - start;
if (start < 0 || start + len > ptr->length || start + len < start
|| len == 0 || offset == 0 || offset == INT_MIN) return;
if (offset <= -len || offset >= len) {
fill(0);
return;
}
uint8_t *data = ptr->payload + start;
if (offset < 0) {
offset = -offset;
memmove(data + offset, data, len - offset);
memset(data, 0, offset);
} else {
len = len - offset;
memmove(data, data + offset, len);
memset(data + len, 0, offset);
}
}
void ManagedBuffer::rotate(int offset, int start, int len)
{
if (len < 0) len = ptr->length - start;
if (start < 0 || start + len > ptr-> length || start + len < start
|| len == 0 || offset == 0 || offset == INT_MIN) return;
if (offset < 0)
offset += len << 8; // try to make it positive
offset %= len;
if (offset < 0)
offset += len;
uint8_t *data = ptr->payload + start;
uint8_t *n_first = data + offset;
uint8_t *first = data;
uint8_t *next = n_first;
uint8_t *last = data + len;
while (first != next) {
uint8_t tmp = *first;
*first++ = *next;
*next++ = tmp;
if (next == last) {
next = n_first;
} else if (first == n_first) {
n_first = next;
}
}
}
int ManagedBuffer::writeBuffer(int dstOffset, const ManagedBuffer &src, int srcOffset, int length)
{
if (length < 0)
length = src.length();
if (srcOffset < 0 || dstOffset < 0 || dstOffset > ptr->length)
return MICROBIT_INVALID_PARAMETER;
length = min(src.length() - srcOffset, ptr->length - dstOffset);
if (length < 0)
return MICROBIT_INVALID_PARAMETER;
if (ptr == src.ptr) {
memmove(getBytes() + dstOffset, src.ptr->payload + srcOffset, length);
} else {
memcpy(getBytes() + dstOffset, src.ptr->payload + srcOffset, length);
}
return MICROBIT_OK;
}
int ManagedBuffer::writeBytes(int offset, uint8_t *src, int length, bool swapBytes)
{
if (offset < 0 || length < 0 || offset + length > ptr->length)
return MICROBIT_INVALID_PARAMETER;
if (swapBytes) {
uint8_t *p = ptr->payload + offset + length;
for (int i = 0; i < length; ++i)
*--p = src[i];
} else {
memcpy(ptr->payload + offset, src, length);
}
return MICROBIT_OK;
}
int ManagedBuffer::readBytes(uint8_t *dst, int offset, int length, bool swapBytes) const
{
if (offset < 0 || length < 0 || offset + length > ptr->length)
return MICROBIT_INVALID_PARAMETER;
if (swapBytes) {
uint8_t *p = ptr->payload + offset + length;
for (int i = 0; i < length; ++i)
dst[i] = *--p;
} else {
memcpy(dst, ptr->payload + offset, length);
}
return MICROBIT_OK;
}

257
libs/core/ManagedBuffer.h Normal file
View File

@ -0,0 +1,257 @@
#ifndef MICROBIT_MANAGED_BUFFER_H
#define MICROBIT_MANAGED_BUFFER_H
#include "mbed.h"
#include "RefCounted.h"
struct BufferData : RefCounted
{
uint16_t length; // The length of the payload in bytes
uint8_t payload[0]; // ManagedBuffer data
};
/**
* Class definition for a ManagedBuffer.
* A ManagedBuffer holds a series of bytes, used with MicroBitRadio channels and in other places.
* n.b. This is a mutable, managed type.
*/
class ManagedBuffer
{
BufferData *ptr; // Pointer to payload data
public:
/**
* Default Constructor.
* Creates an empty ManagedBuffer. The 'ptr' field in all empty buffers is shared.
*
* Example:
* @code
* ManagedBuffer p();
* @endcode
*/
ManagedBuffer();
/**
* Constructor.
* Creates a new ManagedBuffer of the given size.
*
* @param length The length of the buffer to create.
*
* Example:
* @code
* ManagedBuffer p(16); // Creates a ManagedBuffer 16 bytes long.
* @endcode
*/
ManagedBuffer(int length);
/**
* Constructor.
* Creates an empty ManagedBuffer of the given size,
* and fills it with the data provided.
*
* @param data The data with which to fill the buffer.
* @param length The length of the buffer to create.
*
* Example:
* @code
* uint8_t buf[] = {13,5,2};
* ManagedBuffer p(buf, 3); // Creates a ManagedBuffer 3 bytes long.
* @endcode
*/
ManagedBuffer(uint8_t *data, int length);
/**
* Copy Constructor.
* Add ourselves as a reference to an existing ManagedBuffer.
*
* @param buffer The ManagedBuffer to reference.
*
* Example:
* @code
* ManagedBuffer p();
* ManagedBuffer p2(i); // Refers to the same buffer as p.
* @endcode
*/
ManagedBuffer(const ManagedBuffer &buffer);
/**
* Constructor.
* Create a buffer from a raw BufferData pointer. It will ptr->incr(). This is to be used by specialized runtimes.
*
* @param p The pointer to use.
*/
ManagedBuffer(BufferData *p);
/**
* Internal constructor helper.
* Configures this ManagedBuffer to refer to the static empty buffer.
*/
void initEmpty();
/**
* Internal constructor-initialiser.
*
* @param data The data with which to fill the buffer.
* @param length The length of the buffer to create.
*
*/
void init(uint8_t *data, int length);
/**
* Destructor.
* Removes buffer resources held by the instance.
*/
~ManagedBuffer();
/**
* Provide an array containing the buffer data.
* @return The contents of this buffer, as an array of bytes.
*/
uint8_t *getBytes()
{
return ptr->payload;
}
/**
* Get current ptr, do not decr() it, and set the current instance to an empty buffer.
* This is to be used by specialized runtimes which pass BufferData around.
*/
BufferData *leakData();
/**
* Copy assign operation.
*
* Called when one ManagedBuffer is assigned the value of another using the '=' operator.
* Decrements our reference count and free up the buffer as necessary.
* Then, update our buffer to refer to that of the supplied ManagedBuffer,
* and increase its reference count.
*
* @param p The ManagedBuffer to reference.
*
* Example:
* @code
* uint8_t buf = {13,5,2};
* ManagedBuffer p1(16);
* ManagedBuffer p2(buf, 3);
*
* p1 = p2;
* @endcode
*/
ManagedBuffer& operator = (const ManagedBuffer& p);
/**
* Array access operation (read).
*
* Called when a ManagedBuffer is dereferenced with a [] operation.
* Transparently map this through to the underlying payload for elegance of programming.
*
* Example:
* @code
* ManagedBuffer p1(16);
* uint8_t data = p1[0];
* @endcode
*/
uint8_t operator [] (int i) const
{
return ptr->payload[i];
}
/**
* Array access operation (modify).
*
* Called when a ManagedBuffer is dereferenced with a [] operation.
* Transparently map this through to the underlying payload for elegance of programming.
*
* Example:
* @code
* ManagedBuffer p1(16);
* p1[0] = 42;
* @endcode
*/
uint8_t& operator [] (int i)
{
return ptr->payload[i];
}
/**
* Equality operation.
*
* Called when one ManagedBuffer is tested to be equal to another using the '==' operator.
*
* @param p The ManagedBuffer to test ourselves against.
* @return true if this ManagedBuffer is identical to the one supplied, false otherwise.
*
* Example:
* @code
*
* uint8_t buf = {13,5,2};
* ManagedBuffer p1(16);
* ManagedBuffer p2(buf, 3);
*
* if(p1 == p2) // will be true
* uBit.display.scroll("same!");
* @endcode
*/
bool operator== (const ManagedBuffer& p);
/**
* Sets the byte at the given index to value provided.
* @param position The index of the byte to change.
* @param value The new value of the byte (0-255).
* @return MICROBIT_OK, or MICROBIT_INVALID_PARAMETER.
*
* Example:
* @code
* ManagedBuffer p1(16);
* p1.setByte(0,255); // Sets the first byte in the buffer to the value 255.
* @endcode
*/
int setByte(int position, uint8_t value);
/**
* Determines the value of the given byte in the buffer.
*
* @param position The index of the byte to read.
* @return The value of the byte at the given position, or MICROBIT_INVALID_PARAMETER.
*
* Example:
* @code
* ManagedBuffer p1(16);
* p1.setByte(0,255); // Sets the first byte in the buffer to the value 255.
* p1.getByte(0); // Returns 255.
* @endcode
*/
int getByte(int position);
/**
* Gets number of bytes in this buffer
* @return The size of the buffer in bytes.
*
* Example:
* @code
* ManagedBuffer p1(16);
* p1.length(); // Returns 16.
* @endcode
*/
int length() const { return ptr->length; }
int fill(uint8_t value, int offset = 0, int length = -1);
ManagedBuffer slice(int offset = 0, int length = -1) const;
void shift(int offset, int start = 0, int length = -1);
void rotate(int offset, int start = 0, int length = -1);
int readBytes(uint8_t *dst, int offset, int length, bool swapBytes = false) const;
int writeBytes(int dstOffset, uint8_t *src, int length, bool swapBytes = false);
int writeBuffer(int dstOffset, const ManagedBuffer &src, int srcOffset = 0, int length = -1);
bool isReadOnly() const { return ptr->isReadOnly(); }
};
#endif

View File

@ -85,7 +85,7 @@
"game.setLife": "Sets the current life value",
"game.setLife|param|value": "TODO",
"game.setScore": "Sets the current score value",
"game.setScore|param|value": "TODO",
"game.setScore|param|value": "new score value.",
"game.showScore": "Displays the score on the screen.",
"game.startCountdown": "Starts a game countdown timer",
"game.startCountdown|param|ms": "countdown duration in milliseconds, eg: 10000",
@ -97,26 +97,28 @@
"input.acceleration": "Get the acceleration value in milli-gravitys (when the board is laying flat with the screen up, x=0, y=0 and z=-1024)",
"input.acceleration|param|dimension": "TODO",
"input.buttonIsPressed": "Get the button state (pressed or not) for ``A`` and ``B``.",
"input.buttonIsPressed|param|button": "the button to query the request, eg: Button.A",
"input.calibrate": "Obsolete, compass calibration is automatic.",
"input.compassHeading": "Get the current compass heading in degrees.",
"input.lightLevel": "Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright.",
"input.magneticForce": "Get the magnetic force value in ``micro-Teslas`` (``µT``). This function is not supported in the simulator.",
"input.magneticForce|param|dimension": "TODO",
"input.onButtonPressed": "Do something when a button (``A``, ``B`` or both ``A+B``) is pressed",
"input.onButtonPressed|param|body": "TODO",
"input.onButtonPressed|param|button": "TODO",
"input.onButtonPressed|param|body": "code to run when event is raised",
"input.onButtonPressed|param|button": "the button that needs to be pressed",
"input.onGesture": "Do something when when a gesture is done (like shaking the micro:bit).",
"input.onGesture|param|body": "TODO",
"input.onGesture|param|body": "code to run when gesture is raised",
"input.onGesture|param|gesture": "the type of gesture to track, eg: Gesture.Shake",
"input.onLogoDown": "Attaches code to run when the logo is oriented downwards and the board is vertical.",
"input.onLogoDown|param|body": "TODO",
"input.onLogoUp": "Attaches code to run when the logo is oriented upwards and the board is vertical.",
"input.onLogoUp|param|body": "TODO",
"input.onPinPressed": "Do something when a pin is pressed.",
"input.onPinPressed|param|body": "the code to run when the pin is pressed",
"input.onPinPressed|param|name": "the pin that needs to be pressed",
"input.onPinPressed|param|name": "the pin that needs to be pressed, eg: TouchPin.P0",
"input.onPinReleased": "Do something when a pin is released.",
"input.onPinReleased|param|body": "the code to run when the pin is released",
"input.onPinReleased|param|name": "the pin that needs to be released",
"input.onPinReleased|param|name": "the pin that needs to be released, eg: TouchPin.P0",
"input.onScreenDown": "Attaches code to run when the screen is facing down.",
"input.onScreenDown|param|body": "TODO",
"input.onScreenUp": "Attaches code to run when the screen is facing up.",
@ -124,7 +126,7 @@
"input.onShake": "Attaches code to run when the device is shaken.",
"input.onShake|param|body": "TODO",
"input.pinIsPressed": "Get the pin state (pressed or not). Requires to hold the ground to close the circuit.",
"input.pinIsPressed|param|name": "pin used to detect the touch",
"input.pinIsPressed|param|name": "pin used to detect the touch, eg: TouchPin.P0",
"input.rotation": "The pitch or roll of the device, rotation along the ``x-axis`` or ``y-axis``, in degrees.",
"input.rotation|param|kind": "TODO",
"input.runningTime": "Gets the number of milliseconds elapsed since power on.",
@ -166,7 +168,7 @@
"music.changeTempoBy": "Change the tempo by the specified amount",
"music.changeTempoBy|param|bpm": "The change in beats per minute to the tempo, eg: 20",
"music.noteFrequency": "Gets the frequency of a note.",
"music.noteFrequency|param|name": "the note name",
"music.noteFrequency|param|name": "the note name, eg: Note.C",
"music.playTone": "Plays a tone through pin ``P0`` for the given duration.",
"music.playTone|param|frequency": "pitch of the tone to play in Hertz (Hz)",
"music.playTone|param|ms": "tone duration in milliseconds (ms)",
@ -179,24 +181,24 @@
"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.analogPitch|param|frequency": "TODO",
"pins.analogPitch|param|ms": "TODO",
"pins.analogPitch|param|frequency": "frequency to modulate in Hz.",
"pins.analogPitch|param|ms": "duration of the pitch in milli seconds.",
"pins.analogReadPin": "Read the connector value as analog, that is, as a value comprised between 0 and 1023.",
"pins.analogReadPin|param|name": "pin to write to",
"pins.analogReadPin|param|name": "pin to write to, eg: AnalogPin.P0",
"pins.analogSetPeriod": "Configures the Pulse-width modulation (PWM) of the analog output to the given value in **microseconds** or `1/1000` milliseconds.\nIf this pin is not configured as an analog output (using `analog write pin`), the operation has no effect.",
"pins.analogSetPeriod|param|micros": "period in micro seconds. eg:20000",
"pins.analogSetPeriod|param|name": "analog pin to set period to",
"pins.analogSetPitchPin": "Sets the pin used when using `pins->analog pitch`.",
"pins.analogSetPitchPin|param|name": "TODO",
"pins.analogSetPeriod|param|name": "analog pin to set period to, eg: AnalogPin.P0",
"pins.analogSetPitchPin": "Sets the pin used when using `analog pitch` or music.",
"pins.analogSetPitchPin|param|name": "pin to modulate pitch from",
"pins.analogWritePin": "Set the connector value as analog. Value must be comprised between 0 and 1023.",
"pins.analogWritePin|param|name": "pin name to write to",
"pins.analogWritePin|param|name": "pin name to write to, eg: AnalogPin.P0",
"pins.analogWritePin|param|value": "value to write to the pin between ``0`` and ``1023``. eg:1023,0",
"pins.createBuffer": "Create a new zero-initialized buffer.",
"pins.createBuffer|param|size": "number of bytes in the buffer",
"pins.digitalReadPin": "Read the specified pin or connector as either 0 or 1",
"pins.digitalReadPin|param|name": "pin to read from",
"pins.digitalReadPin|param|name": "pin to read from, eg: DigitalPin.P0",
"pins.digitalWritePin": "Set a pin or connector value to either 0 or 1.",
"pins.digitalWritePin|param|name": "pin to write to",
"pins.digitalWritePin|param|name": "pin to write to, eg: DigitalPin.P0",
"pins.digitalWritePin|param|value": "value to set on the pin, 1 eg,0",
"pins.i2cReadBuffer": "Read `size` bytes from a 7-bit I2C `address`.",
"pins.i2cReadNumber": "Read one number from 7-bit I2C address.",
@ -209,31 +211,36 @@
"pins.map|param|toLow": "the lower bound of the value's target range",
"pins.map|param|value": "value to map in ranges",
"pins.onPulsed": "Configures this pin to a digital input, and generates events where the timestamp is the duration that this pin was either ``high`` or ``low``.",
"pins.onPulsed|param|name": "digital pin to register to, eg: DigitalPin.P0",
"pins.onPulsed|param|pulse": "the value of the pulse, eg: PulseValue.High",
"pins.pulseDuration": "Gets the duration of the last pulse in micro-seconds. This function should be called from a ``onPulsed`` handler.",
"pins.pulseIn": "Returns the duration of a pulse in microseconds",
"pins.pulseIn|param|name": "the pin which measures the pulse",
"pins.pulseIn|param|value": "the value of the pulse (default high)",
"pins.pulseIn|param|name": "the pin which measures the pulse, eg: DigitalPin.P0",
"pins.pulseIn|param|value": "the value of the pulse, eg: PulseValue.High",
"pins.servoSetPulse": "Configures this IO pin as an analog/pwm output, configures the period to be 20 ms, and sets the pulse width, based on the value it is given **microseconds** or `1/1000` milliseconds.",
"pins.servoSetPulse|param|micros": "pulse duration in micro seconds, eg:1500",
"pins.servoSetPulse|param|name": "pin name",
"pins.servoWritePin": "Writes a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement).",
"pins.servoWritePin|param|name": "pin to write to",
"pins.servoWritePin|param|name": "pin to write to, eg: AnalogPin.P0",
"pins.servoWritePin|param|value": "angle or rotation speed, eg:180,90,0",
"pins.setPull": "Configures the pull of this pin.",
"pins.setPull|param|name": "pin to set the pull mode on",
"pins.setPull|param|pull": "one of the mbed pull configurations: PullUp, PullDown, PullNone ",
"pins.setPull|param|name": "pin to set the pull mode on, eg: DigitalPin.P0",
"pins.setPull|param|pull": "one of the mbed pull configurations, eg: PinPullMode.PullUp",
"pins.sizeOf": "Get the size in bytes of specified number format.",
"pins.spiWrite": "Write to the SPI slave and return the response",
"pins.spiWrite|param|value": "Data to be sent to the SPI slave",
"serial": "Reading and writing data over a serial connection.",
"serial.delimiters": "Returns the delimiter corresponding string",
"serial.onLineReceived": "Registers an event to be fired when a line has been received",
"serial.onDataReceived": "Registers an event to be fired when one of the delimiter is matched.",
"serial.onDataReceived|param|delimiters": "the characters to match received characters against.",
"serial.readLine": "Reads a line of text from the serial port.",
"serial.readString": "Reads the buffered received data as a string",
"serial.readUntil": "Reads a line of text from the serial port and returns the buffer when the delimiter is met.",
"serial.readUntil|param|delimiter": "text delimiter that separates each text chunk",
"serial.redirect": "Dynamically configuring the serial instance to use pins other than USBTX and USBRX.",
"serial.redirect|param|rx": "the new reception pin",
"serial.redirect|param|tx": "the new transmission pins",
"serial.redirect|param|rate": "the new baud rate. eg: 115200",
"serial.redirect|param|rx": "the new reception pin, eg: SerialPin.P1",
"serial.redirect|param|tx": "the new transmission pins, eg: SerialPin.P0",
"serial.writeLine": "Prints a line of text to the serial",
"serial.writeNumber": "Prints a numeric value to the serial",
"serial.writeString": "Sends a piece of text through Serial connection.",

View File

@ -1,6 +1,86 @@
{
"AcceleratorRange.EightG": "The accelerator measures forces up to 8 gravity",
"AcceleratorRange.EightG|block": "8g",
"AcceleratorRange.FourG": "The accelerator measures forces up to 4 gravity",
"AcceleratorRange.FourG|block": "4g",
"AcceleratorRange.OneG": "The accelerator measures forces up to 1 gravity",
"AcceleratorRange.OneG|block": "1g",
"AcceleratorRange.TwoG": "The accelerator measures forces up to 2 gravity",
"AcceleratorRange.TwoG|block": "2g",
"BaudRate.BaudRate115200|block": "115200",
"BaudRate.BaudRate9600|block": "9600",
"BeatFraction.Breve|block": "4",
"BeatFraction.Double|block": "2",
"BeatFraction.Eighth|block": "1/8",
"BeatFraction.Half|block": "1/2",
"BeatFraction.Quarter|block": "1/4",
"BeatFraction.Sixteenth|block": "1/16",
"BeatFraction.Whole|block": "1",
"Button.AB|block": "A+B",
"Delimiters.Colon|block": ":",
"Delimiters.Comma|block": ",",
"Delimiters.Dollar|block": "$",
"Delimiters.Fullstop|block": ".",
"Delimiters.Hash|block": "#",
"Delimiters.NewLine|block": "new line",
"Dimension.Strength|block": "strength",
"Dimension.X|block": "x",
"Dimension.Y|block": "y",
"Dimension.Z|block": "z",
"Direction.Left|block": "left",
"Direction.Right|block": "right",
"DisplayMode.BackAndWhite|block": "black and white",
"DisplayMode.Greyscale|block": "greyscale",
"EventCreationMode.CreateAndFire": "MicroBitEvent is initialised, and its event handlers are immediately fired (not suitable for use in interrupts!).",
"EventCreationMode.CreateOnly": "MicroBitEvent is initialised, and no further processing takes place.",
"Gesture.EightG": "Raised when a 8G shock is detected",
"Gesture.EightG|block": "8g",
"Gesture.FreeFall": "Raised when the board is falling!",
"Gesture.FreeFall|block": "free fall",
"Gesture.LogoDown": "Raised when the logo is downward and the screen is vertical",
"Gesture.LogoDown|block": "logo down",
"Gesture.LogoUp": "Raised when the logo is upward and the screen is vertical",
"Gesture.LogoUp|block": "logo up",
"Gesture.ScreenDown": "Raised when the screen is pointing up and the board is horizontal",
"Gesture.ScreenDown|block": "screen down",
"Gesture.ScreenUp": "Raised when the screen is pointing down and the board is horizontal",
"Gesture.ScreenUp|block": "screen up",
"Gesture.Shake": "Raised when shaken",
"Gesture.Shake|block": "shake",
"Gesture.SixG": "Raised when a 6G shock is detected",
"Gesture.SixG|block": "6g",
"Gesture.ThreeG": "Raised when a 3G shock is detected",
"Gesture.ThreeG|block": "3g",
"Gesture.TiltLeft": "Raised when the screen is pointing left",
"Gesture.TiltLeft|block": "tilt left",
"Gesture.TiltRight": "Raised when the screen is pointing right",
"Gesture.TiltRight|block": "tilt right",
"LedSpriteProperty.Blink|block": "blink",
"LedSpriteProperty.Brightness|block": "brightness",
"LedSpriteProperty.Direction|block": "direction",
"LedSpriteProperty.X|block": "x",
"LedSpriteProperty.Y|block": "y",
"Math.randomBoolean|block": "pick random true or false",
"Math|block": "Math",
"Note.CSharp3|block": "C#3",
"Note.CSharp4|block": "C#4",
"Note.CSharp5|block": "C#5",
"Note.CSharp|block": "C#",
"Note.FSharp3|block": "F#3",
"Note.FSharp4|block": "F#4",
"Note.FSharp5|block": "F#5",
"Note.FSharp|block": "F#",
"Note.GSharp3|block": "G#3",
"Note.GSharp4|block": "G#4",
"Note.GSharp5|block": "G#5",
"Note.GSharp|block": "G#",
"PinPullMode.PullDown|block": "down",
"PinPullMode.PullNone|block": "none",
"PinPullMode.PullUp|block": "up",
"PulseValue.High|block": "high",
"PulseValue.Low|block": "low",
"Rotation.Pitch|block": "pitch",
"Rotation.Roll|block": "roll",
"String.charAt|block": "char from %this|at %pos",
"String.compare|block": "compare %this| to %that",
"String.concat|block": "join %this|%other",
@ -32,6 +112,7 @@
"game.createSprite|block": "create sprite at|x: %x|y: %y",
"game.gameOver|block": "game over",
"game.score|block": "score",
"game.setScore|block": "set score %points",
"game.startCountdown|block": "start countdown|(ms) %duration",
"game|block": "game",
"images.createBigImage|block": "create big image",
@ -44,7 +125,7 @@
"input.magneticForce|block": "magnetic force (µT)|%NAME",
"input.onButtonPressed|block": "on button|%NAME|pressed",
"input.onGesture|block": "on |%NAME",
"input.onPinPressed|block": "on pin %NAME|pressed",
"input.onPinPressed|block": "on pin %name|pressed",
"input.onPinReleased|block": "on pin %NAME|released",
"input.pinIsPressed|block": "pin %NAME|is pressed",
"input.rotation|block": "rotation (°)|%NAME",
@ -53,6 +134,7 @@
"input.temperature|block": "temperature (°C)",
"input|block": "input",
"led.brightness|block": "brightness",
"led.enable|block": "led enable %on",
"led.plotBarGraph|block": "plot bar graph of %value |up to %high",
"led.plot|block": "plot|x %x|y %y",
"led.point|block": "point|x %x|y %y",
@ -70,8 +152,10 @@
"music.setTempo|block": "set tempo to (bpm)|%value",
"music.tempo|block": "tempo (bpm)",
"music|block": "music",
"pins.analogPitch|block": "analog pitch %frequency|for (ms) %ms",
"pins.analogReadPin|block": "analog read|pin %name",
"pins.analogSetPeriod|block": "analog set period|pin %pin|to (µs)%micros",
"pins.analogSetPitchPin|block": "analog set pitch pin %name",
"pins.analogWritePin|block": "analog write|pin %name|to %value",
"pins.digitalReadPin|block": "digital read|pin %name",
"pins.digitalWritePin|block": "digital write|pin %name|to %value",
@ -87,7 +171,9 @@
"pins.spiWrite|block": "spi write %value",
"pins|block": "pins",
"serial.delimiters|block": "%del",
"serial.onDataReceived|block": "serial|on data received %delimiters=serial_delimiter_conv",
"serial.readLine|block": "serial|read line",
"serial.readString|block": "serial|read string",
"serial.readUntil|block": "serial|read until %delimiter=serial_delimiter_conv",
"serial.redirect|block": "serial|redirect to|TX %tx|RX %rx|at baud rate %rate",
"serial.writeLine|block": "serial|write line %text",

Some files were not shown because too many files have changed in this diff Show More