Compare commits

...

78 Commits

Author SHA1 Message Date
1c6c749dad 0.2.106 2016-05-10 11:08:46 -07:00
2803c00814 Bump pxt-core to 0.2.121 2016-05-10 11:08:44 -07:00
f150d93070 removing old logos 2016-05-10 10:51:47 -07:00
7f284b2a57 0.2.105 2016-05-10 10:44:52 -07:00
0e5c30ec7c updated logo 2016-05-10 10:44:40 -07:00
2cc6f864a8 remove logging 2016-05-10 10:26:36 -07:00
d428a2cd1f Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2016-05-10 10:15:25 -07:00
47f9362e5f read radio values 2016-05-10 10:14:51 -07:00
38b197bc03 0.2.104 2016-05-10 19:03:50 +02:00
9a404854e7 Rename target 2016-05-10 19:03:31 +02:00
d17a8de72d Use shorter domain name 2016-05-10 19:01:36 +02:00
9d1f2e024b missing shim 2016-05-10 09:28:05 -07:00
e7d8559fe3 Cache test scripts 2016-05-10 13:18:35 +02:00
fcfdbcc7e4 moving block down category 2016-05-09 23:03:42 -07:00
5884231399 null terminated name 2016-05-09 23:01:20 -07:00
e8887f5904 radio blocks to read/stream value pairs 2016-05-09 22:55:37 -07:00
07e8610e5d 0.2.103 2016-05-09 14:13:15 -07:00
37fb907f04 Bump pxt-core to 0.2.120 2016-05-09 14:13:13 -07:00
13f42f5892 added various tutorials 2016-05-09 10:32:02 -07:00
5fcf9165ea magic 8 tutorial 2016-05-09 09:45:57 -07:00
b33d0ba470 updated strings 2016-05-06 14:17:39 -07:00
b9f66c5c6b 0.2.102 2016-05-06 11:31:55 -07:00
9848409283 Bump pxt-core to 0.2.117 2016-05-06 11:31:53 -07:00
ce16e64660 added shuffled lessons 2016-05-06 11:31:25 -07:00
4d056e0c23 lessons updates 2016-05-06 09:32:29 -07:00
70b2827cf0 fixing various lessons menu 2016-05-06 09:28:26 -07:00
62e4b04931 0.2.101 2016-05-05 12:50:36 -07:00
17e33cc34f updated white space 2016-05-05 12:50:26 -07:00
d4ad150cba Bump pxt-core to 0.2.114 2016-05-05 12:48:59 -07:00
52bfd4e535 Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2016-05-05 12:35:26 -07:00
f854dfd9c8 updated generated docs 2016-05-05 12:32:40 -07:00
d905f24f9c updated generated strings.json 2016-05-05 11:32:35 -07:00
81b8b1b69c updated docs 2016-05-05 11:16:14 -07:00
efce4c3698 linting 2016-05-05 08:57:44 -07:00
b5e4a36e9c Add libraries docs 2016-05-05 14:20:18 +01:00
04a60a5b47 fixing various lint violations 2016-05-04 23:31:55 -07:00
29b28e7f0d adding aspect ratio 2016-05-04 22:44:11 -07:00
979381eaef Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2016-05-04 14:46:46 -07:00
e4370f4e3c 0.2.100 2016-05-04 15:25:52 +01:00
ba707f080d Bump pxt-core to 0.2.112 2016-05-04 15:25:51 +01:00
3816e01f87 Add locale-specific theme 2016-05-04 15:23:04 +01:00
548d215b48 0.2.99 2016-05-04 13:31:59 +01:00
43da58f214 Bump pxt-core to 0.2.111 2016-05-04 13:31:57 +01:00
f90d052538 Add example localized doc 2016-05-04 13:25:56 +01:00
13ff7cd0ec removing readme.md from template 2016-05-03 14:45:10 -07:00
a3b34518b0 0.2.98 2016-05-02 21:24:17 -07:00
5a33dc8a81 updated thank you 2016-05-02 21:24:10 -07:00
7349e28898 0.2.97 2016-05-02 21:15:27 -07:00
26b9fdf40e adding survey completed 2016-05-02 21:15:10 -07:00
3cf82b9be2 0.2.96 2016-05-02 10:49:05 -07:00
546c44bafa Bump pxt-core to 0.2.107 2016-05-02 10:49:03 -07:00
d727d3fcde removing lists 2016-05-02 09:46:03 -07:00
6b0cf961c6 support for lists in blocks 2016-05-02 09:40:29 -07:00
18419d763d 0.2.95 2016-04-29 17:17:57 -07:00
99fdb53fa0 Bump pxt-core to 0.2.106 2016-04-29 17:17:54 -07:00
879fdd687e Merge remote-tracking branch 'refs/remotes/origin/master' into docs 2016-04-29 16:25:57 -07:00
6c1b879c34 Merge remote-tracking branch 'refs/remotes/origin/master' into docs 2016-04-29 16:18:43 -07:00
019bbc79fc 0.2.94 2016-04-29 11:20:30 -07:00
f857a88541 Bump pxt-core to 0.2.105 2016-04-29 11:20:28 -07:00
6531e7bfbb Merge remote-tracking branch 'origin/docs' 2016-04-29 07:58:13 -07:00
2147225afd update seismograph 2016-04-28 17:02:33 -07:00
841ea6d060 update lesson changes 2016-04-28 16:49:57 -07:00
3dddb2eb30 Merge pull request #55 from Microsoft/docs
Docs
2016-04-28 16:42:05 -07:00
651cf14556 update lesson 2016-04-28 14:12:02 -07:00
7f6fb5559b reworking charting lesson 2016-04-28 11:47:59 -07:00
ea724038dc Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2016-04-28 11:44:24 -07:00
19757d4245 updated chart 2016-04-28 11:44:11 -07:00
07a7b4048a fix missing loops 2016-04-28 11:21:58 -07:00
45742aa2ac Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2016-04-28 10:46:50 -07:00
db0c5d9f9f exposing serial number block. 2016-04-28 10:46:03 -07:00
8285250a1b updated charting 2016-04-28 10:27:51 -07:00
de0257c7e9 update lessons charting 2016-04-28 10:22:58 -07:00
3580012065 updated lessons
update
2016-04-27 16:36:29 -07:00
cdb23fffb6 Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2016-04-27 15:30:51 -07:00
6937c51549 0.2.93 2016-04-27 15:02:21 -07:00
69e90523e2 Bump pxt-core to 0.2.101 2016-04-27 15:02:19 -07:00
f76235736a Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2016-04-27 14:54:20 -07:00
980ad6ce91 update acc lesson 2016-04-26 16:52:18 -07:00
86 changed files with 1334 additions and 704 deletions

View File

@ -13,4 +13,5 @@ notifications:
cache:
directories:
- node_modules
- built/cache

5
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,5 @@
// Place your settings in this file to overwrite default and user settings.
{
"tslint.enable": true,
"tslint.rulesDirectory": "node_modules/tslint-microsoft-contrib"
}

View File

