diff --git a/.travis.yml b/.travis.yml index 4ec5a626..08b12ffb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,4 +13,5 @@ notifications: cache: directories: - node_modules + - built/cache diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..4da3dc3b --- /dev/null +++ b/.vscode/settings.json @@ -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" +} \ No newline at end of file diff --git a/README.md b/README.md index e0e0ed06..bba87180 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/docs/_locales/pl/_theme.json b/docs/_locales/pl/_theme.json new file mode 100644 index 00000000..c1e141f8 --- /dev/null +++ b/docs/_locales/pl/_theme.json @@ -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" + } + ] +} \ No newline at end of file diff --git a/docs/_locales/pl/docs.md b/docs/_locales/pl/docs.md new file mode 100644 index 00000000..4baddf36 --- /dev/null +++ b/docs/_locales/pl/docs.md @@ -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) diff --git a/docs/docs.md b/docs/docs.md index 5d5a4c01..4cbce65c 100644 --- a/docs/docs.md +++ b/docs/docs.md @@ -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++) diff --git a/docs/lessons.md b/docs/lessons.md index 45db03d8..f59dbb51 100644 --- a/docs/lessons.md +++ b/docs/lessons.md @@ -57,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 @@ -67,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) \ No newline at end of file diff --git a/docs/lessons/answering-machine/challenges.md b/docs/lessons/answering-machine/challenges.md index 0c047f8d..5116e590 100644 --- a/docs/lessons/answering-machine/challenges.md +++ b/docs/lessons/answering-machine/challenges.md @@ -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`. \ No newline at end of file diff --git a/docs/lessons/answering-machine/quiz-answers.md b/docs/lessons/answering-machine/quiz-answers.md index f37f04ae..eb89f62f 100644 --- a/docs/lessons/answering-machine/quiz-answers.md +++ b/docs/lessons/answering-machine/quiz-answers.md @@ -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") - ``` diff --git a/docs/lessons/beautiful-image/challenges.md b/docs/lessons/beautiful-image/challenges.md index e96a4736..802c8c76 100644 --- a/docs/lessons/beautiful-image/challenges.md +++ b/docs/lessons/beautiful-image/challenges.md @@ -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? diff --git a/docs/lessons/bop-it/quiz-answers.md b/docs/lessons/bop-it/quiz-answers.md index 852602bb..66033d7e 100644 --- a/docs/lessons/bop-it/quiz-answers.md +++ b/docs/lessons/bop-it/quiz-answers.md @@ -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 -
- -``` -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 -
- -``` +```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 -
- -``` +```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 -
- -``` +```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 -
- -``` +```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 -
- -``` +```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 -
- -``` +```blocks input.onLogoDown(() => { + let action = Math.random(3) if (action == 1) { game.addScore(1) } }) ``` - diff --git a/docs/lessons/catch-the-egg-game.md b/docs/lessons/catch-the-egg-game.md index 36ede269..079b6df5 100644 --- a/docs/lessons/catch-the-egg-game.md +++ b/docs/lessons/catch-the-egg-game.md @@ -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 diff --git a/docs/lessons/catch-the-egg-game/activity.md b/docs/lessons/catch-the-egg-game/activity.md index 61d29db4..e7479558 100644 --- a/docs/lessons/catch-the-egg-game/activity.md +++ b/docs/lessons/catch-the-egg-game/activity.md @@ -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: diff --git a/docs/lessons/catch-the-egg-game/tutorial.md b/docs/lessons/catch-the-egg-game/tutorial.md new file mode 100644 index 00000000..3c805b86 --- /dev/null +++ b/docs/lessons/catch-the-egg-game/tutorial.md @@ -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) +}) +``` diff --git a/docs/lessons/classic-beatbox/challenges.md b/docs/lessons/classic-beatbox/challenges.md index 97d7d8eb..03d081a2 100644 --- a/docs/lessons/classic-beatbox/challenges.md +++ b/docs/lessons/classic-beatbox/challenges.md @@ -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. diff --git a/docs/lessons/game-of-chance/challenges.md b/docs/lessons/game-of-chance/challenges.md index d0d39033..891301e1 100644 --- a/docs/lessons/game-of-chance/challenges.md +++ b/docs/lessons/game-of-chance/challenges.md @@ -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`. diff --git a/docs/lessons/glowing-pendulum.md b/docs/lessons/glowing-pendulum.md index 9fdcaccd..407aeb72 100644 --- a/docs/lessons/glowing-pendulum.md +++ b/docs/lessons/glowing-pendulum.md @@ -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) diff --git a/docs/lessons/glowing-pendulum/activity.md b/docs/lessons/glowing-pendulum/activity.md index 70845508..209a1a57 100644 --- a/docs/lessons/glowing-pendulum/activity.md +++ b/docs/lessons/glowing-pendulum/activity.md @@ -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 diff --git a/docs/lessons/glowing-pendulum/challenges.md b/docs/lessons/glowing-pendulum/challenges.md index 5784a661..420e36cb 100644 --- a/docs/lessons/glowing-pendulum/challenges.md +++ b/docs/lessons/glowing-pendulum/challenges.md @@ -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? diff --git a/docs/lessons/glowing-pendulum/tutorial.md b/docs/lessons/glowing-pendulum/tutorial.md new file mode 100644 index 00000000..1bc261d5 --- /dev/null +++ b/docs/lessons/glowing-pendulum/tutorial.md @@ -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) +}); +``` diff --git a/docs/lessons/guess-the-number.md b/docs/lessons/guess-the-number.md index 611bd482..7b825d5a 100644 --- a/docs/lessons/guess-the-number.md +++ b/docs/lessons/guess-the-number.md @@ -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) diff --git a/docs/lessons/guess-the-number/activity.md b/docs/lessons/guess-the-number/activity.md index a7e2fb4c..d6846948 100644 --- a/docs/lessons/guess-the-number/activity.md +++ b/docs/lessons/guess-the-number/activity.md @@ -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) }) diff --git a/docs/lessons/guess-the-number/tutorial.md b/docs/lessons/guess-the-number/tutorial.md new file mode 100644 index 00000000..3994e00d --- /dev/null +++ b/docs/lessons/guess-the-number/tutorial.md @@ -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) +}) +``` + diff --git a/docs/lessons/lucky-7/challenges.md b/docs/lessons/lucky-7/challenges.md index ec3e0eb2..2393c025 100644 --- a/docs/lessons/lucky-7/challenges.md +++ b/docs/lessons/lucky-7/challenges.md @@ -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... diff --git a/docs/lessons/magic-8.md b/docs/lessons/magic-8.md index 6a8430c1..32e0d573 100644 --- a/docs/lessons/magic-8.md +++ b/docs/lessons/magic-8.md @@ -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) diff --git a/docs/lessons/magic-8/activity.md b/docs/lessons/magic-8/activity.md index e087821e..00921bf2 100644 --- a/docs/lessons/magic-8/activity.md +++ b/docs/lessons/magic-8/activity.md @@ -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) diff --git a/docs/lessons/magic-8/challenges.md b/docs/lessons/magic-8/challenges.md index be4d71a2..859e8efb 100644 --- a/docs/lessons/magic-8/challenges.md +++ b/docs/lessons/magic-8/challenges.md @@ -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!". diff --git a/docs/lessons/magic-8/tutorial.md b/docs/lessons/magic-8/tutorial.md new file mode 100644 index 00000000..2e4b8291 --- /dev/null +++ b/docs/lessons/magic-8/tutorial.md @@ -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") + } +}) +``` diff --git a/docs/lessons/magic-logo/activity.md b/docs/lessons/magic-logo/activity.md index 1f32c4c8..005745f3 100644 --- a/docs/lessons/magic-logo/activity.md +++ b/docs/lessons/magic-logo/activity.md @@ -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! diff --git a/docs/lessons/night-light/challenges.md b/docs/lessons/night-light/challenges.md index 81917863..3187a914 100644 --- a/docs/lessons/night-light/challenges.md +++ b/docs/lessons/night-light/challenges.md @@ -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`. diff --git a/docs/lessons/night-light/offset-image/activity.md b/docs/lessons/night-light/offset-image/activity.md index f2ce36f7..32a04179 100644 --- a/docs/lessons/night-light/offset-image/activity.md +++ b/docs/lessons/night-light/offset-image/activity.md @@ -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`. diff --git a/docs/lessons/prank-wifi/activity.md b/docs/lessons/prank-wifi/activity.md index 6a5447ab..001a896d 100644 --- a/docs/lessons/prank-wifi/activity.md +++ b/docs/lessons/prank-wifi/activity.md @@ -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()`. diff --git a/docs/lessons/screen-wipe/challenges.md b/docs/lessons/screen-wipe/challenges.md index 7e5252a7..80a4f291 100644 --- a/docs/lessons/screen-wipe/challenges.md +++ b/docs/lessons/screen-wipe/challenges.md @@ -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". diff --git a/docs/lessons/truth-or-dare.md b/docs/lessons/truth-or-dare.md index 7dc14512..88f728ea 100644 --- a/docs/lessons/truth-or-dare.md +++ b/docs/lessons/truth-or-dare.md @@ -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) diff --git a/docs/lessons/truth-or-dare/tutorial.md b/docs/lessons/truth-or-dare/tutorial.md new file mode 100644 index 00000000..ad2d993f --- /dev/null +++ b/docs/lessons/truth-or-dare/tutorial.md @@ -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, () => {}); +``` + diff --git a/docs/libraries.md b/docs/libraries.md new file mode 100644 index 00000000..7738fecd --- /dev/null +++ b/docs/libraries.md @@ -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 + diff --git a/docs/microbit-reference.md b/docs/microbit-reference.md new file mode 100644 index 00000000..2feeb623 --- /dev/null +++ b/docs/microbit-reference.md @@ -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(() => { + +}); +``` diff --git a/docs/reference.md b/docs/reference.md index 01e17443..efaaecb4 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -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(() => { + +}); + diff --git a/docs/reference/basic.md b/docs/reference/basic.md index 461e1a63..de3627c8 100644 --- a/docs/reference/basic.md +++ b/docs/reference/basic.md @@ -2,7 +2,6 @@ Provides access to basic micro:bit functionality. - ```cards basic.showNumber(0); basic.showLeds(` diff --git a/docs/reference/control.md b/docs/reference/control.md index 652d1224..6fa4752f 100644 --- a/docs/reference/control.md +++ b/docs/reference/control.md @@ -1,7 +1,6 @@ # Control - - +Runtime and event utilities. ```cards control.inBackground(() => { diff --git a/docs/reference/game.md b/docs/reference/game.md index eaf9ddc2..17007641 100644 --- a/docs/reference/game.md +++ b/docs/reference/game.md @@ -1,7 +1,6 @@ # Game - - +A single-LED sprite game engine ```cards game.addScore(1); diff --git a/docs/reference/images.md b/docs/reference/images.md index d6f91ab2..fba69662 100644 --- a/docs/reference/images.md +++ b/docs/reference/images.md @@ -1,7 +1,6 @@ # Images - - +Creation, manipulation and display of LED images. ```cards images.createImage(` diff --git a/docs/reference/input.md b/docs/reference/input.md index 31a6bfd8..bd045b28 100644 --- a/docs/reference/input.md +++ b/docs/reference/input.md @@ -1,7 +1,6 @@ # Input - - +Events and data from sensors ```cards input.onButtonPressed(Button.A, () => { diff --git a/docs/reference/led.md b/docs/reference/led.md index 1cc520e3..15c5c06e 100644 --- a/docs/reference/led.md +++ b/docs/reference/led.md @@ -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(); diff --git a/docs/reference/music.md b/docs/reference/music.md index d91ad13b..29d27c1c 100644 --- a/docs/reference/music.md +++ b/docs/reference/music.md @@ -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); diff --git a/docs/reference/pins.md b/docs/reference/pins.md index fd9ee0ab..7f7f2c36 100644 --- a/docs/reference/pins.md +++ b/docs/reference/pins.md @@ -1,7 +1,6 @@ # Pins - - +Control currents in Pins for analog/digital signals, servos, i2c, ... ```cards pins.digitalReadPin(DigitalPin.P0); diff --git a/docs/reference/radio.md b/docs/reference/radio.md index 1212f72f..27773d86 100644 --- a/docs/reference/radio.md +++ b/docs/reference/radio.md @@ -1,7 +1,6 @@ # Radio - - +Communicate data using radio packets ```cards radio.sendNumber(0); diff --git a/docs/reference/serial.md b/docs/reference/serial.md index 24c47b69..e4a373d0 100644 --- a/docs/reference/serial.md +++ b/docs/reference/serial.md @@ -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); ``` diff --git a/docs/static/docslogo.svg b/docs/static/docslogo.svg deleted file mode 100644 index e2f5a912..00000000 --- a/docs/static/docslogo.svg +++ /dev/null @@ -1 +0,0 @@ -micro:bit logo \ No newline at end of file diff --git a/docs/static/favicon.png b/docs/static/favicon.png deleted file mode 100644 index ce57e080..00000000 Binary files a/docs/static/favicon.png and /dev/null differ diff --git a/docs/static/footerlogo.svg b/docs/static/footerlogo.svg deleted file mode 100644 index 0c0c4e1f..00000000 --- a/docs/static/footerlogo.svg +++ /dev/null @@ -1 +0,0 @@ -micro:bit logo \ No newline at end of file diff --git a/docs/static/logo.svg b/docs/static/logo.svg deleted file mode 100644 index 0c0c4e1f..00000000 --- a/docs/static/logo.svg +++ /dev/null @@ -1 +0,0 @@ -micro:bit logo \ No newline at end of file diff --git a/docs/static/logo128.png b/docs/static/logo128.png deleted file mode 100644 index 6070150a..00000000 Binary files a/docs/static/logo128.png and /dev/null differ diff --git a/docs/static/logo32.png b/docs/static/logo32.png deleted file mode 100644 index ce57e080..00000000 Binary files a/docs/static/logo32.png and /dev/null differ diff --git a/docs/static/logo512.png b/docs/static/logo512.png deleted file mode 100644 index 13cdc6c1..00000000 Binary files a/docs/static/logo512.png and /dev/null differ diff --git a/docs/static/microbit.docs.svg b/docs/static/microbit.docs.svg new file mode 100644 index 00000000..6392907d --- /dev/null +++ b/docs/static/microbit.docs.svg @@ -0,0 +1 @@ +(1,0)(3,0)(0,1)(2,1)(4,1)(0,2)(4,2)(1,3)(3,3)(2,4)P0, ANALOG INP1, ANALOG INP2, ANALOG INP3, ANALOG IN, LED Col 1P4, ANALOG IN, LED Col 2P5, BUTTON AP6, LED Col 9P7, LED Col 8P8P9, LED Col 7P10, ANALOG IN, LED Col 3P11, BUTTON BP12, RESERVED ACCESSIBILITYP13, SPI - SCKP14, SPI - MISOP15, SPI - MOSIP16, SPI - Chip SelectP17, +3v3P18, +3v3P19, I2C - SCLP20, I2C - SDAGNDGND+3v3GNDABA+B \ No newline at end of file diff --git a/docs/static/microbit.red.png b/docs/static/microbit.red.png new file mode 100644 index 00000000..9b2a5efa Binary files /dev/null and b/docs/static/microbit.red.png differ diff --git a/docs/static/microbit.red.square.png b/docs/static/microbit.red.square.png new file mode 100644 index 00000000..e896f5aa Binary files /dev/null and b/docs/static/microbit.red.square.png differ diff --git a/docs/static/microbit.red.svg b/docs/static/microbit.red.svg new file mode 100644 index 00000000..0ad2d248 --- /dev/null +++ b/docs/static/microbit.red.svg @@ -0,0 +1 @@ +(1,0)(3,0)(0,1)(2,1)(4,1)(0,2)(4,2)(1,3)(3,3)(2,4)P0, ANALOG INP1, ANALOG INP2, ANALOG INP3, ANALOG IN, LED Col 1P4, ANALOG IN, LED Col 2P5, BUTTON AP6, LED Col 9P7, LED Col 8P8P9, LED Col 7P10, ANALOG IN, LED Col 3P11, BUTTON BP12, RESERVED ACCESSIBILITYP13, SPI - SCKP14, SPI - MISOP15, SPI - MOSIP16, SPI - Chip SelectP17, +3v3P18, +3v3P19, I2C - SCLP20, I2C - SDAGNDGND+3v3GNDABA+B \ No newline at end of file diff --git a/docs/static/portraitlogo.svg b/docs/static/portraitlogo.svg deleted file mode 100644 index 542afec7..00000000 --- a/docs/static/portraitlogo.svg +++ /dev/null @@ -1 +0,0 @@ -micro:bit logo \ No newline at end of file diff --git a/docs/static/splashscreen.svg b/docs/static/splashscreen.svg deleted file mode 100644 index 02a16ad8..00000000 --- a/docs/static/splashscreen.svg +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - micro:bit logo - - - diff --git a/docs/static/squarelogo.svg b/docs/static/squarelogo.svg deleted file mode 100644 index ceaf41af..00000000 --- a/docs/static/squarelogo.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - micro:bit logo - - - diff --git a/docs/thank-you.md b/docs/thank-you.md new file mode 100644 index 00000000..ccb01fd3 --- /dev/null +++ b/docs/thank-you.md @@ -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. diff --git a/libs/i2c-fram/fram.ts b/libs/i2c-fram/fram.ts index 21366aee..2bf372ab 100644 --- a/libs/i2c-fram/fram.ts +++ b/libs/i2c-fram/fram.ts @@ -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) diff --git a/libs/microbit-radio/radio.cpp b/libs/microbit-radio/radio.cpp index d35ec0a8..836b9a7e 100644 --- a/libs/microbit-radio/radio.cpp +++ b/libs/microbit-radio/radio.cpp @@ -2,6 +2,8 @@ using namespace pxt; +#define RADIO_VALUE_PACKET_TYPE 24641622 + //% color=270 weight=34 namespace radio { @@ -39,13 +41,79 @@ namespace radio { * Broadcasts 4 numbers over radio to any connected micro:bit in the group. */ //% help=radio/send-numbers - //% weight=59 + //% weight=59 debug=true //% blockId=radio_datagram_send_numbers block="send numbers|0: %VALUE0|1: %VALUE1|2: %VALUE2|3: %VALUE3" void sendNumbers(int value_0, int value_1, int value_2, int value_3) { if (radioEnable() != MICROBIT_OK) return; int buf[] = { value_0, value_1, value_2, value_3 }; uBit.radio.datagram.send((uint8_t*)buf, 4*sizeof(int)); } + + /** + * 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/send-value + //% weight=4 debug=true + //% blockId=radio_datagram_send_value block="send|value %name|= %value" + void sendValue(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 debug=true + 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. @@ -63,7 +131,7 @@ namespace radio { * @param index index of the number to read from 0 to 3. 1 eg */ //% help=radio/received-number-at - //% weight=45 + //% weight=45 debug=true //% blockId=radio_datagram_received_number_at block="receive number|at %VALUE" blockGap=8 int receivedNumberAt(int index) { if (radioEnable() != MICROBIT_OK) return 0; diff --git a/libs/microbit-radio/shims.d.ts b/libs/microbit-radio/shims.d.ts index 781088c9..02ce7354 100644 --- a/libs/microbit-radio/shims.d.ts +++ b/libs/microbit-radio/shims.d.ts @@ -9,10 +9,29 @@ declare namespace radio { * Broadcasts 4 numbers over radio to any connected micro:bit in the group. */ //% help=radio/send-numbers - //% weight=59 + //% weight=59 debug=true //% 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/send-value + //% weight=4 debug=true + //% blockId=radio_datagram_send_value block="send|value %name|= %value" shim=radio::sendValue + function sendValue(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 debug=true shim=radio::readValueToSerial + function readValueToSerial(): void; + /** * Registers code to run when a packet is received over radio. */ @@ -26,7 +45,7 @@ declare namespace radio { * @param index index of the number to read from 0 to 3. 1 eg */ //% help=radio/received-number-at - //% weight=45 + //% weight=45 debug=true //% blockId=radio_datagram_received_number_at block="receive number|at %VALUE" blockGap=8 shim=radio::receivedNumberAt function receivedNumberAt(index: number): number; diff --git a/libs/microbit/_locales/microbit-strings.json b/libs/microbit/_locales/microbit-strings.json new file mode 100644 index 00000000..3851926c --- /dev/null +++ b/libs/microbit/_locales/microbit-strings.json @@ -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." +} \ No newline at end of file diff --git a/package.json b/package.json index c32005d8..8e779d4e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "pxt-microbit", - "version": "0.2.95", + "version": "0.2.109", "description": "BBC micro:bit target for PXT", "keywords": [ "JavaScript", @@ -29,6 +29,6 @@ "typescript": "^1.8.7" }, "dependencies": { - "pxt-core": "0.2.106" + "pxt-core": "0.2.121" } } diff --git a/pxtarget.json b/pxtarget.json index 51ccb3bb..58b5d30a 100644 --- a/pxtarget.json +++ b/pxtarget.json @@ -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": "Hello!", - "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": { @@ -63,7 +59,8 @@ "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.docs.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": [ diff --git a/sim/libmbit.ts b/sim/libmbit.ts index 2d3979be..fbe0557f 100644 --- a/sim/libmbit.ts +++ b/sim/libmbit.ts @@ -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,19 +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'); + return parseInt(b && b.id + ? b.id.slice(1) + : "42"); } export function onEvent(id: number, evid: number, handler: RefAction) { @@ -306,7 +306,7 @@ namespace pxsim.input { export function compassHeading(): number { - var b = board(); + let b = board(); if (!b.usesHeading) { b.usesHeading = true; runtime.queueDisplayUpdate(); @@ -315,7 +315,7 @@ namespace pxsim.input { } export function temperature(): number { - var b = board(); + let b = board(); if (!b.usesTemperature) { b.usesTemperature = true; runtime.queueDisplayUpdate(); @@ -453,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]; } @@ -565,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); } @@ -595,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; diff --git a/sim/simsvg.ts b/sim/simsvg.ts index 9b01b16a..ffe1ca4b 100644 --- a/sim/simsvg.ts +++ b/sim/simsvg.ts @@ -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 = (led) + + let bw = state.displayMode == pxsim.DisplayMode.bw + let img = state.image; + this.leds.forEach((led, i) => { + let sel = (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) { - (this.buttonsOuter[2]).style.visibility = 'visible'; - (this.buttons[2]).style.visibility = 'visible'; - this.buttonABText = Svg.child(this.g, "text", {class: 'sim-text', x:370, y:272 }) as SVGTextElement; + (this.buttonsOuter[2]).style.visibility = "visible"; + (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 = 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 = 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 = Svg.child(this.g, "circle", {class:"sim-systemled", cx:300, cy:20, r:5}) + this.systemLed = 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 = 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 = 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 = Svg.elt("svg") - Svg.hydrate(this.element, { - "version": "1.0", + this.element = 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 = Svg.child(this.element, "style", {}); + "y": "0px" + }); + this.style = svg.child(this.element, "style", {}); this.style.textContent = ` svg.sim { margin-bottom:1em; @@ -457,127 +459,127 @@ svg.sim.grayscale { } `; - - - this.defs = Svg.child(this.element, "defs", {}); - this.g = Svg.elt("g"); + + + this.defs = 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 = 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 = Svg.child(this.g, "text", { x: 310, y: 100, class:'sim-text' }) - + this.head = 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 = 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 => Svg.child(this.g, "text", { class:'sim-text-pin', x:x, y:345})); + + this.pinTexts = [67, 165, 275].map(x => 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 })); (this.buttonsOuter[2]).style.visibility = 'hidden'; (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); + }) } } } \ No newline at end of file diff --git a/tslint.json b/tslint.json new file mode 100644 index 00000000..6d9bd5e2 --- /dev/null +++ b/tslint.json @@ -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" + ] + } +} \ No newline at end of file diff --git a/win10/app.sln b/win10/app.sln index a6d15e1f..7d514686 100644 --- a/win10/app.sln +++ b/win10/app.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.25123.0 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{262852C6-CD72-467D-83FE-5EEB1973A190}") = "codemicrobit", "app\codemicrobit.jsproj", "{39122940-AB16-4CD4-A0CE-79A3EB863ECF}" +Project("{262852C6-CD72-467D-83FE-5EEB1973A190}") = "m.pxt.io", "app\m.pxt.io.jsproj", "{39122940-AB16-4CD4-A0CE-79A3EB863ECF}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/win10/app/AppPackages/latest/codemicrobit_0.1.3.0_AnyCPU_Debug.appxbundle b/win10/app/AppPackages/latest/codemicrobit_0.1.3.0_AnyCPU_Debug.appxbundle deleted file mode 100644 index 8cb96d6d..00000000 Binary files a/win10/app/AppPackages/latest/codemicrobit_0.1.3.0_AnyCPU_Debug.appxbundle and /dev/null differ diff --git a/win10/app/AppPackages/latest/m.pxt.io_0.1.4.0_AnyCPU_Debug.appxbundle b/win10/app/AppPackages/latest/m.pxt.io_0.1.4.0_AnyCPU_Debug.appxbundle new file mode 100644 index 00000000..70a1ae51 Binary files /dev/null and b/win10/app/AppPackages/latest/m.pxt.io_0.1.4.0_AnyCPU_Debug.appxbundle differ diff --git a/win10/app/AppPackages/latest/codemicrobit_0.1.3.0_AnyCPU_Debug.cer b/win10/app/AppPackages/latest/m.pxt.io_0.1.4.0_AnyCPU_Debug.cer similarity index 100% rename from win10/app/AppPackages/latest/codemicrobit_0.1.3.0_AnyCPU_Debug.cer rename to win10/app/AppPackages/latest/m.pxt.io_0.1.4.0_AnyCPU_Debug.cer diff --git a/win10/app/BundleArtifacts/neutral.txt b/win10/app/BundleArtifacts/neutral.txt index 0b4549f7..dec77c29 100644 --- a/win10/app/BundleArtifacts/neutral.txt +++ b/win10/app/BundleArtifacts/neutral.txt @@ -1 +1 @@ -MainPackage=C:\gh\pxt-microbit\win10\app\bin\Debug\codemicrobit_0.1.3.0_AnyCPU_Debug.appx +MainPackage=C:\gh\pxt-microbit\win10\app\bin\Debug\m.pxt.io_0.1.4.0_AnyCPU_Debug.appx diff --git a/win10/app/images/LockScreenLogo.scale-200.png b/win10/app/images/LockScreenLogo.scale-200.png index 329113c5..ed9a4ef5 100644 Binary files a/win10/app/images/LockScreenLogo.scale-200.png and b/win10/app/images/LockScreenLogo.scale-200.png differ diff --git a/win10/app/images/SplashScreen.scale-200.png b/win10/app/images/SplashScreen.scale-200.png index ee0de0e3..9fdfc904 100644 Binary files a/win10/app/images/SplashScreen.scale-200.png and b/win10/app/images/SplashScreen.scale-200.png differ diff --git a/win10/app/images/Square150x150Logo.scale-200.png b/win10/app/images/Square150x150Logo.scale-200.png index 6f57f0e1..c879f5f6 100644 Binary files a/win10/app/images/Square150x150Logo.scale-200.png and b/win10/app/images/Square150x150Logo.scale-200.png differ diff --git a/win10/app/images/Square44x44Logo.scale-200.png b/win10/app/images/Square44x44Logo.scale-200.png index bdb80cd1..339d7e1b 100644 Binary files a/win10/app/images/Square44x44Logo.scale-200.png and b/win10/app/images/Square44x44Logo.scale-200.png differ diff --git a/win10/app/images/Square44x44Logo.targetsize-24_altform-unplated.png b/win10/app/images/Square44x44Logo.targetsize-24_altform-unplated.png index d76526e0..285bf05c 100644 Binary files a/win10/app/images/Square44x44Logo.targetsize-24_altform-unplated.png and b/win10/app/images/Square44x44Logo.targetsize-24_altform-unplated.png differ diff --git a/win10/app/images/StoreLogo.png b/win10/app/images/StoreLogo.png index a8ec2c5c..fffe2f1a 100644 Binary files a/win10/app/images/StoreLogo.png and b/win10/app/images/StoreLogo.png differ diff --git a/win10/app/images/Wide310x150Logo.scale-200.png b/win10/app/images/Wide310x150Logo.scale-200.png index f37e6f6d..816b48e1 100644 Binary files a/win10/app/images/Wide310x150Logo.scale-200.png and b/win10/app/images/Wide310x150Logo.scale-200.png differ diff --git a/win10/app/codemicrobit.jsproj b/win10/app/m.pxt.io.jsproj similarity index 100% rename from win10/app/codemicrobit.jsproj rename to win10/app/m.pxt.io.jsproj diff --git a/win10/app/package.appxmanifest b/win10/app/package.appxmanifest index 128dd462..765c72d4 100644 --- a/win10/app/package.appxmanifest +++ b/win10/app/package.appxmanifest @@ -1,6 +1,6 @@  - + codemicrobitapp @@ -14,12 +14,12 @@ - + - + - - + + @@ -27,7 +27,7 @@ BBC micro:bit binary file - .hex file created with codemicrobit.com or microbit.co.uk + .hex file created with m.pxt.io or microbit.co.uk .hex