@ -12,7 +12,7 @@ Please follow instructions at https://github.com/Microsoft/pxt#running-a-target-
## Universal Windows App
The Windows 10 app is a [Universal Windows Hosted Web App](https://microsoftedge.github.io/WebAppsDocs/en-US/win10/CreateHWA.htm)
that wraps codemicrobit.com and provides additional features.
that wraps m.pxt.io and provides additional features.
### Sideloading

View File

@ -0,0 +1,22 @@
{
"name": "koduj z micro:bit",
"title": "koduj z micro:bit",
"docMenu": [
{
"name": "O nas",
"path": "/about"
},
{
"name": "Lekcje",
"path": "/lessons"
},
{
"name": "Instrukcja obsługi",
"path": "/reference"
},
{
"name": "Urządzenie",
"path": "/device"
}
]
}

7
docs/_locales/pl/docs.md Normal file
View File

@ -0,0 +1,7 @@
# Dokumentacja
Witamy na stronach dokumentacji!
* Przeglądnij [instrukcje obsługi](/reference)
* Dowiedz się więcej o [urządzeniu](/device)
* Wystartuj z [lekcjami](/lessons)

View File

@ -2,6 +2,7 @@
Welcome to the documentation.
* Browse the [reference](/reference)
* Browse the [API reference](/reference)
* Learn more about the [device](/device)
* Get started with [lessons](/lessons)
* Learn about [libraries](/libraries) (possibly using C++)

View File

@ -5,9 +5,6 @@
### ~column
## O365 Integration
* [Science Experiments: Graphing & Charting](/lessons/charting), create an app for simulating and measuring sensor data of acceleration, temperature, light level, and rotation
## Beginner
* [Beautiful Image](/lessons/beautiful-image), show a beautiful image with show LEDs
@ -60,6 +57,9 @@
* [Telegraph](/lessons/telegraph), play the telegraph game between two BBC micro:bits
* [Pogo](/lessons/pogo), create a pogo game to test your jumping abilities
## Science
* [Charting](/lessons/charting), measure and chart acceleration
## Advanced
* [Prank WiFi](/lessons/prank-wifi), create fake WiFi to trick your friends
* [Speed Button](/lessons/speed-button), code a speed game with running time
@ -70,5 +70,4 @@
### @section full
The lessons promote computational thinking and computer science literacy[ read more...](/lessons/teach)
The lessons promote computational thinking and computer science literacy[ read more...](/lessons/teach)

View File

@ -21,7 +21,6 @@ basic.showString("ASK ME A QUESTION")
input.onButtonPressed(Button.A, () => {
basic.showString("Yes")
})
```
* `Run` the code to see if it works as expected.
@ -45,7 +44,6 @@ input.onButtonPressed(Button.B, () => {
* `Run` the code to see if it works as expected.
**Challenge 3**
When you are asked a yes or no question, do you always say yes or no? Add a condition for `on shake` that displays `MAYBE`.
### Challenge 3
When you are asked a yes or no question, do you always say yes or no? Add a condition for `on shake` that displays `MAYBE`.

View File

@ -12,7 +12,6 @@ Answers may vary. This is a function that will show a string on the LED screen o
```blocks
basic.showString("Y")
```
![](/static/mb/lessons/answering-machine-0.png)
@ -22,7 +21,6 @@ basic.showString("Y")
```blocks
basic.showString("Hi")
```
![](/static/mb/lessons/answering-machine-1.png)
@ -35,7 +33,6 @@ basic.showString("Hi")
```blocks
basic.showString("Z")
```

View File

@ -39,9 +39,9 @@ basic.showLeds(`
`)
```
* *Run* your code to see if it works as expected.
* Does your code work as expected?
### Challenge 2
Nice job! Why don't we create a third image that will show after the other two? Remember to add a pause before you create and show the image.
Nice job! Why don't we create a third image that will show after the other two?

View File

@ -12,17 +12,14 @@ Answer the questions while completing the tutorial. Pay attention to the dialogu
## 1. Write the code that will store the global variable named 'action' and returns a random number between 0 and 2
<br/>
```
action = Math.random(3)
```blocks
let action = Math.random(3)
```
## 2. Write the code that will display the string, "PUSH A" if the global variable called 'action' is equal to 0
<br />
```
```blocks
let action = Math.random(3)
if (action == 0) {
basic.showString("PUSH A", 150)
}
@ -30,10 +27,9 @@ if (action == 0) {
## 3. Write the code that increments the score if button A is pressed when the global variable called 'action' is equal to 1
<br />
```
```blocks
input.onButtonPressed(Button.A, () => {
let action = Math.random(3)
if (action == 0) {
game.addScore(1)
}
@ -42,9 +38,8 @@ input.onButtonPressed(Button.A, () => {
## 4. Write the code that will display the string "LOGO DOWN" if the global variable called 'action' is equal to 1
<br />
```
```blocks
let action = Math.random(3)
if (action == 1) {
basic.showString("LOGO DOWN", 150)
}
@ -52,10 +47,9 @@ if (action == 1) {
## 5. Write the code that increments the score if the BBC micro:bit logo is tilted down when the global variable called 'action' is equal to 1
<br />
```
```blocks
input.onLogoDown(() => {
let action = Math.random(3)
if (action == 1) {
game.addScore(1)
}
@ -64,9 +58,8 @@ input.onLogoDown(() => {
## 6. Write the code that will display the string "SHAKE" if the global variable called 'action' is equal to 2
<br />
```
```blocks
let action = Math.random(3)
if (action == 2) {
basic.showString("SHAKE", 150)
}
@ -74,13 +67,11 @@ if (action == 2) {
## 7. Write the code that increments the score if the BBC micro:bit is shaken when the global variable called 'action' is equal to 2
<br/>
```
```blocks
input.onLogoDown(() => {
let action = Math.random(3)
if (action == 1) {
game.addScore(1)
}
})
```

View File

@ -11,6 +11,7 @@ Variables
## Quick Links
* [activity](/lessons/catch-the-egg-game/activity)
* [tutorial](/lessons/catch-the-egg-game/tutorial)
* [quiz](/lessons/catch-the-egg-game/quiz)
* [quiz answers](/lessons/catch-the-egg-game/quiz-answers)
@ -20,18 +21,21 @@ Learn how to create a catch the egg game game with **plot**, `led->plot` , **unp
## Documentation
* **variables** : [read more...](/reference/variables/var)
* **forever** : [read more...](/reference/basic/forever)
* **unplot** : [read more...](/reference/led/unplot)
* **plot** : [read more...](/reference/led/plot)
* **if** : [read more...](/reference/logic/if)
* **acceleration** : [read more...](/reference/input/acceleration)
* **math minimum number** : [read more...](/reference/math)
* **math maximum number** : [read more...](/reference/math)
* **math random number** : [read more...](/reference/math)
* **math modulus** : [read more...](/reference/math)
* **show number** : [read more...](/reference/basic/show-number)
* **pause** : [read more...](/reference/basic/pause)
```cards
let x = 2;
led.unplot(0, 0);
basic.forever(() => {});
x += 1;
led.plot(0, 0);
basic.pause(300);
input.acceleration(Dimension.X);
Math.min(0,0);
Math.max(0,1);
Math.random(5);
game.addScore(1);
game.score();
game.removeLife(1);
```
## Objectives

View File

@ -1,7 +1,5 @@
# catch the egg game challenges
Coding challenges for catch the egg game.
## Before we get started
Your starting code should look like this:

View File

@ -0,0 +1,29 @@
# catch the egg game tutorial
### Rebuild the game!
The blocks have been shuffled! Put them back together so that...
* an egg LED falls from the top of the screen, row by row.
* a basket LED is on the bottom row and can be moved by using the accelerometer `X` data.
* if the egg LED reaches the last row, reset the egg position to the first row.
```shuffle
let basketX = 2
let eggX = 2
let eggY = 0
basic.forever(() => {
led.unplot(basketX, 4)
led.unplot(eggX, eggY)
eggY = eggY + 1
led.plot(eggX, eggY)
basic.pause(300)
let accX = input.acceleration(Dimension.X)
basketX = 2 + Math.min(2, Math.max(-2, accX / 200))
led.plot(basketX, 4)
if (eggY > 4) {
eggY = -1
eggX = Math.random(5)
}
basic.pause(300)
})
```

View File

@ -7,8 +7,10 @@ Create a charting app for simulating and measuring the acceleration applied to t
Acceleration
## Quick Links
* [Chart Acceleration: Activity](/lessons/charting/acceleration)
* [Chart Acceleration: Challenge](/lessons/charting/acceleration-challenge)
* [activity](/lessons/charting/acceleration)
* [challenge](/lessons/charting/challenge)
* [quiz](/lessons/charting/quiz)
* [answers](/lessons/charting/quiz-answers)
## Prior learning/place of lesson in scheme of work

View File

@ -1,4 +1,4 @@
# Chart Acceleration: Activity
# Activity
Measure the acceleration on the micro:bit in the "x" direction.
@ -39,7 +39,7 @@ Vigorously move the micro:bit in the micro:bit simulatator by moving the micro:b
### ~
Review and write down your observations from the Excel data. Then chart or graph the data collected by using a tool in Excel.
We want to chart the data collected by using a tool in Excel.
The final part of this experiment is opening and reviewing the data in the Excel CSV file. Simply click on the line beneath the simulator. A CSV file will be generated to display the data points collected by moving the micro:bit in the X direction. Then click or tap on the data Excel file that was downloaded to your local Downloads Folder.
@ -55,7 +55,6 @@ Use the Recommended Charts command on the Insert tab to quickly create a chart t
* Select the data that you want to include in your chart.
* Click Insert > Recommended Charts.
![](/static/mb/chart1.png)
@ -76,6 +75,7 @@ Tip: If you dont see a chart type that you want, click the All Charts tab to
* Connect a micro:bit to your computer using your USB cable; compile; and repeat this experiment by moving the micro:bit in the "x" direction. Then collect and chart the data on Excel.
* Review and analyze the actual micro:bit device data on Excel
* Display acceleration with y or z using plot bar graph by changing acceleration from "x" to "y" or "z"
### ~avatar avatar

View File

@ -1,4 +1,4 @@
# Chart Acceleration: Challenge
# Challenge
### ~avatar avatar
@ -90,10 +90,5 @@ Have fun reviewing your simulation and analyze the acceleration by chart the Exc
* Connect the second micro:bit to your computer using your USB cable and run the charting script on it.
* The first person and second person take turns tilting the micro:bit in the "x" direction while the other player charts the data on the micro:bit!
* Review and analyze the actual micro:bit device acceleration data on Excel
* Display acceleration with y or z using plot bar graph by changing acceleration from "x" to "y" or "z"
### ~avatar avatar
Excellent, you're ready to continue with the [challenges](/lessons/charting/acceleration)
### ~

View File

@ -0,0 +1,33 @@
# charting quiz answers
Measure the acceleration on the micro:bit in the "x" direction.
## Name
## Directions
Use this activity document to guide your work in the [glowing pendulum activity](/lessons/charting/acceleration)
Answer the questions while completing the tutorial. Pay attention to the dialogues!
## 1. Why are you creating a 'forever' loop?
<br/>
We are creating a forever loop to constantly display the appropriate brightness on the LED display.
## 2. Write the line of code to measure the acceleration with respect to the "x" axis and display this value in a bar graph.
<br/>
```blocks
led.plotBarGraph(input.acceleration(Dimension.X), 0)
```
## 3. After vigarously moving the micro:bit from side to side along the "x" axis for a sufficient amount of time,insert the Excel graph for displaying a line chart used to display trends over time.
<br/>
![](/static/mb/line_chart.png)

View File

@ -0,0 +1,23 @@
# charting quiz
Measure the acceleration on the micro:bit in the "x" direction.
## Name
## Directions
Use this activity document to guide your work in the [glowing pendulum tutorial](/lessons/glowing-pendulum/activity)
Answer the questions while completing the tutorial. Pay attention to the dialogues!
## 1. Why are you creating a 'forever' loop?
<br/>
## 2. Write the line of code to measure the acceleration with respect to the "y" axis and store this value in a local variable called 'acceleration'.
<br/>
## 3. After vigarously moving the micro:bit from side to side along the "x" axis for a sufficient amount of time,insert the Excel graph for displaying a line chart used to display trends over time.

View File

@ -17,7 +17,7 @@ input.onPinPressed(TouchPin.P1, () => {
})
```
**Challenge 1**
### Challenge 1
Let's include a second sound `on pin pressed` *P2*. To do this, you need to add the same blocks as the banana keyboard activity. However, you must change alter `on pin pressed` from P1 to P2. Additionally, you must *decrease* the frequency of the variable "sound" by 25. Modify your code so that your code looks like this
@ -42,7 +42,7 @@ input.onPinPressed(TouchPin.P2, () => {
* click *run* to see if the code works as expected.
**Challenge 2**
### Challenge 2
Finally, we want images to be displayed with sounds `on pin pressed`. Add `show LEDs` blocks under `on pin pressed` P1 and P2.

View File

@ -42,7 +42,7 @@ input.onButtonPressed(Button.B, () => {
* `Run` the code to see if it works as expected.
**Challenge 3**
### Challenge 3
When you are asked a yes or no question, do you always say yes or no? Add a condition for `on shake` that displays `TRY AGAIN`.

View File

@ -9,6 +9,7 @@ Acceleration
## Quick Links
* [activity](/lessons/glowing-pendulum/activity)
* [tutorial](/lessons/glowing-pendulum/tutorial)
* [challenges](/lessons/glowing-pendulum/challenges)
* [quiz](/lessons/glowing-pendulum/quiz)
* [quiz answers](/lessons/glowing-pendulum/quiz-answers)

View File

@ -4,10 +4,29 @@ Construct a pendulum that glows using acceleration.
Welcome! This activity will teach how to construct a pendulum that glows using acceleration. Let's get started!
Turn on all the LEDs.
```blocks
basic.showLeds(`
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
`)
```
Create a **forever** loop that will constantly display the appropriate brightness on the LED display.
```blocks
basic.showLeds(`
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
`)
basic.forever(() => {
})
@ -16,6 +35,13 @@ basic.forever(() => {
Now let's measure the acceleration on the `y` axis and store that value in a variable. The `acceleration(y)` function will provide the value.
```blocks
basic.showLeds(`
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
`)
basic.forever(() => {
let acceleration = input.acceleration(Dimension.Y);
});
@ -25,9 +51,15 @@ Since the micro:bit will be swinging back and forth, the acceleration will only
```blocks
let acceleration = 0;
basic.showLeds(`
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
`)
basic.forever(() => {
acceleration = input.acceleration(Dimension.Y);
let acceleration = input.acceleration(Dimension.Y);
acceleration = Math.abs(acceleration)
});
```
@ -35,6 +67,13 @@ basic.forever(() => {
The function `acceleration(y)` returns a number between 0 and 1024. We want to use this value for the brightness of the micro:bit, but the `set brightness()` only accepts a value between 0 and 256. Thus, we need to divide the acceleration by 4 to ensure we will be in the appropriate range.
```blocks
basic.showLeds(`
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
`)
basic.forever(() => {
let acceleration = input.acceleration(Dimension.Y);
acceleration = Math.abs(acceleration);
@ -46,37 +85,19 @@ basic.forever(() => {
Now let's use our acceleration value to set the brightness on the micro:bit.
```blocks
basic.showLeds(`
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
`)
basic.forever(() => {
let acceleration = input.acceleration(Dimension.Y);
acceleration = Math.abs(acceleration);
acceleration = acceleration / 4;
led.setBrightness(acceleration)
});
```
Let's show what the brightness of the micro:bit is by turning all the LEDs on!
```blocks
basic.forever(() => {
let acceleration = input.acceleration(Dimension.Y);
acceleration = Math.abs(acceleration);
acceleration = acceleration / 4;
led.setBrightness(acceleration)
basic.showLeds(`
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
`)
});
```
### ~avatar avatar

View File

@ -24,13 +24,13 @@ basic.forever(() => {
```
**Challenge 1**
### Challenge 1
![](/static/mb/lessons/glowing-pendulum-0.jpg)
Hold the micro:bit in your hand in a dark room. Move the micro:bit like a pendulum and produce a slow image that captures the pattern of the micro:bit LEDs.
**Challenge 2**
### Challenge 2
Replace "y" in `acceleration(y)` with "x" or "z". Changing the axis will cause the micro:bit to measure the force in a different direction. What differences in the resulting pattern does this replacement make?

View File

@ -0,0 +1,29 @@
# glowing pendulum block tutorial
The glowing pendulum changes the screen brightness based on the acceleration measured on the BBC micro:bit.
### Rebuild the game!
The blocks have been shuffled! Put them back together so that...
* all LEDs are turned on
* the BBC micro:bit repeats code **forever** that
* reads the acceleration along the ``y`` axis,
* calculate the absolute value of the acceleration
* scales down the acceleration value by a factor of `4`
* uses the scaled value to set the screen **brightness**
```blocks
basic.showLeds(`
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
`)
basic.forever(() => {
let acceleration = input.acceleration(Dimension.Y);
acceleration = Math.abs(acceleration);
acceleration = acceleration / 4;
led.setBrightness(acceleration)
});
```

View File

@ -11,6 +11,7 @@ Math - Pick Random
## Quick links
* [activity](/lessons/guess-the-number/activity)
* [tutorial](/lessons/guess-the-number/tutorial)
* [challenges](/lessons/guess-the-number/challenges)
* [quiz](/lessons/guess-the-number/quiz)
* [quiz answers](/lessons/guess-the-number/quiz-answers)

View File

@ -19,12 +19,11 @@ input.onButtonPressed(Button.A, () => {
```
Create a local variable of type number `x` and set it to a random number using `pick random`. `pick random` 9 generates a random number between `0` and `09`.
Create a local variable of type number `x` and set it to a random number using `pick random`. `pick random` 9 generates a random number between `0` and `9`.
```blocks
input.onButtonPressed(Button.A, () => {
let x = Math.random(9)
let x = Math.random(10)
})
```
@ -34,7 +33,7 @@ Show the random number on the screen.
```blocks
input.onButtonPressed(Button.A, () => {
let x = Math.random(9)
let x = Math.random(10)
basic.showNumber(x)
})

View File

@ -0,0 +1,25 @@
# guess the number tutorial
### ~avatar avatar
### @video td/videos/guess-the-number-0
This tutorial will help you create a guess the number game! Let's get started!
### ~
### Rebuild the game!
The blocks have been shuffled! Put them back together so that...
* when the user presses button ``A``,
* generate a random number
* show the number on screen
```shuffle
input.onButtonPressed(Button.A, () => {
let x = Math.random(10)
basic.showNumber(x)
})
```

View File

@ -35,5 +35,5 @@ basic.showNumber(14)
### Challenge 3
Keep displaying multiples of 7 such as 21 and 28, but don't forget to add pauses between the numbers!
Keep displaying multiples of 7 such as 21 and 28...

View File

@ -9,6 +9,7 @@ If (Conditionals)
## Quick Links
* [activity](/lessons/magic-8/activity)
* [tutorial](/lessons/magic-8/tutorial)
* [challenges](/lessons/magic-8/challenges)
* [quiz](/lessons/magic-8/quiz)
* [quiz answers](/lessons/magic-8/quiz-answers)

View File

@ -1,8 +1,6 @@
# magic 8 activity
A fortune teller game on the micro:bit
Welcome! This tutorial will help you create a magic 8 ball on the micro:bit. Let's get started!
Welcome! This activity will help you create a magic 8 ball on the micro:bit. Let's get started!
Show a string to instruct the user how to play Magic 8! The magic 8 ball can only answer true or false questions.
@ -32,16 +30,13 @@ input.onGesture(Gesture.Shake, () => {
Create a variable of type number called **randomNumber**. Set **randomNumber** to a random number with a limit of 2. Remember the random function in the math library, picks a random number from 0 to the limit, but not including the limit unless it is 0.
```blocks
basic.showString("ASK A QUESTION")
basic.showNumber(8)
input.onGesture(Gesture.Shake, () => {
basic.clearScreen()
let randomNumber = Math.random(2)
let randomNumber = Math.random(3)
});
```
Create an if statement for the condition `if randomNumber = 2`. If **randomNumber** is 2, display the string 'Yes'
@ -52,7 +47,7 @@ basic.showString("ASK A QUESTION")
basic.showNumber(8)
input.onGesture(Gesture.Shake, () => {
basic.clearScreen();
let randomNumber = Math.random(2);
let randomNumber = Math.random(3);
if (randomNumber == 2) {
basic.showString("YES");
}
@ -68,7 +63,7 @@ basic.showString("ASK A QUESTION")
basic.showNumber(8)
input.onGesture(Gesture.Shake, () => {
basic.clearScreen()
let randomNumber = Math.random(2)
let randomNumber = Math.random(3)
if (randomNumber == 2) {
basic.showString("YES")
} else if (randomNumber == 1) {
@ -84,7 +79,7 @@ basic.showString("ASK A QUESTION")
basic.showNumber(8)
input.onGesture(Gesture.Shake, () => {
basic.clearScreen()
let randomNumber = Math.random(2)
let randomNumber = Math.random(3)
if (randomNumber == 2) {
basic.showString("YES")
} else if (randomNumber == 1) {
@ -106,14 +101,13 @@ basic.showString("ASK A QUESTION")
basic.showNumber(8)
input.onGesture(Gesture.Shake, () => {
basic.clearScreen()
let randomNumber = Math.random(2)
let randomNumber = Math.random(3)
if (randomNumber == 2) {
basic.showString("YES")
} else if (randomNumber == 1) {
basic.showString("NO")
} else {
basic.showString("I DON'T KNOW")
}
basic.showNumber(8)

View File

@ -26,7 +26,7 @@ input.onGesture(Gesture.Shake, () => {
```
**Challenge 1**
### Challenge 1
Now let's increase the number of responses the magic 8 ball can give. How about 5 responses instead? Let's change the limit of `pick random` to 4.
@ -49,7 +49,7 @@ input.onGesture(Gesture.Shake, () => {
})
```
**Challenge 2**
### Challenge 2
Now have the magic 8 ball respond "Try again" if **randomNumber** is 3.
@ -73,7 +73,7 @@ input.onGesture(Gesture.Shake, () => {
})
```
**Challenge 3**
### Challenge 3
Now what about if **randomNumber** is 4? Let's have the magic 8 ball respond "Definitely!".

View File

@ -0,0 +1,27 @@
# Magic 8 tutorial
Show a string to instruct the user how to play Magic 8! The magic 8 ball can only answer questions with "YES", "NO", or "MAYBE"...
### Rebuild the game!
The blocks have been shuffled! Put them back together so that...
* show "ASK A QUESTION" on the screen
* when the micro:bit is shaken,
* generate a random number between 0 and 2.
* if the number is `2`, show "YES"
* if the number is `1`, show "NO"
* otherwise show "MAYBE"...
```shuffle
basic.showString("ASK A QUESTION")
input.onGesture(Gesture.Shake, () => {
let randomNumber = Math.random(3)
if (randomNumber == 2) {
basic.showString("YES")
} else if (randomNumber == 1) {
basic.showString("NO")
} else {
basic.showString("MAYBE")
}
})
```

View File

@ -30,8 +30,6 @@ input.onGesture(Gesture.LogoUp, () => {
. . # . .
`)
})
```
Run your code and try to turn around the micro:bit to see the **logo up** event in action!

View File

@ -46,7 +46,7 @@ input.onButtonPressed(Button.B, () => {
```
**Challenge 3**
### Challenge 3
Add an event handler with `on shake` to change the LED brightness back to a `255`.

View File

@ -88,7 +88,7 @@ input.onButtonPressed(Button.B, () => {
* Run the code to see if it works as expected.
**Challenge 3**
### Challenge 3
Now make sure the image does not go off the left side and if it does, prompt the user to push button `A`.

View File

@ -42,7 +42,7 @@ basic.forever(() => {
```
**Challenge 1**
### Challenge 1
What if wanted to show the maximum connectivity of wifi instead of just 1, 3, or 4 bars?
@ -86,7 +86,7 @@ basic.forever(() => {
})
```
**Challenge 2**
### Challenge 2
Let's add an **IF** at the bottom of your code that checks to see if `sum >= to 1200` **and** if `sum <1400`
@ -135,7 +135,7 @@ basic.forever(() => {
})
```
**Challenge 3**
### Challenge 3
Now it's your turn! Be creative and change the Wifi meter images to your own wifi image you're sure will prank your friends by editing the lines that call `showLeds()`.

View File

@ -41,7 +41,7 @@ input.onButtonPressed(Button.A, () => {
```
**Challenge 1**
### Challenge 1
Create an event handler for Button B.
@ -83,7 +83,7 @@ input.onButtonPressed(Button.B, () => {
```
**Challenge 2**
### Challenge 2
### @video td/videos/screen-wipe-2
@ -155,7 +155,7 @@ basic.showLeds(`
```
**Challenge 3**
### Challenge 3
Show an animation that scrolls back up when you press button "B".

View File

@ -0,0 +1,34 @@
# Seismograph Lesson
Build a seismograph with household materials
## Topic
Acceleration & Analog Read Pin
## Quick Links
* [activity](/lessons/seismograph/activity)
* [challenge](/lessons/seismograph/challenges)
## Prior learning/place of lesson in scheme of work
Learn how to **show LEDs** to turn on a LED light pattern on the LED screen. We will be learning basic comments such as show LEDs and pause.
## Documentation
```cards
basic.forever(() => {
});
led.plotBarGraph(input.acceleration(Dimension.Strength) - 1023, 0);
led.plotBarGraph(pins.analogReadPin(AnalogPin.P0), 0);
```
## Objectives
* learn how to repeat code forever in the background
* learn how to display a vertical bar graph based on the value.
* learn how to return the sum of the two numbers
* learn how to get acceleration value in milli-gravitys
* learn how to read the connector value as analog as a value comprised between 0 and 1023

View File

@ -0,0 +1,150 @@
# Seismograph Activity
### ~avatar avatar
In this project, you will build your own seismograph.
## What you'll need:
* micro:bit
* USB cable
* Scissors
* Glue gun
* String
* Cup (Plastic or Paper)
* Magnet
Welcome! This activity will teach how to use the micro:bit to chart the strength of the acceleration. Let's get started!
1. Setup Cup: Use scissors to cut a usable window on the cup, which will be a square sized hole at the lid side of the cup. Use scissors to create a small hole in the center of the base of the cup.
2. Fasten Magnet: Fasten end of the string to the magnet with glue
3. Secure String: Fasten string to base of the cup and hang the remaining string outside the base of the cup.
### ~avatar avatar
Seismograph built, let's code!
### ~
4. Go to Codemicrobit.com
Click or tap Create Code
Click or tap Block Editor
### ~
5.
We will measure `acceleration (mg)` in terms of strength. Get the acceleration value (milli g-force), as measured in strength.
```blocks
input.acceleration(Dimension.Strength);
```
### ~
6.
Use the plot bar chart to visualize the acceleration on the LED screen of the micro:bit in the specified range. You implement plot Bar Graph to display a vertical bar graph based on the "value" and "high" value. Then you must insert acceleration in based on strength.
```blocks
basic.forever(() => {
led.plotBarGraph(input.acceleration(Dimension.Strength), 0);
});
```
### ~
7.
Finally, we subtract the gravity from acceleration strength.
```blocks
basic.forever(() => {
led.plotBarGraph(input.acceleration(Dimension.Strength) - 1023, 0);
});
```
### ~
8.
Notice that making vibrating the object below the micro:bit changes the values and the line appears as a wave to display the value of the strength as measured in milli-gravities. By making the object below the micro:bit vibrate, you will observe changing values of the micro:bit. Also, the LEDs shown on the Bar Graph fluctates based on the movement of the micro:bit strength.
NOTE: The black color reflects the micro:bit device.
![](/static/mb/data4.png)
### ~
9.
Vigorously move the micro:bit in the micro:bit simulatator by moving the micro:bit image from side to side. Every time the micro:bit moves in the x direction in the simulator, you are generating data points that can be reviewed in Excel. The more attempts to move the micro:bit from side to side, the more data being saved in Excel. After you have vigarously moved the micro:bit simulator from side to side for a sufficient amount of time, you are ready to graph or chart the accceleration of the micro:bit. We want a printout of our acceleration on Excel that can be graphed in Excel.
### ~
10.
We want to chart the data collected by using a tool in Excel.
The final part of this experiment is opening and reviewing the data in the Excel CSV file. Simply click on the line beneath the simulator. A CSV file will be generated to display the data points collected by moving the micro:bit in the X direction. Then click or tap on the data Excel file that was downloaded to your local Downloads Folder.
### ~
10.
First, click or tap on the first two columns (A, B) to include the time of the data being collected; b) the results of acceleration data on the micro:bit
![](/static/mb/data7.png)
Use the Recommended Charts command on the Insert tab to quickly create a chart thats just right for your data.
* Select the data that you want to include in your chart.
* Click Insert > Recommended Charts.
### ~
11.
![](/static/mb/chart1.png)
* On the Recommended Charts tab, scroll through the list of chart types that Excel recommends for your data.
Click any chart type to see how your data will look in that format.
When you find the chart type that you want, click it, and then click OK. We want to select the chart called Line. A line chart is used to display trends over time. We will use the line chart because there are many data points over time.
Tip: If you dont see a chart type that you want, click the All Charts tab to see all of the available chart types.
### ~
12.
![](/static/mb/chart_title.png)
* Use the Chart Elements, Chart Styles, and Chart Filters buttons next to the upper-right corner of the chart to add chart elements like axis titles or data labels, to customize the look of your chart
### ~
13.
![](/static/mb/elements_styles_filters.png)
* Connect a micro:bit to your computer using your USB cable; compile; and repeat this experiment by vibrating the micro:bit. Then chart the data on Excel.
### ~avatar avatar
Excellent, you're ready to continue with the [challenges](/lessons/seismograph/challenge)
### ~

View File

@ -1,52 +1,4 @@
# charting light
Measure the light level on the micro:bit from light to dark.
### ~avatar avatar
Welcome! This activity will teach how to use the micro:bit to chart the light level from light to dark. Let's get started!
### ~
Let's measure the light level from dark to light. Get the acceleration value (milli g-force), in one of three specified dimensions.
```blocks
input.lightLevel()
```
### ~
Use the plot bar chart to visualize the acceleration on the LED screen of the micro:bit in the specified range. You implement plot Bar Graph to display a vertical bar graph based on the "value" and "high" value. Then you must insert acceleration in the X dimension to measure the acceleration.
```blocks
basic.forever(() => {
led.plotBarGraph(input.acceleration(Dimension.X), 0)
})
```
### ~
Notice that moving the micro:bit in the simulator from left to right (x direction) changes the values beneath the micro:bit in a range from 1023 to -1023 as measured in milli-gravities. By hovering over the micro:bit from left to right, you can observe changing values beneath the micro:bit simulator. Also, the LEDs shown on the Bar Graph fluctates based on the movement of the micro:bit simulator in the x direction. The line underneath the micro:bit simulator reflect the acceleration in the x direction.
NOTE: The colors of the charts reflect the color of the micro:bit simulator. In this instance, the micro:bit is yellow. So the color of the data line reflects the color of the micro:bit
![](/static/mb/data4.png)
### ~
Vigorously move the micro:bit in the micro:bit simulatator by moving the micro:bit image from side to side. Every time the micro:bit moves in the x direction in the simulator, you are generating data points that can be reviewed in Excel. The more attempts to move the micro:bit from side to side, the more data being saved in Excel. After you have vigarously moved the micro:bit simulator from side to side for a sufficient amount of time, you are ready to graph or chart the accceleration of the micro:bit. We want a printout of our acceleration on Excel that can be graphed in Excel.
### ~
The final part of this experiment is opening and reviewing the data in the Excel CSV file. Simply click on the line beneath the simulator. A CSV file will be generated to display the data points collected by moving the micro:bit in the X direction. Then click or tap on the data Excel file that was downloaded to your local Downloads Folder.
![](/static/mb/data3.png)
### ~
* Review and write down your observations from the Excel data.
* Chart the data collected by using a graph in Excel
* Connect a micro:bit to your computer using your USB cable; compile; and move the micro:bit in the "x" direction.
* Review and analyze the actual micro:bit device data on Excel
# Challenge
### ~avatar avatar
@ -109,6 +61,28 @@ Finally, you must open the Excel CSV file by clicking on the data.xls file that
![](/static/mb/data3.png)
Use the Recommended Charts command on the Insert tab to quickly create a chart thats just right for your data.
* Select the data that you want to include in your chart.
* Click Insert > Recommended Charts.
![](/static/mb/chart1.png)
* On the Recommended Charts tab, scroll through the list of chart types that Excel recommends for your data.
Click any chart type to see how your data will look in that format.
When you find the chart type that you want, click it, and then click OK. We want to select the chart called Line. A line chart is used to display trends over time. We will use the line chart because there are many data points over time.
Tip: If you dont see a chart type that you want, click the All Charts tab to see all of the available chart types.
![](/static/mb/chart_title.png)
* Use the Chart Elements, Chart Styles, and Chart Filters buttons next to the upper-right corner of the chart to add chart elements like axis titles or data labels, to customize the look of your chart
![](/static/mb/elements_styles_filters.png)
### ~
Have fun reviewing your simulation and analyze the acceleration by chart the Excel data using Excel.
@ -116,3 +90,5 @@ Have fun reviewing your simulation and analyze the acceleration by chart the Exc
* Connect the second micro:bit to your computer using your USB cable and run the charting script on it.
* The first person and second person take turns tilting the micro:bit in the "x" direction while the other player charts the data on the micro:bit!
* Review and analyze the actual micro:bit device acceleration data on Excel
* Display acceleration with y or z using plot bar graph by changing acceleration from "x" to "y" or "z"

View File

@ -11,6 +11,7 @@ If (Conditionals)
## Quick Links
* [activity](/lessons/truth-or-dare/activity)
* [tutorial](/lessons/truth-or-dare/tutorial)
* [challenges](/lessons/truth-or-dare/challenges)
* [quiz](/lessons/truth-or-dare/quiz)
* [quiz answers](/lessons/truth-or-dare/quiz-answers)

View File

@ -0,0 +1,63 @@
# truth or dare tutorial
### ~avatar avatar
### @video td/videos/truth-or-dare-0
The *Truth or dare!* game works as follows: a player spins the BBC micro:bit on the table.
When the micro:bit stops spinning, the player pointed by the arrow (displayed on screen) must press the button "A"
to see if she has to provide a *truth* or a *dare*.
### ~
### Rebuild the game!
The blocks have been shuffled! Put them back together so that...
* an up arrow is displayed when the micro:bit is powered on.
* on button `A` is pressed,
* randomly display "TRUTH" or "DARE" on the screen
* show the up arrow again.
```shuffle
basic.showLeds(`
. . # . .
. # # # .
# # # # #
. . # . .
. . # . .
`)
input.onButtonPressed(Button.A, () => {
let random = Math.random(2)
if (random == 0) {
basic.showString("TRUTH")
} else {
basic.showString("DARE")
}
basic.showLeds(`
. . # . .
. # # # .
# # # # #
. . # . .
. . # . .
`)
})
```
### Hints and tips
Cut out these documentation cards to help you!
```cards
basic.showLeds(`
. . # . .
. # # # .
# . # . #
. . # . .
. . # . .
`);
Math.random(2);
basic.showString("TRUTH");
if (true) {} else {}
"TRUTH";
0;
input.onButtonPressed(Button.A, () => {});
```

14
docs/libraries.md Normal file
View File

@ -0,0 +1,14 @@
# Extensions
You can publish libraries (also known as packages or extensions)
that users can then add to their scripts. These typically
provide a driver for a particular hardware device you can connect
to a microbit.
* [Sample C++ extension](https://github.com/Microsoft/pxt-microbit-cppsample)
* [Sample TypeScript extension](https://github.com/Microsoft/pxt-microbit/tree/master/libs/i2c-fram)
## Finding libraries
## Publishing libraries

View File

@ -0,0 +1,23 @@
# microbit Reference
```namespaces
basic.showNumber(0);
input.onButtonPressed(Button.A, () => {
});
led.plot(0, 0);
music.playTone(0, 0);
game.addScore(1);
images.createImage(`
. . . . .
. . . . .
. . # . .
. . . . .
. . . . .
`);
pins.digitalReadPin(DigitalPin.P0);
serial.writeValue(x, 0);
control.inBackground(() => {
});
```

View File

@ -1,17 +1,27 @@
# Reference
```namespaces
basic.showString("Hello!");
input.onButtonPressed(Button.A, () => {});
for (let i = 0;i<5;++i) {}
if (true){}
let x = 0;
Math.random(5);
led.plot(0,0);
radio.sendNumber(0);
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Whole));
game.createSprite(2,2);
basic.showNumber(0);
input.onButtonPressed(Button.A, () => {
});
led.plot(0, 0);
music.playTone(0, 0);
game.addScore(1);
images.createImage(`
. . . . .
. . . . .
. . # . .
. . . . .
. . . . .
`);
pins.digitalReadPin(DigitalPin.P0);
serial.writeLine("Hello!");
control.inBackground(() => {});
```
serial.writeValue(x, 0);
control.inBackground(() => {
});

View File

@ -2,7 +2,6 @@
Provides access to basic micro:bit functionality.
```cards
basic.showNumber(0);
basic.showLeds(`

View File

@ -1,7 +1,6 @@
# Control
Runtime and event utilities.
```cards
control.inBackground(() => {

View File

@ -1,7 +1,6 @@
# Game
A single-LED sprite game engine
```cards
game.addScore(1);

View File

@ -1,7 +1,6 @@
# Images
Creation, manipulation and display of LED images.
```cards
images.createImage(`

View File

@ -1,7 +1,6 @@
# Input
Events and data from sensors
```cards
input.onButtonPressed(Button.A, () => {

View File

@ -1,7 +1,6 @@
# Led
Control of the LED screen.
```cards
led.plot(0, 0);
@ -10,7 +9,7 @@ led.point(0, 0);
led.brightness();
led.setBrightness(255);
led.stopAnimation();
led.plotBarGraph(0, 1023);
led.plotBarGraph(0, 0);
led.fadeIn();
led.fadeOut();
led.plotAll();

View File

@ -1,14 +1,13 @@
# Music
Generation of music tones through pin ``P0``.
```cards
music.playTone(0, 0);
music.ringTone(0);
music.rest(0);
music.noteFrequency(Note.C);
music.beat();
music.beat(BeatFraction.Whole);
music.tempo();
music.changeTempoBy(20);
music.setTempo(120);

View File

@ -1,7 +1,6 @@
# Pins
Control currents in Pins for analog/digital signals, servos, i2c, ...
```cards
pins.digitalReadPin(DigitalPin.P0);

View File

@ -1,7 +1,6 @@
# Radio
Communicate data using radio packets
```cards
radio.sendNumber(0);

View File

@ -1,8 +1,8 @@
# Serial
[Serial communication](/device/serial) between the BBC micro:bit and another computer.
Reading and writing data over a serial connection.
```cards
serial.writeValue(x, 0);
serial.writeLine("");
serial.writeValue("x", 0);
```

View File

@ -1 +0,0 @@
<svg xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' width='193.50101' height='32.755001' version='1.1'><g transform='translate(-1.3555,0.63251107)'><title>micro:bit logo</title><path d='m 38.7185,20.11349 c -1.677,0 -3.035,-1.364 -3.035,-3.042 0,-1.678 1.357,-3.038 3.035,-3.038 1.684,0 3.039,1.36 3.039,3.038 0,1.678 -1.355,3.042 -3.039,3.042 m -22.311,-6.077 c -1.677,0 -3.042,1.357 -3.042,3.035 0,1.678 1.363,3.042 3.042,3.042 1.674,0 3.036,-1.364 3.036,-3.042 0,-1.678 -1.363,-3.035 -3.036,-3.035 m -0.003,-5.99 22.576,0 c 4.979,0 9.027,4.047 9.027,9.027 0,4.979 -4.049,9.031 -9.027,9.031 l -22.576,0 c -4.977,0 -9.03,-4.053 -9.03,-9.031 -0.001,-4.98 4.053,-9.027 9.03,-9.027 m 22.576,24.076 c 8.299,0 15.047,-6.75 15.047,-15.049 0,-8.299 -6.748,-15.051 -15.047,-15.051 l -22.576,0 c -8.299,0 -15.049,6.752 -15.049,15.051 0,8.299 6.75,15.049 15.049,15.049 l 22.576,0 m 112.099,-21.953 c 0,-1.453 -1.195,-2.633 -2.662,-2.633 -1.455,0 -2.639,1.18 -2.639,2.633 0,1.471 1.184,2.672 2.639,2.672 1.466,0 2.662,-1.202 2.662,-2.672 z m -66.786,5.445 c 0,-4.764 -2.893,-8.093 -7.031,-8.093 -2.027,0 -3.814,0.851 -5.223,2.47 -1.467,-1.661 -3.152,-2.47 -5.127,-2.47 -4.162,0 -7.066,3.329 -7.066,8.093 l 0,10.466 3.812,0 0,-10.644 c 0,-2.416 1.336,-4.104 3.254,-4.104 1.617,0 3.25,1.409 3.25,4.104 l 0,10.645 3.848,0 0,-10.645 c 0,-2.416 1.338,-4.104 3.252,-4.104 1.863,0 3.217,1.727 3.217,4.104 l 0,10.645 3.814,0 0,-10.467 z m 6.953,-7.632 -3.846,0 0,18.099 3.846,0 0,-18.099 z m 0.569,-5.128 c 0,-1.377 -1.096,-2.454 -2.492,-2.454 -1.4,0 -2.453,1.054 -2.453,2.454 0,1.398 1.078,2.494 2.453,2.494 1.375,0 2.492,-1.117 2.492,-2.494 z m 18.328,20.914 0.576,-0.521 -2.828,-2.658 -0.488,0.455 c -1.252,1.149 -2.504,1.686 -3.945,1.686 -3.064,0 -5.557,-2.557 -5.557,-5.699 0,-3.121 2.492,-5.66 5.557,-5.66 1.432,0 2.646,0.521 3.949,1.693 l 0.512,0.46 2.748,-2.802 -0.49,-0.502 c -1.754,-1.793 -4.016,-2.696 -6.719,-2.696 -2.459,0 -4.869,1.022 -6.605,2.798 -1.738,1.734 -2.691,4.119 -2.691,6.709 0,2.596 0.953,4.979 2.684,6.705 1.771,1.811 4.117,2.811 6.615,2.811 2.401,-0.003 4.647,-0.937 6.682,-2.779 z m 7.25,-6.947 c 0,-3.322 1.145,-4.686 4.217,-5.029 l 0.641,-0.07 0,-3.797 -0.777,0.058 c -5.629,0.458 -8.143,3.247 -8.143,9.048 l 0,9.051 4.062,0 0,-9.261 0,0 z m 21.998,6.923 c 1.762,-1.756 2.729,-4.146 2.729,-6.715 0,-2.565 -0.967,-4.951 -2.723,-6.702 -1.77,-1.809 -4.105,-2.806 -6.576,-2.806 -2.492,0 -4.84,0.997 -6.613,2.806 -1.752,1.792 -2.721,4.174 -2.721,6.702 0,2.53 0.969,4.916 2.721,6.707 1.771,1.81 4.121,2.808 6.613,2.808 2.472,0 4.808,-0.998 6.57,-2.8 z m -1.229,-6.714 c 0,3.18 -2.361,5.665 -5.377,5.665 -2.945,0 -5.346,-2.541 -5.346,-5.665 0,-3.137 2.398,-5.695 5.346,-5.695 2.963,-0.002 5.377,2.558 5.377,5.695 z m 12.917,6.418 c 0,-1.468 -1.195,-2.667 -2.662,-2.667 -1.455,0 -2.639,1.199 -2.639,2.667 0,1.453 1.184,2.632 2.639,2.632 1.466,0 2.662,-1.179 2.662,-2.632 z m 19.507,0.296 c 1.76,-1.756 2.73,-4.146 2.73,-6.715 0,-2.528 -0.973,-4.911 -2.729,-6.702 -1.746,-1.787 -4.08,-2.77 -6.574,-2.77 -2.035,0 -3.84,0.572 -5.484,1.744 l 0,-9.934 -3.816,0 0.008,15.582 c -0.037,0.411 -0.037,0.821 -0.037,1.198 0,6.119 3.836,10.396 9.33,10.396 2.475,0.001 4.807,-0.997 6.572,-2.799 z m -1.013,-6.677 c 0,3.123 -2.494,5.66 -5.559,5.66 -3.115,0 -5.557,-2.484 -5.557,-5.66 0,-3.143 2.494,-5.698 5.557,-5.698 3.065,0 5.559,2.556 5.559,5.698 z m 10.881,-9.085 -3.846,0 0,18.099 3.846,0 0,-18.099 z m 0.572,-5.128 c 0,-1.377 -1.098,-2.454 -2.492,-2.454 -1.4,0 -2.457,1.054 -2.457,2.454 0,1.398 1.076,2.494 2.457,2.494 1.373,0 2.492,-1.117 2.492,-2.494 z m 13.83,19.759 -0.619,-0.089 c -2.855,-0.409 -4.133,-2.104 -4.133,-5.495 l 0,-5.126 4.752,0 0,-3.674 -4.752,0 0,-4.006 -3.887,0 0,4.006 -1.662,0 0,3.674 1.662,0 0,4.525 c 0,6.215 2.113,8.932 7.783,10.029 l 0.855,0.164 0,-4.008 0.001,0 z' style='fill:#ffffff' /></g></svg>

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -1 +0,0 @@
<svg xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' width='193.50101' height='32.755001' version='1.1'><g transform='translate(-1.3555,0.63251107)'><title>micro:bit logo</title><path d='m 38.7185,20.11349 c -1.677,0 -3.035,-1.364 -3.035,-3.042 0,-1.678 1.357,-3.038 3.035,-3.038 1.684,0 3.039,1.36 3.039,3.038 0,1.678 -1.355,3.042 -3.039,3.042 m -22.311,-6.077 c -1.677,0 -3.042,1.357 -3.042,3.035 0,1.678 1.363,3.042 3.042,3.042 1.674,0 3.036,-1.364 3.036,-3.042 0,-1.678 -1.363,-3.035 -3.036,-3.035 m -0.003,-5.99 22.576,0 c 4.979,0 9.027,4.047 9.027,9.027 0,4.979 -4.049,9.031 -9.027,9.031 l -22.576,0 c -4.977,0 -9.03,-4.053 -9.03,-9.031 -0.001,-4.98 4.053,-9.027 9.03,-9.027 m 22.576,24.076 c 8.299,0 15.047,-6.75 15.047,-15.049 0,-8.299 -6.748,-15.051 -15.047,-15.051 l -22.576,0 c -8.299,0 -15.049,6.752 -15.049,15.051 0,8.299 6.75,15.049 15.049,15.049 l 22.576,0 m 112.099,-21.953 c 0,-1.453 -1.195,-2.633 -2.662,-2.633 -1.455,0 -2.639,1.18 -2.639,2.633 0,1.471 1.184,2.672 2.639,2.672 1.466,0 2.662,-1.202 2.662,-2.672 z m -66.786,5.445 c 0,-4.764 -2.893,-8.093 -7.031,-8.093 -2.027,0 -3.814,0.851 -5.223,2.47 -1.467,-1.661 -3.152,-2.47 -5.127,-2.47 -4.162,0 -7.066,3.329 -7.066,8.093 l 0,10.466 3.812,0 0,-10.644 c 0,-2.416 1.336,-4.104 3.254,-4.104 1.617,0 3.25,1.409 3.25,4.104 l 0,10.645 3.848,0 0,-10.645 c 0,-2.416 1.338,-4.104 3.252,-4.104 1.863,0 3.217,1.727 3.217,4.104 l 0,10.645 3.814,0 0,-10.467 z m 6.953,-7.632 -3.846,0 0,18.099 3.846,0 0,-18.099 z m 0.569,-5.128 c 0,-1.377 -1.096,-2.454 -2.492,-2.454 -1.4,0 -2.453,1.054 -2.453,2.454 0,1.398 1.078,2.494 2.453,2.494 1.375,0 2.492,-1.117 2.492,-2.494 z m 18.328,20.914 0.576,-0.521 -2.828,-2.658 -0.488,0.455 c -1.252,1.149 -2.504,1.686 -3.945,1.686 -3.064,0 -5.557,-2.557 -5.557,-5.699 0,-3.121 2.492,-5.66 5.557,-5.66 1.432,0 2.646,0.521 3.949,1.693 l 0.512,0.46 2.748,-2.802 -0.49,-0.502 c -1.754,-1.793 -4.016,-2.696 -6.719,-2.696 -2.459,0 -4.869,1.022 -6.605,2.798 -1.738,1.734 -2.691,4.119 -2.691,6.709 0,2.596 0.953,4.979 2.684,6.705 1.771,1.811 4.117,2.811 6.615,2.811 2.401,-0.003 4.647,-0.937 6.682,-2.779 z m 7.25,-6.947 c 0,-3.322 1.145,-4.686 4.217,-5.029 l 0.641,-0.07 0,-3.797 -0.777,0.058 c -5.629,0.458 -8.143,3.247 -8.143,9.048 l 0,9.051 4.062,0 0,-9.261 0,0 z m 21.998,6.923 c 1.762,-1.756 2.729,-4.146 2.729,-6.715 0,-2.565 -0.967,-4.951 -2.723,-6.702 -1.77,-1.809 -4.105,-2.806 -6.576,-2.806 -2.492,0 -4.84,0.997 -6.613,2.806 -1.752,1.792 -2.721,4.174 -2.721,6.702 0,2.53 0.969,4.916 2.721,6.707 1.771,1.81 4.121,2.808 6.613,2.808 2.472,0 4.808,-0.998 6.57,-2.8 z m -1.229,-6.714 c 0,3.18 -2.361,5.665 -5.377,5.665 -2.945,0 -5.346,-2.541 -5.346,-5.665 0,-3.137 2.398,-5.695 5.346,-5.695 2.963,-0.002 5.377,2.558 5.377,5.695 z m 12.917,6.418 c 0,-1.468 -1.195,-2.667 -2.662,-2.667 -1.455,0 -2.639,1.199 -2.639,2.667 0,1.453 1.184,2.632 2.639,2.632 1.466,0 2.662,-1.179 2.662,-2.632 z m 19.507,0.296 c 1.76,-1.756 2.73,-4.146 2.73,-6.715 0,-2.528 -0.973,-4.911 -2.729,-6.702 -1.746,-1.787 -4.08,-2.77 -6.574,-2.77 -2.035,0 -3.84,0.572 -5.484,1.744 l 0,-9.934 -3.816,0 0.008,15.582 c -0.037,0.411 -0.037,0.821 -0.037,1.198 0,6.119 3.836,10.396 9.33,10.396 2.475,0.001 4.807,-0.997 6.572,-2.799 z m -1.013,-6.677 c 0,3.123 -2.494,5.66 -5.559,5.66 -3.115,0 -5.557,-2.484 -5.557,-5.66 0,-3.143 2.494,-5.698 5.557,-5.698 3.065,0 5.559,2.556 5.559,5.698 z m 10.881,-9.085 -3.846,0 0,18.099 3.846,0 0,-18.099 z m 0.572,-5.128 c 0,-1.377 -1.098,-2.454 -2.492,-2.454 -1.4,0 -2.457,1.054 -2.457,2.454 0,1.398 1.076,2.494 2.457,2.494 1.373,0 2.492,-1.117 2.492,-2.494 z m 13.83,19.759 -0.619,-0.089 c -2.855,-0.409 -4.133,-2.104 -4.133,-5.495 l 0,-5.126 4.752,0 0,-3.674 -4.752,0 0,-4.006 -3.887,0 0,4.006 -1.662,0 0,3.674 1.662,0 0,4.525 c 0,6.215 2.113,8.932 7.783,10.029 l 0.855,0.164 0,-4.008 0.001,0 z' style='fill:#000000' /></g></svg>

Before

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -1 +0,0 @@
<svg xmlns:svg='http://www.w3.org/2000/svg' xmlns='http://www.w3.org/2000/svg' width='193.50101' height='32.755001' version='1.1'><g transform='translate(-1.3555,0.63251107)'><title>micro:bit logo</title><path d='m 38.7185,20.11349 c -1.677,0 -3.035,-1.364 -3.035,-3.042 0,-1.678 1.357,-3.038 3.035,-3.038 1.684,0 3.039,1.36 3.039,3.038 0,1.678 -1.355,3.042 -3.039,3.042 m -22.311,-6.077 c -1.677,0 -3.042,1.357 -3.042,3.035 0,1.678 1.363,3.042 3.042,3.042 1.674,0 3.036,-1.364 3.036,-3.042 0,-1.678 -1.363,-3.035 -3.036,-3.035 m -0.003,-5.99 22.576,0 c 4.979,0 9.027,4.047 9.027,9.027 0,4.979 -4.049,9.031 -9.027,9.031 l -22.576,0 c -4.977,0 -9.03,-4.053 -9.03,-9.031 -0.001,-4.98 4.053,-9.027 9.03,-9.027 m 22.576,24.076 c 8.299,0 15.047,-6.75 15.047,-15.049 0,-8.299 -6.748,-15.051 -15.047,-15.051 l -22.576,0 c -8.299,0 -15.049,6.752 -15.049,15.051 0,8.299 6.75,15.049 15.049,15.049 l 22.576,0 m 112.099,-21.953 c 0,-1.453 -1.195,-2.633 -2.662,-2.633 -1.455,0 -2.639,1.18 -2.639,2.633 0,1.471 1.184,2.672 2.639,2.672 1.466,0 2.662,-1.202 2.662,-2.672 z m -66.786,5.445 c 0,-4.764 -2.893,-8.093 -7.031,-8.093 -2.027,0 -3.814,0.851 -5.223,2.47 -1.467,-1.661 -3.152,-2.47 -5.127,-2.47 -4.162,0 -7.066,3.329 -7.066,8.093 l 0,10.466 3.812,0 0,-10.644 c 0,-2.416 1.336,-4.104 3.254,-4.104 1.617,0 3.25,1.409 3.25,4.104 l 0,10.645 3.848,0 0,-10.645 c 0,-2.416 1.338,-4.104 3.252,-4.104 1.863,0 3.217,1.727 3.217,4.104 l 0,10.645 3.814,0 0,-10.467 z m 6.953,-7.632 -3.846,0 0,18.099 3.846,0 0,-18.099 z m 0.569,-5.128 c 0,-1.377 -1.096,-2.454 -2.492,-2.454 -1.4,0 -2.453,1.054 -2.453,2.454 0,1.398 1.078,2.494 2.453,2.494 1.375,0 2.492,-1.117 2.492,-2.494 z m 18.328,20.914 0.576,-0.521 -2.828,-2.658 -0.488,0.455 c -1.252,1.149 -2.504,1.686 -3.945,1.686 -3.064,0 -5.557,-2.557 -5.557,-5.699 0,-3.121 2.492,-5.66 5.557,-5.66 1.432,0 2.646,0.521 3.949,1.693 l 0.512,0.46 2.748,-2.802 -0.49,-0.502 c -1.754,-1.793 -4.016,-2.696 -6.719,-2.696 -2.459,0 -4.869,1.022 -6.605,2.798 -1.738,1.734 -2.691,4.119 -2.691,6.709 0,2.596 0.953,4.979 2.684,6.705 1.771,1.811 4.117,2.811 6.615,2.811 2.401,-0.003 4.647,-0.937 6.682,-2.779 z m 7.25,-6.947 c 0,-3.322 1.145,-4.686 4.217,-5.029 l 0.641,-0.07 0,-3.797 -0.777,0.058 c -5.629,0.458 -8.143,3.247 -8.143,9.048 l 0,9.051 4.062,0 0,-9.261 0,0 z m 21.998,6.923 c 1.762,-1.756 2.729,-4.146 2.729,-6.715 0,-2.565 -0.967,-4.951 -2.723,-6.702 -1.77,-1.809 -4.105,-2.806 -6.576,-2.806 -2.492,0 -4.84,0.997 -6.613,2.806 -1.752,1.792 -2.721,4.174 -2.721,6.702 0,2.53 0.969,4.916 2.721,6.707 1.771,1.81 4.121,2.808 6.613,2.808 2.472,0 4.808,-0.998 6.57,-2.8 z m -1.229,-6.714 c 0,3.18 -2.361,5.665 -5.377,5.665 -2.945,0 -5.346,-2.541 -5.346,-5.665 0,-3.137 2.398,-5.695 5.346,-5.695 2.963,-0.002 5.377,2.558 5.377,5.695 z m 12.917,6.418 c 0,-1.468 -1.195,-2.667 -2.662,-2.667 -1.455,0 -2.639,1.199 -2.639,2.667 0,1.453 1.184,2.632 2.639,2.632 1.466,0 2.662,-1.179 2.662,-2.632 z m 19.507,0.296 c 1.76,-1.756 2.73,-4.146 2.73,-6.715 0,-2.528 -0.973,-4.911 -2.729,-6.702 -1.746,-1.787 -4.08,-2.77 -6.574,-2.77 -2.035,0 -3.84,0.572 -5.484,1.744 l 0,-9.934 -3.816,0 0.008,15.582 c -0.037,0.411 -0.037,0.821 -0.037,1.198 0,6.119 3.836,10.396 9.33,10.396 2.475,0.001 4.807,-0.997 6.572,-2.799 z m -1.013,-6.677 c 0,3.123 -2.494,5.66 -5.559,5.66 -3.115,0 -5.557,-2.484 -5.557,-5.66 0,-3.143 2.494,-5.698 5.557,-5.698 3.065,0 5.559,2.556 5.559,5.698 z m 10.881,-9.085 -3.846,0 0,18.099 3.846,0 0,-18.099 z m 0.572,-5.128 c 0,-1.377 -1.098,-2.454 -2.492,-2.454 -1.4,0 -2.457,1.054 -2.457,2.454 0,1.398 1.076,2.494 2.457,2.494 1.373,0 2.492,-1.117 2.492,-2.494 z m 13.83,19.759 -0.619,-0.089 c -2.855,-0.409 -4.133,-2.104 -4.133,-5.495 l 0,-5.126 4.752,0 0,-3.674 -4.752,0 0,-4.006 -3.887,0 0,4.006 -1.662,0 0,3.674 1.662,0 0,4.525 c 0,6.215 2.113,8.932 7.783,10.029 l 0.855,0.164 0,-4.008 0.001,0 z' style='fill:#000000' /></g></svg>

Before

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

BIN
docs/static/logo32.png vendored

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 302 KiB

BIN
docs/static/mb/crocodile-clips-2.jpg vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 277 KiB

BIN
docs/static/mb/line_chart.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

1
docs/static/microbit.bw.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 17 KiB

1
docs/static/microbit.red.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -1 +0,0 @@
<svg xmlns='http://www.w3.org/2000/svg' width='52.672' height='30.1' viewBox='0 0 52.672003 30.1'><g transform='translate(-1.355 -2.023)'><title>micro:bit logo</title><path d='M38.718 20.113c-1.677 0-3.035-1.364-3.035-3.042 0-1.677 1.357-3.037 3.035-3.037 1.684 0 3.04 1.36 3.04 3.038 0 1.68-1.356 3.043-3.04 3.043m-22.31-6.077c-1.678 0-3.043 1.357-3.043 3.035 0 1.68 1.363 3.043 3.042 3.043 1.674 0 3.036-1.364 3.036-3.042 0-1.677-1.363-3.034-3.036-3.034m-.003-5.99H38.98c4.98 0 9.027 4.047 9.027 9.027 0 4.98-4.05 9.03-9.027 9.03H16.404c-4.977 0-9.03-4.052-9.03-9.03 0-4.98 4.053-9.027 9.03-9.027M38.98 32.122c8.3 0 15.047-6.75 15.047-15.05 0-8.298-6.748-15.05-15.047-15.05H16.404c-8.3 0-15.05 6.752-15.05 15.05 0 8.3 6.75 15.05 15.05 15.05H38.98'/></g></svg>

Before

Width:  |  Height:  |  Size: 761 B

View File

@ -1,64 +0,0 @@
<?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"
width="1240"
height="600"
viewBox="0 0 1240 599.99999"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="splashscreen.svg"
inkscape:export-filename="C:\gh\pxt-microbit\win10\app\images\Square44x44Logo.targetsize-24_altform-unplated.png"
inkscape:export-xdpi="41.008503"
inkscape:export-ydpi="41.008503">
<metadata
id="metadata14">
<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></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1440"
inkscape:window-height="837"
id="namedview10"
showgrid="false"
inkscape:zoom="0.7546704"
inkscape:cx="528.17059"
inkscape:cy="263.58903"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<g
transform="matrix(15.144568,0,0,15.144568,200.63934,41.451935)"
id="g4">
<title
id="title6">micro:bit logo</title>
<path
d="m 38.718,20.113 c -1.677,0 -3.035,-1.364 -3.035,-3.042 0,-1.677 1.357,-3.037 3.035,-3.037 1.684,0 3.04,1.36 3.04,3.038 0,1.68 -1.356,3.043 -3.04,3.043 m -22.31,-6.077 c -1.678,0 -3.043,1.357 -3.043,3.035 0,1.68 1.363,3.043 3.042,3.043 1.674,0 3.036,-1.364 3.036,-3.042 0,-1.677 -1.363,-3.034 -3.036,-3.034 m -0.003,-5.99 22.576,0 c 4.98,0 9.027,4.047 9.027,9.027 0,4.98 -4.05,9.03 -9.027,9.03 l -22.576,0 c -4.977,0 -9.03,-4.052 -9.03,-9.03 0,-4.98 4.053,-9.027 9.03,-9.027 M 38.98,32.122 c 8.3,0 15.047,-6.75 15.047,-15.05 0,-8.298 -6.748,-15.05 -15.047,-15.05 l -22.576,0 c -8.3,0 -15.05,6.752 -15.05,15.05 0,8.3 6.75,15.05 15.05,15.05 l 22.576,0"
id="path8"
inkscape:connector-curvature="0" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -1,61 +0,0 @@
<?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"
width="52.672001"
height="52.672001"
viewBox="0 0 52.672003 52.672"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="squarelogo.svg">
<metadata
id="metadata14">
<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></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs12" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview10"
showgrid="false"
inkscape:zoom="6.0373632"
inkscape:cx="26.336"
inkscape:cy="21.675409"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<g
transform="translate(-1.355,9.2400005)"
id="g4">
<title
id="title6">micro:bit logo</title>
<path
d="m 38.718,20.113 c -1.677,0 -3.035,-1.364 -3.035,-3.042 0,-1.677 1.357,-3.037 3.035,-3.037 1.684,0 3.04,1.36 3.04,3.038 0,1.68 -1.356,3.043 -3.04,3.043 m -22.31,-6.077 c -1.678,0 -3.043,1.357 -3.043,3.035 0,1.68 1.363,3.043 3.042,3.043 1.674,0 3.036,-1.364 3.036,-3.042 0,-1.677 -1.363,-3.034 -3.036,-3.034 m -0.003,-5.99 22.576,0 c 4.98,0 9.027,4.047 9.027,9.027 0,4.98 -4.05,9.03 -9.027,9.03 l -22.576,0 c -4.977,0 -9.03,-4.052 -9.03,-9.03 0,-4.98 4.053,-9.027 9.03,-9.027 M 38.98,32.122 c 8.3,0 15.047,-6.75 15.047,-15.05 0,-8.298 -6.748,-15.05 -15.047,-15.05 l -22.576,0 c -8.3,0 -15.05,6.752 -15.05,15.05 0,8.3 6.75,15.05 15.05,15.05 l 22.576,0"
id="path8"
inkscape:connector-curvature="0" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.3 KiB

9
docs/thank-you.md Normal file
View File

@ -0,0 +1,9 @@
# You completed the survey!
```sim
basic.forever(() => { basic.showString("THANK YOU") })
```
Thank you for participating in this survey.
Please [contact us](mailto:microbitpilots@microsoft.com) with any information you think we might find useful.

View File

@ -36,7 +36,7 @@ namespace i2c_fram {
pins.i2cWriteBuffer(devaddr, buf)
}
export function readBuffer(addr: number, length: number) {
if (addr < 0 || length < 0 || (addr + length) > memend)
die();
@ -45,8 +45,8 @@ namespace i2c_fram {
buf[i] = readByte(addr + i)
return buf
}
export function writeBuffer(addr:number, buf: Buffer) {
export function writeBuffer(addr: number, buf: Buffer) {
if (addr < 0 || (addr + buf.length) > memend)
die();
for (let i = 0; i < buf.length; ++i)

View File

@ -2,6 +2,8 @@
using namespace pxt;
#define RADIO_VALUE_PACKET_TYPE 24641622
//% color=270 weight=34
namespace radio {
@ -46,6 +48,72 @@ namespace radio {
int buf[] = { value_0, value_1, value_2, value_3 };
uBit.radio.datagram.send((uint8_t*)buf, 4*sizeof(int));
}
/**
* Broadcasts a name / value pair along with the device serial number
* and running time to any connected BBC micro:bit in the group.
* @param name the field name (max 12 characters), eg: "data"
* @param the numberic value
*/
//% help=radio/stream-value
//% weight=4
//% blockId=radio_datagram_stream_value block="stream|value %name|= %value"
void streamValue(StringData* name, int number) {
if (radioEnable() != MICROBIT_OK) return;
ManagedString n(name);
uint8_t buf[32];
uint32_t* buf32 = (uint32_t*)buf;
memset(buf, 32, 0);
buf32[0] = number; // 4 bytes: value
buf32[1] = microbit_serial_number(); // 4 bytes: serial number
buf32[2] = system_timer_current_time(); // 4 bytes: running time
memcpy(buf + 12, n.toCharArray(), min(12, n.length())); // 12-24: field name
buf32[7] = RADIO_VALUE_PACKET_TYPE; // last 4 bytes: magic number of package type
uBit.radio.datagram.send(buf, 32);
}
/**
* Reads a value sent with `stream value` and writes it
* to the serial stream as JSON
*/
//% help=radio/read-value-to-serial
//% weight=3
void readValueToSerial() {
if (radioEnable() != MICROBIT_OK) return;
PacketBuffer p = uBit.radio.datagram.recv();
int length = p.length();
if (length < 32) {
return;
}
uint8_t* bytes = p.getBytes();
//uint32_t* buf32 = (uint32_t*)bytes;
//uint32_t type = buf32[7];
//if (type != RADIO_VALUE_PACKET_TYPE)
//{
// uBit.serial.send("type: ");
// uBit.serial.send(type);
// uBit.serial.send("\r\n");
// return;
//}
int value;
int serial;
int time;
char name[12+1]; memset(name, 0, 13 * sizeof(char));
memcpy(&value, bytes, 4);
memcpy(&serial, bytes + 4, 4);
memcpy(&time, bytes + 8, 4);
memcpy(&name, bytes + 12, 12);
uBit.serial.send("{s:"); uBit.serial.send(serial);
uBit.serial.send(",t:"); uBit.serial.send(time);
uBit.serial.send(",v:"); uBit.serial.send(value);
uBit.serial.send(",n:\""); uBit.serial.send(name);
uBit.serial.send("\"}\r\n");
}
/**
* Registers code to run when a packet is received over radio.

View File

@ -13,6 +13,25 @@ declare namespace radio {
//% blockId=radio_datagram_send_numbers block="send numbers|0: %VALUE0|1: %VALUE1|2: %VALUE2|3: %VALUE3" shim=radio::sendNumbers
function sendNumbers(value_0: number, value_1: number, value_2: number, value_3: number): void;
/**
* Broadcasts a name / value pair along with the device serial number
* and running time to any connected BBC micro:bit in the group.
* @param name the field name (max 12 characters), eg: "data"
* @param the numberic value
*/
//% help=radio/stream-value
//% weight=4
//% blockId=radio_datagram_stream_value block="stream|value %name|= %value" shim=radio::streamValue
function streamValue(name: string, number: number): void;
/**
* Reads a value sent with `stream value` and writes it
* to the serial stream as JSON
*/
//% help=radio/read-value-to-serial
//% weight=3 shim=radio::readValueToSerial
function readValueToSerial(): void;
/**
* Registers code to run when a packet is received over radio.
*/

View File

@ -0,0 +1,81 @@
{
"basic": "Provides access to basic micro:bit functionality.",
"basic.clearScreen": "Turn off all LEDs",
"basic.forever": "Repeats the code forever in the background. On each iteration, allows other codes to run.",
"basic.pause": "Pause for the specified time in milliseconds",
"basic.plotLeds": "Draws an image on the LED screen.",
"basic.showAnimation": "Shows a sequence of LED screens as an animation.",
"basic.showLeds": "Draws an image on the LED screen.",
"basic.showNumber": "Scroll a number on the screen. If the number fits on the screen (i.e. is a single digit), do not scroll.",
"basic.showString": "Display text on the display, one character at a time. If the string fits on the screen (i.e. is one letter), does not scroll.",
"control": "Runtime and event utilities.",
"control.inBackground": "Schedules code that run in the background.",
"control.reset": "Resets the BBC micro:bit.",
"game": "A single-LED sprite game engine",
"game.addScore": "Adds points to the current score",
"game.gameOver": "Displays a game over animation.",
"game.score": "Gets the current score",
"game.setScore": "Sets the current score value",
"game.startCountdown": "Starts a game countdown timer",
"images": "Creation, manipulation and display of LED images.",
"images.createBigImage": "Creates an image with 2 frames.",
"images.createImage": "Creates an image that fits on the LED screen.",
"input": "Events and data from sensors",
"input.acceleration": "Get the acceleration value in milli-gravitys (when the board is laying flat with the screen up, x=0, y=0 and z=-1024)",
"input.buttonIsPressed": "Get the button state (pressed or not) for ``A`` and ``B``.",
"input.calibrate": "Obsolete, compass calibration is automatic.",
"input.compassHeading": "Get the current compass compass heading in degrees.",
"input.lightLevel": "Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright.",
"input.magneticForce": "Get the magnetic force value in ``micro-Teslas`` (``µT``). This function is not supported in the simulator.",
"input.onButtonPressed": "Do something when a button (``A``, ``B`` or both ``A+B``) is pressed",
"input.onGesture": "Attaches code to run when the screen is facing up.",
"input.onLogoDown": "Attaches code to run when the logo is oriented downwards and the board is vertical.",
"input.onLogoUp": "Attaches code to run when the logo is oriented upwards and the board is vertical.",
"input.onPinPressed": "Do something when a pin(``P0``, ``P1`` or both ``P2``) is pressed.",
"input.onScreenDown": "Attaches code to run when the screen is facing down.",
"input.onScreenUp": "Attaches code to run when the screen is facing up.",
"input.onShake": "Attaches code to run when the device is shaken.",
"input.pinIsPressed": "Get the pin state (pressed or not). Requires to hold the ground to close the circuit.",
"input.rotation": "The pitch of the device, rotation along the ``x-axis``, in degrees.",
"input.runningTime": "Gets the number of milliseconds elapsed since power on.",
"input.setAccelerometerRange": "Sets the accelerometer sample range in gravities.",
"input.temperature": "Gets the temperature in Celsius degrees (°C).",
"led": "Control of the LED screen.",
"led.brightness": "Get the screen brightness from 0 (off) to 255 (full bright).",
"led.fadeIn": "Fades in the screen display.",
"led.fadeOut": "Fades out the screen brightness.",
"led.plot": "Turn on the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.",
"led.plotAll": "Turns all LEDS on",
"led.plotBarGraph": "Displays a vertical bar graph based on the `value` and `high` value.\nIf `high` is 0, the chart gets adjusted automatically.",
"led.point": "Get the on/off state of the specified LED using x, y coordinates. (0,0) is upper left.",
"led.screenshot": "Takes a screenshot of the LED screen and returns an image.",
"led.setBrightness": "Set the screen brightness from 0 (off) to 255 (full bright).",
"led.setDisplayMode": "Sets the display mode between black and white and greyscale for rendering LEDs.",
"led.stopAnimation": "Cancels the current animation and clears other pending animations.",
"led.toggle": "Toggles a particular pixel",
"led.toggleAll": "Inverts the current LED display",
"led.unplot": "Turn off the specified LED using x, y coordinates (x is horizontal, y is vertical). (0,0) is upper left.",
"music": "Generation of music tones through pin ``P0``.",
"music.beat": "Returns the duration of a beat in milli-seconds",
"music.changeTempoBy": "Change the tempo by the specified amount",
"music.noteFrequency": "Gets the frequency of a note.",
"music.playTone": "Plays a tone through pin ``P0`` for the given duration.",
"music.rest": "Rests (plays nothing) for a specified time through pin ``P0``.",
"music.ringTone": "Plays a tone through pin ``P0``.",
"music.setTempo": "Sets the tempo to the specified amount",
"music.tempo": "Returns the tempo in beats per minute. Tempo is the speed (bpm = beats per minute) at which notes play. The larger the tempo value, the faster the notes will play.",
"pins": "Control currents in Pins for analog/digital signals, servos, i2c, ...",
"pins.analogPitch": "Emits a Pulse-width modulation (PWM) signal to the current pitch pin. Use `analog set pitch pin` to define the pitch pin.",
"pins.analogReadPin": "Read the connector value as analog, that is, as a value comprised between 0 and 1023.",
"pins.analogSetPeriod": "Configures the Pulse-width modulation (PWM) of the analog output to the given value in **microseconds** or `1/1000` milliseconds.\nIf this pin is not configured as an analog output (using `analog write pin`), the operation has no effect.",
"pins.analogSetPitchPin": "Sets the pin used when using `pins->analog pitch`.",
"pins.analogWritePin": "Set the connector value as analog. Value must be comprised between 0 and 1023.",
"pins.digitalReadPin": "Read the specified pin or connector as either 0 or 1",
"pins.digitalWritePin": "Set a pin or connector value to either 0 or 1.",
"pins.map": "Re-maps a number from one range to another. That is, a value of ``from low`` would get mapped to ``to low``, a value of ``from high`` to ``to high``, values in-between to values in-between, etc.",
"pins.servoSetPulse": "Configures this IO pin as an analog/pwm output, configures the period to be 20 ms, and sets the pulse width, based on the value it is given **microseconds** or `1/1000` milliseconds.",
"pins.servoWritePin": "Writes a value to the servo, controlling the shaft accordingly. On a standard servo, this will set the angle of the shaft (in degrees), moving the shaft to that orientation. On a continuous rotation servo, this will set the speed of the servo (with ``0`` being full-speed in one direction, ``180`` being full speed in the other, and a value near ``90`` being no movement).",
"serial": "Reading and writing data over a serial connection.",
"serial.writeLine": "Prints a line of text to the serial",
"serial.writeValue": "Writes a ``name: value`` pair line to the serial."
}

View File

@ -159,7 +159,7 @@ namespace control {
/**
* Gets a friendly name for the device derived from the its serial number
*/
//% blockId="control_device_name" block="device name" weight=10
//% blockId="control_device_name" block="device name" weight=10 blockGap=8
StringData* deviceName() {
return ManagedString(microbit_friendly_name()).leakData();
}
@ -167,7 +167,7 @@ namespace control {
/**
* Derive a unique, consistent serial number of this device from internal data.
*/
//%
//% blockId="control_device_serial_number" block="device serial number" weight=9
int deviceSerialNumber() {
return microbit_serial_number();
}

51
libs/microbit/messages.ts Normal file
View File

@ -0,0 +1,51 @@
namespace messages {
var streamid: string;
export function setStreamId(id: string) {
streamid = id;
}
/**
* Creates a new message that includes the board serial number and the stream id if any
*/
export function createMessage() : Message {
let m = new Message();
m.addNumber('board', control.deviceSerialNumber());
if (streamid != null && streamid.length > 0)
m.addString('stream', streamid);
return m;
}
/**
* A message containig custom data
*/
export class Message {
private buffer:string = '';
/**
* Adds a string field to the message
*/
//%
public addString(name:string, value:string) {
if (this.buffer.length > 0) this.buffer += ',';
this.buffer += name + ':"' + value + '"';
}
/**
* Adds a number field to the message
*/
//%
public addNumber(name:string, value: number) {
if (this.buffer.length > 0) this.buffer += ',';
this.buffer += name + ':' + value;
}
/**
* Converts the message to a JSON payload
*/
//%
public toJSON() : string {
return '{' + this.buffer + '}';
}
}
}

View File

@ -346,13 +346,13 @@ declare namespace control {
/**
* Gets a friendly name for the device derived from the its serial number
*/
//% blockId="control_device_name" block="device name" weight=10 shim=control::deviceName
//% blockId="control_device_name" block="device name" weight=10 blockGap=8 shim=control::deviceName
function deviceName(): string;
/**
* Derive a unique, consistent serial number of this device from internal data.
*/
//% shim=control::deviceSerialNumber
//% blockId="control_device_serial_number" block="device serial number" weight=9 shim=control::deviceSerialNumber
function deviceSerialNumber(): number;
}

View File

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

View File

@ -1,7 +1,7 @@
{
"id": "microbit",
"name": "code micro:bit",
"title": "code micro:bit",
"name": "m.pxt.io",
"title": "m.pxt.io",
"corepkg": "microbit",
"bundleddirs": [
"libs/microbit",
@ -22,14 +22,12 @@
"description": "",
"files": [
"main.blocks",
"main.ts",
"README.md"
"main.ts"
]
},
"files": {
"main.blocks": "<xml xmlns=\"http://www.w3.org/1999/xhtml\"><block type=\"device_print_message\"><value name=\"text\"><shadow type=\"text\"><field name=\"TEXT\">Hello!</field></shadow></value></block></xml>",
"main.ts": "\n",
"README.md": "Describe your project here!"
"main.ts": "\n"
}
},
"tsprj": {
@ -42,13 +40,11 @@
},
"description": "",
"files": [
"main.ts",
"README.md"
"main.ts"
]
},
"files": {
"main.ts": "basic.showString('Hello!')\n",
"README.md": "Describe your project here!"
"main.ts": "basic.showString('Hello!')\n"
}
},
"compile": {
@ -58,12 +54,13 @@
},
"runtime": {
"mathBlocks": true,
"loopBlocks": true,
"loopsBlocks": true,
"logicBlocks": true,
"variablesBlocks": true
},
"simulator": {
"autoRun": true
"autoRun": true,
"aspectRatio": 1.22
},
"compileService": {
"gittag": "v0.1.8",
@ -75,13 +72,13 @@
"log": true
},
"appTheme": {
"logoUrl": "https://codemicrobit.com/about",
"logo": "./static/logo.svg",
"docsLogo": "./static/docslogo.svg",
"portraitLogo":"./static/portraitlogo.svg",
"footerLogo": "./static/footerlogo.svg",
"homeUrl": "https://codemicrobit.com/",
"embedUrl": "https://codemicrobit.com/",
"logoUrl": "https://m.pxt.io/about",
"logo": "./static/microbit.red.svg",
"docsLogo": "./static/microbit.red.svg",
"portraitLogo":"./static/microbit.red.svg",
"footerLogo": "./static/microbit.red.svg",
"homeUrl": "https://m.pxt.io/",
"embedUrl": "https://m.pxt.io/",
"koduUrl": "https://www.kodugamelab.com/bbc-microbit/",
"visualStudioCode": true,
"docMenu": [

View File

@ -4,12 +4,12 @@
namespace pxsim {
pxsim.initCurrentRuntime = () => {
U.assert(!runtime.board)
runtime.board = new Board()
U.assert(!runtime.board);
runtime.board = new Board();
}
export function board() {
return runtime.board as Board
return runtime.board as Board;
}
export interface AnimationOptions {
@ -77,7 +77,7 @@ namespace pxsim {
})
}
}
/**
* Error codes used in the micro:bit runtime.
*/
@ -115,7 +115,7 @@ namespace pxsim {
img.set(3, 1, 255);
img.set(4, 1, 255);
runtime.updateDisplay();
throw new Error("PANIC " + code)
}
@ -125,9 +125,9 @@ namespace pxsim {
export namespace AudioContextManager {
var _context: any; // AudioContext
var _vco: any; //OscillatorNode;
var _vca: any; // GainNode;
let _context: any; // AudioContext
let _vco: any; // OscillatorNode;
let _vca: any; // GainNode;
function context(): any {
if (!_context) _context = freshContext();
@ -152,7 +152,7 @@ namespace pxsim {
export function tone(frequency: number, gain: number) {
if (frequency <= 0) return;
var ctx = context();
let ctx = context();
if (!ctx) return;
gain = Math.max(0, Math.min(1, gain));
@ -198,10 +198,10 @@ namespace pxsim.basic {
pause(interval * 5);
} else {
if (s.length == 1) showLeds(createImageFromString(s), interval * 5)
else ImageMethods.scrollImage(createImageFromString(s + ' '), interval, 1);
else ImageMethods.scrollImage(createImageFromString(s + " "), interval, 1);
}
}
export function showLeds(leds: Image, delay: number): void {
showAnimation(leds, delay);
}
@ -226,12 +226,19 @@ namespace pxsim.control {
export function reset() {
U.userError("reset not implemented in simulator yet")
}
export function deviceName() : string {
export function deviceName(): string {
let b = board();
return b && b.id
? b.id.slice(0, 4)
: 'abcd';
return b && b.id
? b.id.slice(0, 4)
: "abcd";
}
export function deviceSerialNumber(): number {
let b = board();
return parseInt(b && b.id
? b.id.slice(1)
: "42");
}
export function onEvent(id: number, evid: number, handler: RefAction) {
@ -299,7 +306,7 @@ namespace pxsim.input {
export function compassHeading(): number {
var b = board();
let b = board();
if (!b.usesHeading) {
b.usesHeading = true;
runtime.queueDisplayUpdate();
@ -308,7 +315,7 @@ namespace pxsim.input {
}
export function temperature(): number {
var b = board();
let b = board();
if (!b.usesTemperature) {
b.usesTemperature = true;
runtime.queueDisplayUpdate();
@ -446,6 +453,10 @@ namespace pxsim.radio {
board().radio.datagram.send([value0, value1, value2, value3]);
}
export function streamValue(name: string, value: number) {
board().radio.datagram.send([value]);
}
export function receiveNumber(): number {
return board().radio.datagram.recv().data[0];
}
@ -558,29 +569,29 @@ namespace pxsim.images {
namespace pxsim.ImageMethods {
export function showImage(leds: Image, offset: number) {
if (!leds) panic(PanicCode.MICROBIT_NULL_DEREFERENCE);
if (!leds) panic(PanicCode.MICROBIT_NULL_DEREFERENCE);
leds.copyTo(offset, 5, board().image, 0)
runtime.queueDisplayUpdate()
}
export function plotImage(leds: Image, offset: number): void {
if (!leds) panic(PanicCode.MICROBIT_NULL_DEREFERENCE);
leds.copyTo(offset, 5, board().image, 0)
runtime.queueDisplayUpdate()
}
export function height(leds: Image) : number {
if (!leds) panic(PanicCode.MICROBIT_NULL_DEREFERENCE);
export function height(leds: Image): number {
if (!leds) panic(PanicCode.MICROBIT_NULL_DEREFERENCE);
return Image.height;
}
export function width(leds: Image) : number {
if (!leds) panic(PanicCode.MICROBIT_NULL_DEREFERENCE);
export function width(leds: Image): number {
if (!leds) panic(PanicCode.MICROBIT_NULL_DEREFERENCE);
return leds.width;
}
export function plotFrame(leds: Image, frame: number) {
ImageMethods.plotImage(leds, frame * Image.height);
}
@ -588,38 +599,38 @@ namespace pxsim.ImageMethods {
export function showFrame(leds: Image, frame: number) {
ImageMethods.showImage(leds, frame * Image.height);
}
export function pixel(leds: Image, x: number, y: number) : number {
if (!leds) panic(PanicCode.MICROBIT_NULL_DEREFERENCE);
return leds.get(x,y);
export function pixel(leds: Image, x: number, y: number): number {
if (!leds) panic(PanicCode.MICROBIT_NULL_DEREFERENCE);
return leds.get(x, y);
}
export function setPixel(leds: Image, x: number, y: number, v:number) {
if (!leds) panic(PanicCode.MICROBIT_NULL_DEREFERENCE);
leds.set(x,y,v);
export function setPixel(leds: Image, x: number, y: number, v: number) {
if (!leds) panic(PanicCode.MICROBIT_NULL_DEREFERENCE);
leds.set(x, y, v);
}
export function clear(leds: Image) {
if (!leds) panic(PanicCode.MICROBIT_NULL_DEREFERENCE);
if (!leds) panic(PanicCode.MICROBIT_NULL_DEREFERENCE);
leds.clear();
}
export function setPixelBrightness(i: Image, x: number, y: number, b: number) {
if (!i) panic(PanicCode.MICROBIT_NULL_DEREFERENCE);
if (!i) panic(PanicCode.MICROBIT_NULL_DEREFERENCE);
i.set(x, y, b);
}
export function pixelBrightness(i: Image, x: number, y: number): number {
if (!i) panic(PanicCode.MICROBIT_NULL_DEREFERENCE);
if (!i) panic(PanicCode.MICROBIT_NULL_DEREFERENCE);
return i.get(x, y);
}
export function scrollImage(leds: Image, interval: number, stride: number): void {
if (!leds) panic(PanicCode.MICROBIT_NULL_DEREFERENCE);
if (!leds) panic(PanicCode.MICROBIT_NULL_DEREFERENCE);
let cb = getResume()
let off = stride > 0 ? 0 : leds.width - 1;
let display = board().image;

View File

@ -1,5 +1,5 @@
namespace pxsim.micro_bit {
const Svg = pxsim.Svg;
const svg = pxsim.svg;
export interface IBoardTheme {
accent?: string;
@ -15,7 +15,7 @@ namespace pxsim.micro_bit {
virtualButtonOuter?: string;
virtualButtonUp?: string;
virtualButtonDown?: string;
lightLevelOn?:string;
lightLevelOn?: string;
lightLevelOff?: string;
}
@ -25,7 +25,7 @@ namespace pxsim.micro_bit {
display: "#000",
pin: "#D4AF37",
pinTouched: "#FFA500",
pinActive:"#FF5500",
pinActive: "#FF5500",
ledOn: "#ff7f7f",
ledOff: "#202020",
buttonOuter: "#979797",
@ -35,44 +35,44 @@ namespace pxsim.micro_bit {
virtualButtonUp: "#fff",
lightLevelOn: "yellow",
lightLevelOff: "#555"
}});
}
});
export function randomTheme() : IBoardTheme {
export function randomTheme(): IBoardTheme {
return themes[Math.floor(Math.random() * themes.length)];
}
export interface IBoardProps {
runtime: pxsim.Runtime;
theme?: IBoardTheme;
disableTilt?:boolean;
disableTilt?: boolean;
}
const pointerEvents = !!(window as any).PointerEvent ? {
up: "pointerup",
down: "pointerdown",
move: "pointermove",
leave: "pointerleave"
} : {
up: "mouseup",
down: "mousedown",
move: "mousemove",
leave: "mouseleave"
};
up: "mouseup",
down: "mousedown",
move: "mousemove",
leave: "mouseleave"
};
export class MicrobitBoardSvg
{
public element : SVGSVGElement;
export class MicrobitBoardSvg {
public element: SVGSVGElement;
private style: SVGStyleElement;
private defs : SVGDefsElement;
private defs: SVGDefsElement;
private g: SVGElement;
private logos: SVGElement[];
private head: SVGGElement; private headInitialized = false;
private headText: SVGTextElement;
private display: SVGElement;
private buttons: SVGElement[];
private buttonsOuter: SVGElement[];
private buttonABText:SVGTextElement;
private buttonABText: SVGTextElement;
private pins: SVGElement[];
private pinGradients: SVGLinearGradientElement[];
private pinTexts: SVGTextElement[];
@ -81,111 +81,111 @@ namespace pxsim.micro_bit {
private systemLed: SVGCircleElement;
private antenna: SVGPolylineElement;
private lightLevelButton: SVGCircleElement;
private lightLevelGradient : SVGLinearGradientElement;
private lightLevelGradient: SVGLinearGradientElement;
private lightLevelText: SVGTextElement;
private thermometerGradient : SVGLinearGradientElement;
private thermometerGradient: SVGLinearGradientElement;
private thermometer: SVGRectElement;
private thermometerText: SVGTextElement;
private shakeButton: SVGCircleElement;
private shakeText: SVGTextElement;
public board: pxsim.Board;
public board: pxsim.Board;
constructor(public props: IBoardProps) {
this.board = this.props.runtime.board as pxsim.Board;
this.board.updateView = () => this.updateState();
this.buildDom();
this.buildDom();
this.updateTheme();
this.updateState();
this.attachEvents();
}
private updateTheme() {
let theme = this.props.theme;
Svg.fill(this.display, theme.display);
Svg.fills(this.leds, theme.ledOn);
Svg.fills(this.ledsOuter, theme.ledOff);
Svg.fills(this.buttonsOuter.slice(0, 2), theme.buttonOuter);
Svg.fills(this.buttons.slice(0, 2), theme.buttonUp);
Svg.fill(this.buttonsOuter[2], theme.virtualButtonOuter);
Svg.fill(this.buttons[2], theme.virtualButtonUp);
Svg.fills(this.logos, theme.accent);
if (this.shakeButton) Svg.fill(this.shakeButton, theme.virtualButtonUp);
this.pinGradients.forEach(lg => Svg.setGradientColors(lg, theme.pin, theme.pinActive));
Svg.setGradientColors(this.lightLevelGradient, theme.lightLevelOn, theme.lightLevelOff);
Svg.setGradientColors(this.thermometerGradient, theme.ledOff, theme.ledOn);
svg.fill(this.display, theme.display);
svg.fills(this.leds, theme.ledOn);
svg.fills(this.ledsOuter, theme.ledOff);
svg.fills(this.buttonsOuter.slice(0, 2), theme.buttonOuter);
svg.fills(this.buttons.slice(0, 2), theme.buttonUp);
svg.fill(this.buttonsOuter[2], theme.virtualButtonOuter);
svg.fill(this.buttons[2], theme.virtualButtonUp);
svg.fills(this.logos, theme.accent);
if (this.shakeButton) svg.fill(this.shakeButton, theme.virtualButtonUp);
this.pinGradients.forEach(lg => svg.setGradientColors(lg, theme.pin, theme.pinActive));
svg.setGradientColors(this.lightLevelGradient, theme.lightLevelOn, theme.lightLevelOff);
svg.setGradientColors(this.thermometerGradient, theme.ledOff, theme.ledOn);
}
public updateState() {
let state = this.board;
if (!state) return;
let theme = this.props.theme;
state.buttons.forEach((btn, index) => {
Svg.fill(this.buttons[index], btn.pressed ? theme.buttonDown : theme.buttonUp);
svg.fill(this.buttons[index], btn.pressed ? theme.buttonDown : theme.buttonUp);
});
var bw = state.displayMode == pxsim.DisplayMode.bw
var img = state.image;
this.leds.forEach((led,i) => {
var sel = (<SVGStylable><any>led)
let bw = state.displayMode == pxsim.DisplayMode.bw
let img = state.image;
this.leds.forEach((led, i) => {
let sel = (<SVGStylable><any>led)
sel.style.opacity = ((bw ? img.data[i] > 0 ? 255 : 0 : img.data[i]) / 255.0) + "";
})
this.updatePins();
this.updateTilt();
this.updateHeading();
this.updateHeading();
this.updateLightLevel();
this.updateTemperature();
this.updateButtonAB();
this.updateGestures();
if (!runtime || runtime.dead) Svg.addClass(this.element, "grayscale");
else Svg.removeClass(this.element, "grayscale");
this.updateTemperature();
this.updateButtonAB();
this.updateGestures();
if (!runtime || runtime.dead) svg.addClass(this.element, "grayscale");
else svg.removeClass(this.element, "grayscale");
}
private updateGestures() {
let state = this.board;
if (state.useShake && !this.shakeButton) {
this.shakeButton = Svg.child(this.g, "circle", {cx:380, cy:100, r:16.5}) as SVGCircleElement;
Svg.fill(this.shakeButton, this.props.theme.virtualButtonUp)
this.shakeButton = svg.child(this.g, "circle", { cx: 380, cy: 100, r: 16.5 }) as SVGCircleElement;
svg.fill(this.shakeButton, this.props.theme.virtualButtonUp)
this.shakeButton.addEventListener(pointerEvents.down, ev => {
let state = this.board;
Svg.fill(this.shakeButton, this.props.theme.buttonDown);
svg.fill(this.shakeButton, this.props.theme.buttonDown);
})
this.shakeButton.addEventListener(pointerEvents.leave, ev => {
let state = this.board;
Svg.fill(this.shakeButton, this.props.theme.virtualButtonUp);
svg.fill(this.shakeButton, this.props.theme.virtualButtonUp);
})
this.shakeButton.addEventListener(pointerEvents.up, ev => {
let state = this.board;
Svg.fill(this.shakeButton, this.props.theme.virtualButtonUp);
svg.fill(this.shakeButton, this.props.theme.virtualButtonUp);
this.board.bus.queue(DAL.MICROBIT_ID_GESTURE, 11); // GESTURE_SHAKE
})
this.shakeText = Svg.child(this.g, "text", {x:400, y:110, class:'sim-text'}) as SVGTextElement;
this.shakeText.textContent = "SHAKE"
}
})
this.shakeText = svg.child(this.g, "text", { x: 400, y: 110, class: "sim-text" }) as SVGTextElement;
this.shakeText.textContent = "SHAKE"
}
}
private updateButtonAB() {
let state = this.board;
if (state.usesButtonAB && !this.buttonABText) {
(<any>this.buttonsOuter[2]).style.visibility = 'visible';
(<any>this.buttons[2]).style.visibility = 'visible';
this.buttonABText = Svg.child(this.g, "text", {class: 'sim-text', x:370, y:272 }) as SVGTextElement;
(<any>this.buttonsOuter[2]).style.visibility = "visible";
(<any>this.buttons[2]).style.visibility = "visible";
this.buttonABText = svg.child(this.g, "text", { class: "sim-text", x: 370, y: 272 }) as SVGTextElement;
this.buttonABText.textContent = "A+B";
this.updateTheme();
}
}
}
private updatePin(pin : Pin, index: number) {
private updatePin(pin: Pin, index: number) {
if (!pin) return;
let text = this.pinTexts[index];
let v = '';
let v = "";
if (pin.mode & PinMode.Analog) {
v = Math.floor(100 - (pin.value || 0) / 1023 * 100) + '%';
if(text) text.textContent = (pin.period ? "~" : "") + (pin.value || 0) + "";
v = Math.floor(100 - (pin.value || 0) / 1023 * 100) + "%";
if (text) text.textContent = (pin.period ? "~" : "") + (pin.value || 0) + "";
}
else if (pin.mode & PinMode.Digital) {
v = pin.value > 0 ? '0%' : '100%';
@ -196,48 +196,48 @@ namespace pxsim.micro_bit {
if (text) text.textContent = "";
} else {
v = '100%';
if(text) text.textContent = '';
if (text) text.textContent = '';
}
if (v) Svg.setGradientValue(this.pinGradients[index], v);
if (v) svg.setGradientValue(this.pinGradients[index], v);
}
private updateTemperature() {
let state = this.board;
if (!state || !state.usesTemperature) return;
let tmin = -5;
let tmax = 50;
if (!this.thermometer) {
if (!this.thermometer) {
let gid = "gradient-thermometer";
this.thermometerGradient = Svg.linearGradient(this.defs, gid);
this.thermometer = <SVGRectElement> Svg.child(this.g, "rect", {
class: "sim-thermometer",
x:120,
y:110,
width:20,
height:160,
rx:5, ry:5,
fill:`url(#${gid})`
this.thermometerGradient = svg.linearGradient(this.defs, gid);
this.thermometer = <SVGRectElement>svg.child(this.g, "rect", {
class: "sim-thermometer",
x: 120,
y: 110,
width: 20,
height: 160,
rx: 5, ry: 5,
fill: `url(#${gid})`
});
this.thermometerText = Svg.child(this.g, "text", { class:'sim-text', x:58, y:130}) as SVGTextElement;
this.thermometerText = svg.child(this.g, "text", { class: 'sim-text', x: 58, y: 130 }) as SVGTextElement;
this.updateTheme();
let pt = this.element.createSVGPoint();
Svg.buttonEvents(this.thermometer,
svg.buttonEvents(this.thermometer,
(ev) => {
let cur = Svg.cursorPoint(pt, this.element, ev);
let cur = svg.cursorPoint(pt, this.element, ev);
let t = Math.max(0, Math.min(1, (260 - cur.y) / 140))
state.temperature = Math.floor(tmin + t * (tmax-tmin));
state.temperature = Math.floor(tmin + t * (tmax - tmin));
this.updateTemperature();
}, ev => {}, ev => {})
}, ev => { }, ev => { })
}
let t = Math.max(tmin, Math.min(tmax, state.temperature))
let per = Math.floor((state.temperature - tmin) / (tmax-tmin)*100)
Svg.setGradientValue(this.thermometerGradient, 100 - per + '%');
let per = Math.floor((state.temperature - tmin) / (tmax - tmin) * 100)
svg.setGradientValue(this.thermometerGradient, 100 - per + '%');
this.thermometerText.textContent = t + '°C';
}
private updateHeading() {
let xc = 258;
let yc = 75;
@ -247,98 +247,99 @@ namespace pxsim.micro_bit {
let p = this.head.firstChild.nextSibling as SVGPathElement;
p.setAttribute("d", "m269.9,50.134647l0,0l-39.5,0l0,0c-14.1,0.1 -24.6,10.7 -24.6,24.8c0,13.9 10.4,24.4 24.3,24.7l0,0l39.6,0c14.2,0 40.36034,-22.97069 40.36034,-24.85394c0,-1.88326 -26.06034,-24.54606 -40.16034,-24.64606m-0.2,39l0,0l-39.3,0c-7.7,-0.1 -14,-6.4 -14,-14.2c0,-7.8 6.4,-14.2 14.2,-14.2l39.1,0c7.8,0 14.2,6.4 14.2,14.2c0,7.9 -6.4,14.2 -14.2,14.2l0,0l0,0z");
let pt = this.element.createSVGPoint();
Svg.buttonEvents(
svg.buttonEvents(
this.head,
(ev : MouseEvent) => {
let cur = Svg.cursorPoint(pt, this.element, ev);
state.heading = Math.floor(Math.atan2(cur.y - yc, cur.x - xc) * 180 / Math.PI+90);
if (state.heading < 0) state.heading += 360;
console.log('heading: ' + state.heading)
this.updateHeading();
(ev: MouseEvent) => {
let cur = svg.cursorPoint(pt, this.element, ev);
state.heading = Math.floor(Math.atan2(cur.y - yc, cur.x - xc) * 180 / Math.PI + 90);
if (state.heading < 0) state.heading += 360;
console.log('heading: ' + state.heading)
this.updateHeading();
});
this.headInitialized = true;
}
let txt = state.heading.toString() + '°';
if (txt != this.headText.textContent) {
Svg.rotateElement(this.head, xc, yc, state.heading+180);
if (txt != this.headText.textContent) {
svg.rotateElement(this.head, xc, yc, state.heading + 180);
this.headText.textContent = txt;
}
}
}
private lastFlashTime : number = 0;
private lastFlashTime: number = 0;
public flashSystemLed() {
if (!this.systemLed)
this.systemLed = <SVGCircleElement>Svg.child(this.g, "circle", {class:"sim-systemled", cx:300, cy:20, r:5})
this.systemLed = <SVGCircleElement>svg.child(this.g, "circle", { class: "sim-systemled", cx: 300, cy: 20, r: 5 })
let now = Date.now();
if (now - this.lastFlashTime > 150) {
this.lastFlashTime = now;
Svg.animate(this.systemLed, 'sim-flash')
svg.animate(this.systemLed, 'sim-flash')
}
}
private lastAntennaFlash : number = 0;
private lastAntennaFlash: number = 0;
public flashAntenna() {
if (!this.antenna) {
if (!this.antenna) {
let ax = 380;
let dax = 18;
let ayt = 10;
let ayb = 40;
this.antenna = <SVGPolylineElement>Svg.child(this.g, "polyline", { class:"sim-antenna", points: `${ax},${ayb} ${ax},${ayt} ${ax+=dax},${ayt} ${ax},${ayb} ${ax+=dax},${ayb} ${ax},${ayt} ${ax+=dax},${ayt} ${ax},${ayb} ${ax+=dax},${ayb} ${ax},${ayt} ${ax+=dax},${ayt}`})
this.antenna = <SVGPolylineElement>svg.child(this.g, "polyline", { class: "sim-antenna", points: `${ax},${ayb} ${ax},${ayt} ${ax += dax},${ayt} ${ax},${ayb} ${ax += dax},${ayb} ${ax},${ayt} ${ax += dax},${ayt} ${ax},${ayb} ${ax += dax},${ayb} ${ax},${ayt} ${ax += dax},${ayt}` })
}
let now = Date.now();
if (now - this.lastAntennaFlash > 200) {
this.lastAntennaFlash = now;
Svg.animate(this.antenna, 'sim-flash-stroke')
svg.animate(this.antenna, 'sim-flash-stroke')
}
}
private updatePins() {
let state = this.board;
if (!state) return;
state.pins.forEach((pin,i) => this.updatePin(pin,i));
}
state.pins.forEach((pin, i) => this.updatePin(pin, i));
}
private updateLightLevel() {
let state = this.board;
if (!state || !state.usesLightLevel) return;
if (!this.lightLevelButton) {
let gid= "gradient-light-level";
this.lightLevelGradient = Svg.linearGradient(this.defs, gid)
let gid = "gradient-light-level";
this.lightLevelGradient = svg.linearGradient(this.defs, gid)
let cy = 50;
let r = 35;
this.lightLevelButton = Svg.child(this.g, "circle", {
cx: `50px`, cy: `${cy}px`, r: `${r}px`,
class:'sim-light-level-button',
fill: `url(#${gid})` }) as SVGCircleElement;
this.lightLevelButton = svg.child(this.g, "circle", {
cx: `50px`, cy: `${cy}px`, r: `${r}px`,
class: 'sim-light-level-button',
fill: `url(#${gid})`
}) as SVGCircleElement;
let pt = this.element.createSVGPoint();
Svg.buttonEvents(this.lightLevelButton,
svg.buttonEvents(this.lightLevelButton,
(ev) => {
let pos = Svg.cursorPoint(pt, this.element, ev);
let rs = r/2;
let level = Math.max(0, Math.min(255, Math.floor((pos.y - (cy-rs)) / (2*rs) * 255)));
let pos = svg.cursorPoint(pt, this.element, ev);
let rs = r / 2;
let level = Math.max(0, Math.min(255, Math.floor((pos.y - (cy - rs)) / (2 * rs) * 255)));
if (level != this.board.lightLevel) {
this.board.lightLevel = level;
this.applyLightLevel();
}
}, ev => {},
ev => {})
this.lightLevelText = Svg.child(this.g, "text", { x:85, y:cy+r-5, text:'', class:'sim-text'}) as SVGTextElement;
}, ev => { },
ev => { })
this.lightLevelText = svg.child(this.g, "text", { x: 85, y: cy + r - 5, text: '', class: 'sim-text' }) as SVGTextElement;
this.updateTheme();
}
Svg.setGradientValue(this.lightLevelGradient, Math.min(100, Math.max(0, Math.floor(state.lightLevel * 100 / 255))) + '%')
}
svg.setGradientValue(this.lightLevelGradient, Math.min(100, Math.max(0, Math.floor(state.lightLevel * 100 / 255))) + '%')
this.lightLevelText.textContent = state.lightLevel.toString();
}
}
private applyLightLevel() {
let lv = this.board.lightLevel;
Svg.setGradientValue(this.lightLevelGradient, Math.min(100, Math.max(0, Math.floor(lv * 100 / 255))) + '%')
this.lightLevelText.textContent = lv.toString();
svg.setGradientValue(this.lightLevelGradient, Math.min(100, Math.max(0, Math.floor(lv * 100 / 255))) + '%')
this.lightLevelText.textContent = lv.toString();
}
private updateTilt() {
if (this.props.disableTilt) return;
let state = this.board;
@ -348,21 +349,22 @@ namespace pxsim.micro_bit {
let y = state.accelerometer.getY();
let af = 8 / 1023;
this.element.style.transform = "perspective(30em) rotateX(" + y*af + "deg) rotateY(" + x*af +"deg)"
this.element.style.transform = "perspective(30em) rotateX(" + y * af + "deg) rotateY(" + x * af + "deg)"
this.element.style.perspectiveOrigin = "50% 50% 50%";
this.element.style.perspective = "30em";
this.element.style.perspective = "30em";
}
private buildDom() {
this.element = <SVGSVGElement>Svg.elt("svg")
Svg.hydrate(this.element, {
"version": "1.0",
this.element = <SVGSVGElement>svg.elt("svg")
svg.hydrate(this.element, {
"version": "1.0",
"viewBox": "0 0 498 406",
"enable-background": "new 0 0 498 406",
"class":"sim",
"class": "sim",
"x": "0px",
"y": "0px"});
this.style = <SVGStyleElement>Svg.child(this.element, "style", {});
"y": "0px"
});
this.style = <SVGStyleElement>svg.child(this.element, "style", {});
this.style.textContent = `
svg.sim {
margin-bottom:1em;
@ -457,127 +459,127 @@ svg.sim.grayscale {
}
`;
this.defs = <SVGDefsElement>Svg.child(this.element, "defs", {});
this.g = Svg.elt("g");
this.defs = <SVGDefsElement>svg.child(this.element, "defs", {});
this.g = svg.elt("g");
this.element.appendChild(this.g);
// filters
let glow = Svg.child(this.defs, "filter", {id:"filterglow", x:"-5%", y:"-5%", width:"120%", height:"120%"});
Svg.child(glow, "feGaussianBlur", {stdDeviation:"5", result: "glow" });
let merge = Svg.child(glow, "feMerge", {});
for(let i=0;i<3;++i) Svg.child(merge, "feMergeNode", {in:"glow"})
let glow = svg.child(this.defs, "filter", { id: "filterglow", x: "-5%", y: "-5%", width: "120%", height: "120%" });
svg.child(glow, "feGaussianBlur", { stdDeviation: "5", result: "glow" });
let merge = svg.child(glow, "feMerge", {});
for (let i = 0; i < 3; ++i) svg.child(merge, "feMergeNode", { in: "glow" })
// outline
Svg.path(this.g, "sim-board", "M498,31.9C498,14.3,483.7,0,466.1,0H31.9C14.3,0,0,14.3,0,31.9v342.2C0,391.7,14.3,406,31.9,406h434.2c17.6,0,31.9-14.3,31.9-31.9V31.9z M14.3,206.7c-2.7,0-4.8-2.2-4.8-4.8c0-2.7,2.2-4.8,4.8-4.8c2.7,0,4.8,2.2,4.8,4.8C19.2,204.6,17,206.7,14.3,206.7z M486.2,206.7c-2.7,0-4.8-2.2-4.8-4.8c0-2.72.2-4.8,4.8-4.8c2.7,0,4.8,2.2,4.8,4.8C491,204.6,488.8,206.7,486.2,206.7z");
svg.path(this.g, "sim-board", "M498,31.9C498,14.3,483.7,0,466.1,0H31.9C14.3,0,0,14.3,0,31.9v342.2C0,391.7,14.3,406,31.9,406h434.2c17.6,0,31.9-14.3,31.9-31.9V31.9z M14.3,206.7c-2.7,0-4.8-2.2-4.8-4.8c0-2.7,2.2-4.8,4.8-4.8c2.7,0,4.8,2.2,4.8,4.8C19.2,204.6,17,206.7,14.3,206.7z M486.2,206.7c-2.7,0-4.8-2.2-4.8-4.8c0-2.72.2-4.8,4.8-4.8c2.7,0,4.8,2.2,4.8,4.8C491,204.6,488.8,206.7,486.2,206.7z");
// script background
this.display = Svg.path(this.g, "sim-display", "M333.8,310.3H165.9c-8.3,0-15-6.7-15-15V127.5c0-8.3,6.7-15,15-15h167.8c8.3,0,15,6.7,15,15v167.8C348.8,303.6,342.1,310.3,333.8,310.3z");
this.display = svg.path(this.g, "sim-display", "M333.8,310.3H165.9c-8.3,0-15-6.7-15-15V127.5c0-8.3,6.7-15,15-15h167.8c8.3,0,15,6.7,15,15v167.8C348.8,303.6,342.1,310.3,333.8,310.3z");
this.logos = [];
this.logos.push(Svg.child(this.g, "polygon", {class:"sim-theme", points:"115,56.7 173.1,0 115,0"}));
this.logos.push(Svg.path(this.g, "sim-theme", "M114.2,0H25.9C12.1,2.1,0,13.3,0,27.7v83.9L114.2,0z"));
this.logos.push(Svg.child(this.g, "polygon", {class:"sim-theme", points:"173,27.9 202.5,0 173,0"}));
this.logos.push(Svg.child(this.g, "polygon", {class:"sim-theme", points:"54.1,242.4 54.1,274.1 22.4,274.1"}));
this.logos.push(Svg.child(this.g, "polygon", {class:"sim-theme", points:"446.2,164.6 446.2,132.8 477.9,132.8"}));
this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "115,56.7 173.1,0 115,0" }));
this.logos.push(svg.path(this.g, "sim-theme", "M114.2,0H25.9C12.1,2.1,0,13.3,0,27.7v83.9L114.2,0z"));
this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "173,27.9 202.5,0 173,0" }));
this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "54.1,242.4 54.1,274.1 22.4,274.1" }));
this.logos.push(svg.child(this.g, "polygon", { class: "sim-theme", points: "446.2,164.6 446.2,132.8 477.9,132.8" }));
// leds
this.leds = [];
this.ledsOuter = [];
var left = 154, top = 113, ledoffw = 46, ledoffh = 44;
for (var i = 0; i < 5; ++i) {
var ledtop = i * ledoffh + top;
for (var j = 0; j < 5; ++j) {
var ledleft = j * ledoffw + left;
var k = i * 5 + j;
this.ledsOuter.push(Svg.child(this.g, "rect", { class:"sim-led-back", x:ledleft, y:ledtop, width:10, height:20, rx:2, ry:2 }));
this.leds.push(Svg.child(this.g, "rect", { class:"sim-led", x:ledleft-2, y:ledtop-2, width:14, height:24, rx:3, ry:3, title:`(${j},${i})`}));
let left = 154, top = 113, ledoffw = 46, ledoffh = 44;
for (let i = 0; i < 5; ++i) {
let ledtop = i * ledoffh + top;
for (let j = 0; j < 5; ++j) {
let ledleft = j * ledoffw + left;
let k = i * 5 + j;
this.ledsOuter.push(svg.child(this.g, "rect", { class: "sim-led-back", x: ledleft, y: ledtop, width: 10, height: 20, rx: 2, ry: 2 }));
this.leds.push(svg.child(this.g, "rect", { class: "sim-led", x: ledleft - 2, y: ledtop - 2, width: 14, height: 24, rx: 3, ry: 3, title: `(${j},${i})` }));
}
}
// head
this.head = <SVGGElement>Svg.child(this.g, "g", {});
Svg.child(this.head, "circle", { cx: 258, cy: 75, r: 100, fill:'transparent'})
this.logos.push(Svg.path(this.head, "sim-theme","M269.9,50.2L269.9,50.2l-39.5,0v0c-14.1,0.1-24.6,10.7-24.6,24.8c0,13.9,10.4,24.4,24.3,24.7v0h39.6c14.2,0,24.8-10.6,24.8-24.7C294.5,61,284,50.3,269.9,50.2 M269.7,89.2L269.7,89.2l-39.3,0c-7.7-0.1-14-6.4-14-14.2c0-7.8,6.4-14.2,14.2-14.2h39.1c7.8,0,14.2,6.4,14.2,14.2C283.9,82.9,277.5,89.2,269.7,89.2"));
this.logos.push(Svg.path(this.head, "sim-theme","M230.6,69.7c-2.9,0-5.3,2.4-5.3,5.3c0,2.9,2.4,5.3,5.3,5.3c2.9,0,5.3-2.4,5.3-5.3C235.9,72.1,233.5,69.7,230.6,69.7"));
this.logos.push(Svg.path(this.head, "sim-theme","M269.7,80.3c2.9,0,5.3-2.4,5.3-5.3c0-2.9-2.4-5.3-5.3-5.3c-2.9,0-5.3,2.4-5.3,5.3C264.4,77.9,266.8,80.3,269.7,80.3"));
this.headText = <SVGTextElement>Svg.child(this.g, "text", { x: 310, y: 100, class:'sim-text' })
this.head = <SVGGElement>svg.child(this.g, "g", {});
svg.child(this.head, "circle", { cx: 258, cy: 75, r: 100, fill: "transparent" })
this.logos.push(svg.path(this.head, "sim-theme", "M269.9,50.2L269.9,50.2l-39.5,0v0c-14.1,0.1-24.6,10.7-24.6,24.8c0,13.9,10.4,24.4,24.3,24.7v0h39.6c14.2,0,24.8-10.6,24.8-24.7C294.5,61,284,50.3,269.9,50.2 M269.7,89.2L269.7,89.2l-39.3,0c-7.7-0.1-14-6.4-14-14.2c0-7.8,6.4-14.2,14.2-14.2h39.1c7.8,0,14.2,6.4,14.2,14.2C283.9,82.9,277.5,89.2,269.7,89.2"));
this.logos.push(svg.path(this.head, "sim-theme", "M230.6,69.7c-2.9,0-5.3,2.4-5.3,5.3c0,2.9,2.4,5.3,5.3,5.3c2.9,0,5.3-2.4,5.3-5.3C235.9,72.1,233.5,69.7,230.6,69.7"));
this.logos.push(svg.path(this.head, "sim-theme", "M269.7,80.3c2.9,0,5.3-2.4,5.3-5.3c0-2.9-2.4-5.3-5.3-5.3c-2.9,0-5.3,2.4-5.3,5.3C264.4,77.9,266.8,80.3,269.7,80.3"));
this.headText = <SVGTextElement>svg.child(this.g, "text", { x: 310, y: 100, class: "sim-text" })
// https://www.microbit.co.uk/device/pins
// P0, P1, P2
this.pins = [
"M16.5,341.2c0,0.4-0.1,0.9-0.1,1.3v60.7c4.1,1.7,8.6,2.7,12.9,2.7h34.4v-64.7h0.3c0,0,0-0.1,0-0.1c0-13-10.6-23.6-23.7-23.6C27.2,317.6,16.5,328.1,16.5,341.2z M21.2,341.6c0-10.7,8.7-19.3,19.3-19.3c10.7,0,19.3,8.7,19.3,19.3c0,10.7-8.6,19.3-19.3,19.3C29.9,360.9,21.2,352.2,21.2,341.6z",
"M139.1,317.3c-12.8,0-22.1,10.3-23.1,23.1V406h46.2v-65.6C162.2,327.7,151.9,317.3,139.1,317.3zM139.3,360.1c-10.7,0-19.3-8.6-19.3-19.3c0-10.7,8.6-19.3,19.3-19.3c10.7,0,19.3,8.7,19.3,19.3C158.6,351.5,150,360.1,139.3,360.1z",
"M249,317.3c-12.8,0-22.1,10.3-23.1,23.1V406h46.2v-65.6C272.1,327.7,261.8,317.3,249,317.3z M249.4,360.1c-10.7,0-19.3-8.6-19.3-19.3c0-10.7,8.6-19.3,19.3-19.3c10.7,0,19.3,8.7,19.3,19.3C268.7,351.5,260.1,360.1,249.4,360.1z"
].map((p,pi) => Svg.path(this.g, "sim-pin sim-pin-touch", p, `P${pi}, ANALOG IN`));
].map((p, pi) => svg.path(this.g, "sim-pin sim-pin-touch", p, `P${pi}, ANALOG IN`));
// P3
this.pins.push(Svg.path(this.g, "sim-pin", "M0,357.7v19.2c0,10.8,6.2,20.2,14.4,25.2v-44.4H0z", "P3, ANALOG IN, LED Col 1"));
this.pins.push(svg.path(this.g, "sim-pin", "M0,357.7v19.2c0,10.8,6.2,20.2,14.4,25.2v-44.4H0z", "P3, ANALOG IN, LED Col 1"));
[66.7,79.1,91.4,103.7,164.3,176.6,188.9,201.3,213.6,275.2,287.5,299.8,312.1,324.5,385.1,397.4,409.7,422].forEach(x => {
this.pins.push(Svg.child(this.g, "rect", {x:x, y:356.7, width:10, height:50, class:"sim-pin"}));
[66.7, 79.1, 91.4, 103.7, 164.3, 176.6, 188.9, 201.3, 213.6, 275.2, 287.5, 299.8, 312.1, 324.5, 385.1, 397.4, 409.7, 422].forEach(x => {
this.pins.push(svg.child(this.g, "rect", { x: x, y: 356.7, width: 10, height: 50, class: "sim-pin" }));
})
Svg.title(this.pins[4], "P4, ANALOG IN, LED Col 2")
Svg.title(this.pins[5], "P5, BUTTON A")
Svg.title(this.pins[6], "P6, LED Col 9")
Svg.title(this.pins[7], "P7, LED Col 8")
Svg.title(this.pins[8], "P8")
Svg.title(this.pins[9], "P9, LED Col 7")
Svg.title(this.pins[10], "P10, ANALOG IN, LED Col 3")
Svg.title(this.pins[11], "P11, BUTTON B")
Svg.title(this.pins[12], "P12, RESERVED ACCESSIBILITY")
Svg.title(this.pins[13], "P13, SPI - SCK")
Svg.title(this.pins[14], "P14, SPI - MISO")
Svg.title(this.pins[15], "P15, SPI - MOSI")
Svg.title(this.pins[16], "P16, SPI - Chip Select")
Svg.title(this.pins[17], "P17, +3v3")
Svg.title(this.pins[18], "P18, +3v3")
Svg.title(this.pins[19], "P19, I2C - SCL")
Svg.title(this.pins[20], "P20, I2C - SDA")
Svg.title(this.pins[21], "GND")
this.pins.push(Svg.path(this.g, "sim-pin", "M483.6,402c8.2-5,14.4-14.4,14.4-25.1v-19.2h-14.4V402z", "GND"));
this.pins.push(Svg.path(this.g, "sim-pin", "M359.9,317.3c-12.8,0-22.1,10.3-23.1,23.1V406H383v-65.6C383,327.7,372.7,317.3,359.9,317.3z M360,360.1c-10.7,0-19.3-8.6-19.3-19.3c0-10.7,8.6-19.3,19.3-19.3c10.7,0,19.3,8.7,19.3,19.3C379.3,351.5,370.7,360.1,360,360.1z", "+3v3"));
this.pins.push(Svg.path(this.g, "sim-pin", "M458,317.6c-13,0-23.6,10.6-23.6,23.6c0,0,0,0.1,0,0.1h0V406H469c4.3,0,8.4-1,12.6-2.7v-60.7c0-0.4,0-0.9,0-1.3C481.6,328.1,471,317.6,458,317.6z M457.8,360.9c-10.7,0-19.3-8.6-19.3-19.3c0-10.7,8.6-19.3,19.3-19.3c10.7,0,19.3,8.7,19.3,19.3C477.1,352.2,468.4,360.9,457.8,360.9z", "GND"));
this.pinGradients = this.pins.map((pin,i) => {
let gid= "gradient-pin-" + i
let lg = Svg.linearGradient(this.defs, gid)
svg.title(this.pins[4], "P4, ANALOG IN, LED Col 2")
svg.title(this.pins[5], "P5, BUTTON A")
svg.title(this.pins[6], "P6, LED Col 9")
svg.title(this.pins[7], "P7, LED Col 8")
svg.title(this.pins[8], "P8")
svg.title(this.pins[9], "P9, LED Col 7")
svg.title(this.pins[10], "P10, ANALOG IN, LED Col 3")
svg.title(this.pins[11], "P11, BUTTON B")
svg.title(this.pins[12], "P12, RESERVED ACCESSIBILITY")
svg.title(this.pins[13], "P13, SPI - SCK")
svg.title(this.pins[14], "P14, SPI - MISO")
svg.title(this.pins[15], "P15, SPI - MOSI")
svg.title(this.pins[16], "P16, SPI - Chip Select")
svg.title(this.pins[17], "P17, +3v3")
svg.title(this.pins[18], "P18, +3v3")
svg.title(this.pins[19], "P19, I2C - SCL")
svg.title(this.pins[20], "P20, I2C - SDA")
svg.title(this.pins[21], "GND")
this.pins.push(svg.path(this.g, "sim-pin", "M483.6,402c8.2-5,14.4-14.4,14.4-25.1v-19.2h-14.4V402z", "GND"));
this.pins.push(svg.path(this.g, "sim-pin", "M359.9,317.3c-12.8,0-22.1,10.3-23.1,23.1V406H383v-65.6C383,327.7,372.7,317.3,359.9,317.3z M360,360.1c-10.7,0-19.3-8.6-19.3-19.3c0-10.7,8.6-19.3,19.3-19.3c10.7,0,19.3,8.7,19.3,19.3C379.3,351.5,370.7,360.1,360,360.1z", "+3v3"));
this.pins.push(svg.path(this.g, "sim-pin", "M458,317.6c-13,0-23.6,10.6-23.6,23.6c0,0,0,0.1,0,0.1h0V406H469c4.3,0,8.4-1,12.6-2.7v-60.7c0-0.4,0-0.9,0-1.3C481.6,328.1,471,317.6,458,317.6z M457.8,360.9c-10.7,0-19.3-8.6-19.3-19.3c0-10.7,8.6-19.3,19.3-19.3c10.7,0,19.3,8.7,19.3,19.3C477.1,352.2,468.4,360.9,457.8,360.9z", "GND"));
this.pinGradients = this.pins.map((pin, i) => {
let gid = "gradient-pin-" + i
let lg = svg.linearGradient(this.defs, gid)
pin.setAttribute("fill", `url(#${gid})`);
return lg;
})
this.pinTexts = [67,165,275].map(x => <SVGTextElement>Svg.child(this.g, "text", { class:'sim-text-pin', x:x, y:345}));
this.pinTexts = [67, 165, 275].map(x => <SVGTextElement>svg.child(this.g, "text", { class: 'sim-text-pin', x: x, y: 345 }));
this.buttonsOuter = []; this.buttons = [];
this.buttonsOuter.push(Svg.path(this.g, "sim-button-outer", "M82.1,232.6H25.9c-0.5,0-1-0.4-1-1v-56.2c0-0.5,0.4-1,1-1h56.2c0.5,0,1,0.4,1,1v56.2C83,232.2,82.6,232.6,82.1,232.6", "A"));
this.buttons.push(Svg.path(this.g, "sim-button", "M69.7,203.5c0,8.7-7,15.7-15.7,15.7s-15.7-7-15.7-15.7c0-8.7,7-15.7,15.7-15.7S69.7,194.9,69.7,203.5"));
this.buttonsOuter.push(Svg.path(this.g, "sim-button-outer", "M474.3,232.6h-56.2c-0.5,0-1-0.4-1-1v-56.2c0-0.5,0.4-1,1-1h56.2c0.5,0,1,0.4,1,1v56.2C475.3,232.2,474.8,232.6,474.3,232.6", "B"));
this.buttons.push(Svg.path(this.g, "sim-button", "M461.9,203.5c0,8.7-7,15.7-15.7,15.7c-8.7,0-15.7-7-15.7-15.7c0-8.7,7-15.7,15.7-15.7C454.9,187.8,461.9,194.9,461.9,203.5"));
this.buttonsOuter.push(Svg.child(this.g, "rect", {class:"sim-button-outer", x:417, y:250, width:58, height:58, rx:1, ry:1, title:"A+B"}));
this.buttons.push(Svg.child(this.g, "circle", {class:"sim-button", cx:446, cy:278, r:16.5}));
this.buttonsOuter.push(svg.path(this.g, "sim-button-outer", "M82.1,232.6H25.9c-0.5,0-1-0.4-1-1v-56.2c0-0.5,0.4-1,1-1h56.2c0.5,0,1,0.4,1,1v56.2C83,232.2,82.6,232.6,82.1,232.6", "A"));
this.buttons.push(svg.path(this.g, "sim-button", "M69.7,203.5c0,8.7-7,15.7-15.7,15.7s-15.7-7-15.7-15.7c0-8.7,7-15.7,15.7-15.7S69.7,194.9,69.7,203.5"));
this.buttonsOuter.push(svg.path(this.g, "sim-button-outer", "M474.3,232.6h-56.2c-0.5,0-1-0.4-1-1v-56.2c0-0.5,0.4-1,1-1h56.2c0.5,0,1,0.4,1,1v56.2C475.3,232.2,474.8,232.6,474.3,232.6", "B"));
this.buttons.push(svg.path(this.g, "sim-button", "M461.9,203.5c0,8.7-7,15.7-15.7,15.7c-8.7,0-15.7-7-15.7-15.7c0-8.7,7-15.7,15.7-15.7C454.9,187.8,461.9,194.9,461.9,203.5"));
this.buttonsOuter.push(svg.child(this.g, "rect", { class: "sim-button-outer", x: 417, y: 250, width: 58, height: 58, rx: 1, ry: 1, title: "A+B" }));
this.buttons.push(svg.child(this.g, "circle", { class: "sim-button", cx: 446, cy: 278, r: 16.5 }));
(<any>this.buttonsOuter[2]).style.visibility = 'hidden';
(<any>this.buttons[2]).style.visibility = 'hidden';
Svg.path(this.g, "sim-label", "M35.7,376.4c0-2.8,2.1-5.1,5.5-5.1c3.3,0,5.5,2.4,5.5,5.1v4.7c0,2.8-2.2,5.1-5.5,5.1c-3.3,0-5.5-2.4-5.5-5.1V376.4zM43.3,376.4c0-1.3-0.8-2.3-2.2-2.3c-1.3,0-2.1,1.1-2.1,2.3v4.7c0,1.2,0.8,2.3,2.1,2.3c1.3,0,2.2-1.1,2.2-2.3V376.4z");
Svg.path(this.g, "sim-label", "M136.2,374.1c2.8,0,3.4-0.8,3.4-2.5h2.9v14.3h-3.4v-9.5h-3V374.1z");
Svg.path(this.g, "sim-label", "M248.6,378.5c1.7-1,3-1.7,3-3.1c0-1.1-0.7-1.6-1.6-1.6c-1,0-1.8,0.6-1.8,2.1h-3.3c0-2.6,1.8-4.6,5.1-4.6c2.6,0,4.9,1.3,4.9,4.3c0,2.4-2.3,3.9-3.8,4.7c-2,1.3-2.5,1.8-2.5,2.9h6.1v2.7h-10C244.8,381.2,246.4,379.9,248.6,378.5z");
Svg.path(this.g, "sim-label", "M48.1,270.9l-0.6-1.7h-5.1l-0.6,1.7h-3.5l5.1-14.3h3.1l5.2,14.3H48.1z M45,260.7l-1.8,5.9h3.5L45,260.7z");
Svg.path(this.g, "sim-label", "M449.1,135.8h5.9c3.9,0,4.7,2.4,4.7,3.9c0,1.8-1.4,2.9-2.5,3.2c0.9,0,2.6,1.1,2.6,3.3c0,1.5-0.8,4-4.7,4h-6V135.8zM454.4,141.7c1.6,0,2-1,2-1.7c0-0.6-0.3-1.7-2-1.7h-2v3.4H454.4z M452.4,144.1v3.5h2.1c1.6,0,2-1,2-1.8c0-0.7-0.4-1.8-2-1.8H452.4z")
Svg.path(this.g, "sim-label", "M352.1,381.1c0,1.6,0.9,2.5,2.2,2.5c1.2,0,1.9-0.9,1.9-1.9c0-1.2-0.6-2-2.1-2h-1.3v-2.6h1.3c1.5,0,1.9-0.7,1.9-1.8c0-1.1-0.7-1.6-1.6-1.6c-1.4,0-1.8,0.8-1.8,2.1h-3.3c0-2.4,1.5-4.6,5.1-4.6c2.6,0,5,1.3,5,4c0,1.6-1,2.8-2.1,3.2c1.3,0.5,2.3,1.6,2.3,3.5c0,2.7-2.4,4.3-5.2,4.3c-3.5,0-5.5-2.1-5.5-5.1H352.1z")
Svg.path(this.g, "sim-label", "M368.5,385.9h-3.1l-5.1-14.3h3.5l3.1,10.1l3.1-10.1h3.6L368.5,385.9z")
Svg.path(this.g, "sim-label", "M444.4,378.3h7.4v2.5h-1.5c-0.6,3.3-3,5.5-7.1,5.5c-4.8,0-7.5-3.5-7.5-7.5c0-3.9,2.8-7.5,7.5-7.5c3.8,0,6.4,2.3,6.6,5h-3.5c-0.2-1.1-1.4-2.2-3.1-2.2c-2.7,0-4.1,2.3-4.1,4.7c0,2.5,1.4,4.7,4.4,4.7c2,0,3.2-1.2,3.4-2.7h-2.5V378.3z")
Svg.path(this.g, "sim-label", "M461.4,380.9v-9.3h3.3v14.3h-3.5l-5.2-9.2v9.2h-3.3v-14.3h3.5L461.4,380.9z")
Svg.path(this.g, "sim-label", "M472.7,371.6c4.8,0,7.5,3.5,7.5,7.2s-2.7,7.2-7.5,7.2h-5.3v-14.3H472.7z M470.8,374.4v8.6h1.8c2.7,0,4.2-2.1,4.2-4.3s-1.6-4.3-4.2-4.3H470.8z")
svg.path(this.g, "sim-label", "M35.7,376.4c0-2.8,2.1-5.1,5.5-5.1c3.3,0,5.5,2.4,5.5,5.1v4.7c0,2.8-2.2,5.1-5.5,5.1c-3.3,0-5.5-2.4-5.5-5.1V376.4zM43.3,376.4c0-1.3-0.8-2.3-2.2-2.3c-1.3,0-2.1,1.1-2.1,2.3v4.7c0,1.2,0.8,2.3,2.1,2.3c1.3,0,2.2-1.1,2.2-2.3V376.4z");
svg.path(this.g, "sim-label", "M136.2,374.1c2.8,0,3.4-0.8,3.4-2.5h2.9v14.3h-3.4v-9.5h-3V374.1z");
svg.path(this.g, "sim-label", "M248.6,378.5c1.7-1,3-1.7,3-3.1c0-1.1-0.7-1.6-1.6-1.6c-1,0-1.8,0.6-1.8,2.1h-3.3c0-2.6,1.8-4.6,5.1-4.6c2.6,0,4.9,1.3,4.9,4.3c0,2.4-2.3,3.9-3.8,4.7c-2,1.3-2.5,1.8-2.5,2.9h6.1v2.7h-10C244.8,381.2,246.4,379.9,248.6,378.5z");
svg.path(this.g, "sim-label", "M48.1,270.9l-0.6-1.7h-5.1l-0.6,1.7h-3.5l5.1-14.3h3.1l5.2,14.3H48.1z M45,260.7l-1.8,5.9h3.5L45,260.7z");
svg.path(this.g, "sim-label", "M449.1,135.8h5.9c3.9,0,4.7,2.4,4.7,3.9c0,1.8-1.4,2.9-2.5,3.2c0.9,0,2.6,1.1,2.6,3.3c0,1.5-0.8,4-4.7,4h-6V135.8zM454.4,141.7c1.6,0,2-1,2-1.7c0-0.6-0.3-1.7-2-1.7h-2v3.4H454.4z M452.4,144.1v3.5h2.1c1.6,0,2-1,2-1.8c0-0.7-0.4-1.8-2-1.8H452.4z")
svg.path(this.g, "sim-label", "M352.1,381.1c0,1.6,0.9,2.5,2.2,2.5c1.2,0,1.9-0.9,1.9-1.9c0-1.2-0.6-2-2.1-2h-1.3v-2.6h1.3c1.5,0,1.9-0.7,1.9-1.8c0-1.1-0.7-1.6-1.6-1.6c-1.4,0-1.8,0.8-1.8,2.1h-3.3c0-2.4,1.5-4.6,5.1-4.6c2.6,0,5,1.3,5,4c0,1.6-1,2.8-2.1,3.2c1.3,0.5,2.3,1.6,2.3,3.5c0,2.7-2.4,4.3-5.2,4.3c-3.5,0-5.5-2.1-5.5-5.1H352.1z")
svg.path(this.g, "sim-label", "M368.5,385.9h-3.1l-5.1-14.3h3.5l3.1,10.1l3.1-10.1h3.6L368.5,385.9z")
svg.path(this.g, "sim-label", "M444.4,378.3h7.4v2.5h-1.5c-0.6,3.3-3,5.5-7.1,5.5c-4.8,0-7.5-3.5-7.5-7.5c0-3.9,2.8-7.5,7.5-7.5c3.8,0,6.4,2.3,6.6,5h-3.5c-0.2-1.1-1.4-2.2-3.1-2.2c-2.7,0-4.1,2.3-4.1,4.7c0,2.5,1.4,4.7,4.4,4.7c2,0,3.2-1.2,3.4-2.7h-2.5V378.3z")
svg.path(this.g, "sim-label", "M461.4,380.9v-9.3h3.3v14.3h-3.5l-5.2-9.2v9.2h-3.3v-14.3h3.5L461.4,380.9z")
svg.path(this.g, "sim-label", "M472.7,371.6c4.8,0,7.5,3.5,7.5,7.2s-2.7,7.2-7.5,7.2h-5.3v-14.3H472.7z M470.8,374.4v8.6h1.8c2.7,0,4.2-2.1,4.2-4.3s-1.6-4.3-4.2-4.3H470.8z")
}
private attachEvents() {
Runtime.messagePosted = (msg) => {
switch(msg.type || '') {
switch (msg.type || '') {
case 'serial': this.flashSystemLed(); break;
case 'radiopacket': this.flashAntenna(); break;
}
@ -585,8 +587,8 @@ svg.sim.grayscale {
let tiltDecayer = 0;
this.element.addEventListener(pointerEvents.move, (ev: MouseEvent) => {
let state = this.board;
if (!state.accelerometer.isActive) return;
if (!state.accelerometer.isActive) return;
if (tiltDecayer) {
clearInterval(tiltDecayer);
tiltDecayer = 0;
@ -594,79 +596,79 @@ svg.sim.grayscale {
let ax = (ev.clientX - this.element.clientWidth / 2) / (this.element.clientWidth / 3);
let ay = (ev.clientY - this.element.clientHeight / 2) / (this.element.clientHeight / 3);
let x = - Math.max(- 1023, Math.min(1023, Math.floor(ax * 1023)));
let y = Math.max(- 1023, Math.min(1023, Math.floor(ay * 1023)));
let z2 = 1023*1023 - x * x - y * y;
let z = Math.floor((z2 > 0 ? -1 : 1)* Math.sqrt(Math.abs(z2)));
state.accelerometer.update(x,y,z);
let z2 = 1023 * 1023 - x * x - y * y;
let z = Math.floor((z2 > 0 ? -1 : 1) * Math.sqrt(Math.abs(z2)));
state.accelerometer.update(x, y, z);
this.updateTilt();
}, false);
this.element.addEventListener(pointerEvents.leave, (ev: MouseEvent) => {
let state = this.board;
if (!state.accelerometer.isActive) return;
if (!tiltDecayer) {
tiltDecayer = setInterval(() => {
let accx = state.accelerometer.getX(MicroBitCoordinateSystem.RAW);
accx = Math.floor(Math.abs(accx) * 0.85) * (accx > 0 ? 1 : -1);
let accy = state.accelerometer.getY(MicroBitCoordinateSystem.RAW);
accy = Math.floor(Math.abs(accy) * 0.85) * (accy > 0 ? 1 : -1);
let accz = -Math.sqrt(Math.max(0, 1023*1023 - accx*accx - accy*accy));
let accz = -Math.sqrt(Math.max(0, 1023 * 1023 - accx * accx - accy * accy));
if (Math.abs(accx) <= 24 && Math.abs(accy) <= 24) {
clearInterval(tiltDecayer);
tiltDecayer = 0;
clearInterval(tiltDecayer);
tiltDecayer = 0;
accx = 0;
accy = 0;
accz = -1023;
}
accz = -1023;
}
state.accelerometer.update(accx, accy, accz);
this.updateTilt();
}, 50)
this.updateTilt();
}, 50)
}
}, false);
this.pins.forEach((pin, index) => {
if (!this.board.pins[index]) return;
let pt = this.element.createSVGPoint();
Svg.buttonEvents(pin,
svg.buttonEvents(pin,
// move
ev => {
let state = this.board;
let pin = state.pins[index];
let svgpin = this.pins[index];
if (pin.mode & PinMode.Input) {
let cursor = Svg.cursorPoint(pt, this.element, ev);
let cursor = svg.cursorPoint(pt, this.element, ev);
let v = (400 - cursor.y) / 40 * 1023
pin.value = Math.max(0, Math.min(1023, Math.floor(v)));
}
this.updatePin(pin,index);
this.updatePin(pin, index);
},
// start
ev => {
let state = this.board;
let pin = state.pins[index];
let svgpin = this.pins[index];
Svg.addClass(svgpin, 'touched');
svg.addClass(svgpin, "touched");
if (pin.mode & PinMode.Input) {
let cursor = Svg.cursorPoint(pt, this.element, ev);
let cursor = svg.cursorPoint(pt, this.element, ev);
let v = (400 - cursor.y) / 40 * 1023
pin.value = Math.max(0, Math.min(1023, Math.floor(v)));
}
this.updatePin(pin,index);
this.updatePin(pin, index);
},
// stop
(ev: MouseEvent) => {
let state = this.board;
let pin = state.pins[index];
let svgpin = this.pins[index];
Svg.removeClass(svgpin, 'touched');
svg.removeClass(svgpin, "touched");
this.updatePin(pin, index);
return false;
});
});
})
this.pins.slice(0,3).forEach((btn, index) => {
this.pins.slice(0, 3).forEach((btn, index) => {
btn.addEventListener(pointerEvents.down, ev => {
let state = this.board;
state.pins[index].touched = true;
@ -682,56 +684,56 @@ svg.sim.grayscale {
state.pins[index].touched = false;
this.updatePin(state.pins[index], index);
this.board.bus.queue(state.pins[index].id, DAL.MICROBIT_BUTTON_EVT_CLICK);
})
})
})
this.buttonsOuter.slice(0,2).forEach((btn, index) => {
this.buttonsOuter.slice(0, 2).forEach((btn, index) => {
btn.addEventListener(pointerEvents.down, ev => {
let state = this.board;
state.buttons[index].pressed = true;
Svg.fill(this.buttons[index], this.props.theme.buttonDown);
svg.fill(this.buttons[index], this.props.theme.buttonDown);
})
btn.addEventListener(pointerEvents.leave, ev => {
let state = this.board;
state.buttons[index].pressed = false;
Svg.fill(this.buttons[index], this.props.theme.buttonUp);
svg.fill(this.buttons[index], this.props.theme.buttonUp);
})
btn.addEventListener(pointerEvents.up, ev => {
let state = this.board;
state.buttons[index].pressed = false;
Svg.fill(this.buttons[index], this.props.theme.buttonUp);
svg.fill(this.buttons[index], this.props.theme.buttonUp);
this.board.bus.queue(state.buttons[index].id, DAL.MICROBIT_BUTTON_EVT_CLICK);
})
})
this.buttonsOuter[2].addEventListener(pointerEvents.down, ev => {
let state = this.board;
state.buttons[0].pressed = true;
state.buttons[1].pressed = true;
state.buttons[2].pressed = true;
Svg.fill(this.buttons[0], this.props.theme.buttonDown);
Svg.fill(this.buttons[1], this.props.theme.buttonDown);
Svg.fill(this.buttons[2], this.props.theme.buttonDown);
})
let state = this.board;
state.buttons[0].pressed = true;
state.buttons[1].pressed = true;
state.buttons[2].pressed = true;
svg.fill(this.buttons[0], this.props.theme.buttonDown);
svg.fill(this.buttons[1], this.props.theme.buttonDown);
svg.fill(this.buttons[2], this.props.theme.buttonDown);
})
this.buttonsOuter[2].addEventListener(pointerEvents.leave, ev => {
let state = this.board;
state.buttons[0].pressed = false;
state.buttons[1].pressed = false;
state.buttons[2].pressed = false;
Svg.fill(this.buttons[0], this.props.theme.buttonUp);
Svg.fill(this.buttons[1], this.props.theme.buttonUp);
Svg.fill(this.buttons[2], this.props.theme.virtualButtonUp);
let state = this.board;
state.buttons[0].pressed = false;
state.buttons[1].pressed = false;
state.buttons[2].pressed = false;
svg.fill(this.buttons[0], this.props.theme.buttonUp);
svg.fill(this.buttons[1], this.props.theme.buttonUp);
svg.fill(this.buttons[2], this.props.theme.virtualButtonUp);
})
this.buttonsOuter[2].addEventListener(pointerEvents.up, ev => {
let state = this.board;
state.buttons[0].pressed = false;
state.buttons[1].pressed = false;
state.buttons[2].pressed = false;
Svg.fill(this.buttons[0], this.props.theme.buttonUp);
Svg.fill(this.buttons[1], this.props.theme.buttonUp);
Svg.fill(this.buttons[2], this.props.theme.virtualButtonUp);
this.board.bus.queue(state.buttons[2].id, DAL.MICROBIT_BUTTON_EVT_CLICK);
})
let state = this.board;
state.buttons[0].pressed = false;
state.buttons[1].pressed = false;
state.buttons[2].pressed = false;
svg.fill(this.buttons[0], this.props.theme.buttonUp);
svg.fill(this.buttons[1], this.props.theme.buttonUp);
svg.fill(this.buttons[2], this.props.theme.virtualButtonUp);
this.board.bus.queue(state.buttons[2].id, DAL.MICROBIT_BUTTON_EVT_CLICK);
})
}
}
}

View File

@ -511,7 +511,7 @@ namespace pxsim {
constructor() {
super()
this.id = "b" + Math.random().toString().slice(1);
this.id = "b" +Math_.random(2147483647);
this.animationQ = new AnimationQueue(runtime);
this.bus = new EventBus(runtime);
this.radio = new RadioBus(runtime);

56
tslint.json Normal file
View File

@ -0,0 +1,56 @@
{
"rules": {
"class-name": true,
"comment-format": [
true
],
"indent": [
true,
"spaces"
],
"no-duplicate-variable": true,
"no-eval": true,
"no-internal-module": true,
"no-trailing-whitespace": true,
"no-var-keyword": true,
"one-line": [
true,
"check-open-brace",
"check-whitespace"
],
"quotemark": [
true,
"double"
],
"semicolon": [
false,
"always"
],
"triple-equals": [
false,
"allow-null-check"
],
"typedef-whitespace": [
true,
{
"call-signature": "nospace",
"index-signature": "nospace",
"parameter": "nospace",
"property-declaration": "nospace",
"variable-declaration": "nospace"
}
],
"variable-name": [
true,
"ban-keywords"
],
"whitespace": [
true,
"check-branch",
"check-decl",
"check-operator",
"check-separator",
"check-type"
]
}
}

View File

@ -14,9 +14,9 @@
<Resource Language="x-generate" />
</Resources>
<Applications>
<Application Id="App" StartPage="https://codemicrobit.com/">
<Application Id="App" StartPage="https://m.pxt.io/">
<uap:ApplicationContentUriRules>
<uap:Rule Match="https://codemicrobit.com/" Type="include" WindowsRuntimeAccess="all" />
<uap:Rule Match="https://m.pxt.io/" Type="include" WindowsRuntimeAccess="all" />
</uap:ApplicationContentUriRules>
<uap:VisualElements DisplayName="code micro:bit" Description="Code editors for the BBC micro:bits" BackgroundColor="white" Square150x150Logo="images\Square150x150Logo.png" Square44x44Logo="images\Square44x44Logo.png">
<uap:DefaultTile Wide310x150Logo="images\Wide310x150Logo.png">
@ -27,7 +27,7 @@
<uap:Extension Category="windows.fileTypeAssociation">
<uap:FileTypeAssociation Name="microbithex">
<uap:DisplayName>BBC micro:bit binary file</uap:DisplayName>
<uap:InfoTip>.hex file created with codemicrobit.com or microbit.co.uk</uap:InfoTip>
<uap:InfoTip>.hex file created with m.pxt.io or microbit.co.uk</uap:InfoTip>
<uap:SupportedFileTypes>
<uap:FileType ContentType="application/x-microbit-hex">.hex</uap:FileType>
</uap:SupportedFileTypes>