Compare commits

...

40 Commits

Author SHA1 Message Date
2475058b94 0.4.22 2016-10-01 15:45:43 -07:00
c6ee0db81c Bump pxt-core to 0.4.39 2016-10-01 15:45:41 -07:00
1b96e6332a 0.4.21 2016-10-01 21:02:36 +02:00
1ceec1d3b4 0.4.20 2016-10-01 20:59:44 +02:00
2e9ddb48df 0.4.19 2016-10-01 20:58:45 +02:00
2296220ad7 updated logos 2016-09-29 16:23:37 -07:00
22864bd26a pointing to cloud compile service 2016-09-29 16:13:33 -07:00
574a9e01d5 updating pinmap 2016-09-29 15:25:57 -07:00
00278036a4 fixing pin mapping 2016-09-29 15:20:45 -07:00
4b583e221b limited support for RGB led 2016-09-27 13:35:48 -07:00
c88645d0cd support for AB / Shake buttons 2016-09-27 11:00:21 -07:00
14e8eabd25 updated simulator ratio, domain names 2016-09-27 09:35:52 -07:00
5fab789763 merging microbit 2016-09-26 22:00:04 -07:00
2c39e249f9 New guitar project (#264) 2016-09-26 21:55:39 -07:00
c486a9db94 0.4.19 2016-09-26 16:31:02 -07:00
816438fa79 Bump pxt-core to 0.4.26 2016-09-26 16:30:58 -07:00
33eca3c507 tweaked colors 2016-09-26 15:10:37 -07:00
9ccfcf19d9 initial round of visual updates 2016-09-26 15:05:06 -07:00
5edd06c9b9 migrating instruction generation logic to pxt 2016-09-26 13:26:43 -07:00
a114dc32e7 Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2016-09-26 10:00:13 -07:00
019bc34d90 Fixing hover text /help window for blocks are not correct 2016-09-26 09:59:52 -07:00
0676d780ab Fixing beat fraction typo (#263) 2016-09-23 22:27:57 -07:00
96e23d99b2 Merge pull request #261 from Microsoft/note_fix
Add annotation to Note.C in music enum
2016-09-23 12:56:41 -07:00
15b1f95394 Add annotation to Note.C in music enum 2016-09-22 14:36:37 -07:00
552b0d8165 0.4.18 2016-09-22 03:56:03 -07:00
faed492a87 Embed docs (#259)
* Generic instructions for embedding

* Wordpress instructions, update Markdown instructions

* Blogger instructions

* Squarespace instructions

* Google sites info

* Sway restrictions

* Correct order
2016-09-22 03:50:59 -07:00
0ce1738653 Remove comment re Safari in private mode 2016-09-22 09:27:46 +01:00
f5cabe6e94 0.4.17 2016-09-21 22:30:10 -07:00
f2e7a640f1 Bump pxt-core to 0.4.25 2016-09-21 22:30:08 -07:00
7fb057af66 0.4.16 2016-09-21 22:14:40 -07:00
c0b9329401 Bump pxt-core to 0.4.24 2016-09-21 22:14:33 -07:00
c04ddbb459 Merge branch 'master' of https://github.com/Microsoft/pxt-microbit 2016-09-21 16:34:06 -07:00
4aac4ef92d Fixing hero lesson 2016-09-21 16:31:03 -07:00
979b2b892a avoid name collision (embed.md => share.md) 2016-09-21 15:01:43 -07:00
4c3f9910f7 0.4.15 2016-09-21 10:55:54 -07:00
9aef584966 Bump pxt-core to 0.4.21 2016-09-21 10:55:52 -07:00
e62d15ba85 Embed docs (#257)
* embed docs

* adding embed docs
2016-09-21 10:15:59 -07:00
adf97d9b5c Add information about Safari being unsupported in private browsing mode 2016-09-21 11:23:43 +01:00
2bb6c6ae27 0.4.14 2016-09-20 22:56:14 -07:00
0919eff0c5 Bump pxt-core to 0.4.18 2016-09-20 22:56:12 -07:00
59 changed files with 2934 additions and 915 deletions

View File

@ -21,6 +21,7 @@
### More questions?
* [Frequently Asked Question](/faq)
* [Embedding project](/share)
* [Help Translate](/translate)
* [Release notes](/release-notes)

View File

@ -18,7 +18,8 @@ to reopen your latest project. You can also open previous project stored locally
The project source is also stored in each compiled ``.hex`` file. Drag and drop the ``.hex`` file into the web editor to load the project.
To share your project with others, you can use the **Embed** feature. It stores your project in the cloud and creates a URL that you can share with others.
To share your project with others, you can use the [Embed Project...](/share).
It stores your project in the cloud and creates a URL that you can share with others.
If you are using [Visual Studio Code](/code), all your programs are stored as files on your computer and you can use your favorite source control system as needed.

View File

@ -1,13 +1,13 @@
# happy birthday blocks activity
Play sounds with music blocks.
Play sounds with music blocks.
Have you ever tried to play a song on an instrument? Let's try coding the song "Happy Birthday" on the micro:bit !
Let's start by adding the code in the music drawer that includes a single musical chord (or pitched sound) with the `play` block. Then insert the chord "C". Once you are done coding, don't forget to run your code in the simulator or the micro:bit.
```blocks
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
```
* click run to see if the code works as expected.
@ -15,12 +15,12 @@ music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
We want to continue to adding musical chords with the `play` block. So insert the appropriate chord blocks: `D`, `F`, `G` to complete the first part of the song. Modify your code so that your code looks like this.
```blocks
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.E), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.E), music.beat(BeatFraction.Quarter));
basic.pause(100);
```
@ -29,19 +29,19 @@ basic.pause(100);
We want to continue to adding musical chords with the `play` block. Then insert the appropriate chords: `B`, `C`, `D`, `E` , `F` to complete the second part of the song. Modify your code so that your code looks like this.
```blocks
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.E), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.E), music.beat(BeatFraction.Quarter));
basic.pause(100);
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.G), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.G), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quarter));
basic.pause(100);
```

View File

@ -8,19 +8,19 @@ Complete the [happy birthday](/lessons/happy-birthday/activity) activity and you
```blocks
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.E), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.E), music.beat(BeatFraction.Quarter));
basic.pause(100);
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.G), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.G), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quarter));
basic.pause(100);
@ -35,26 +35,26 @@ Let's code the third part of Happy Birthday!
To do this, you need to add blocks after the last line of the `play` blocks. We want to continue to adding musical chords with the `play` block. Then insert the appropriate chord blocks `G`, `E`, `C`, `B`, `A` to complete the third part of the song. Modify your code so that your code looks like this.
```blocks
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.E), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.E), music.beat(BeatFraction.Quarter));
basic.pause(100);
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.G), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.G), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quarter));
basic.pause(100);
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.A), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.E), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.A), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.E), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quarter));
basic.pause(100);
```
@ -66,33 +66,33 @@ Finally, we continue to adding the appropriate `play` block and fit the followin
```blocks
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.E), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.E), music.beat(BeatFraction.Quarter));
basic.pause(100);
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.G), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.G), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quarter));
basic.pause(100);
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.A), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.E), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.C), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.A), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.E), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.D), music.beat(BeatFraction.Quarter));
basic.pause(100);
music.playTone(music.noteFrequency(Note.A), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.A), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.B), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.G), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quater));
music.playTone(music.noteFrequency(Note.A), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.A), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.B), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.G), music.beat(BeatFraction.Quarter));
music.playTone(music.noteFrequency(Note.F), music.beat(BeatFraction.Quarter));
```

View File

@ -44,7 +44,7 @@ let hero = game.createSprite(2, 2);
let food = game.createSprite(4, 4);
let ghost = game.createSprite(0, 0);
ghost.change(LedSpriteProperty.Blink, 100);
food = led.brightness() == 8;
food.set(LedSpriteProperty.Brightness, 8);
```
@ -56,7 +56,7 @@ let hero = game.createSprite(2, 2);
let food = game.createSprite(4, 4);
let ghost = game.createSprite(0, 0);
ghost.change(LedSpriteProperty.Blink, 100);
food = led.brightness() == 8;
food.set(LedSpriteProperty.Brightness, 8);
while (true) {
basic.pause(400);
}
@ -73,7 +73,7 @@ let hero = game.createSprite(2, 2);
let food = game.createSprite(4, 4);
let ghost = game.createSprite(0, 0);
ghost.change(LedSpriteProperty.Blink, 100);
food = led.brightness() == 8;
food.set(LedSpriteProperty.Brightness, 8);
while (true) {
basic.pause(400);
if (ghost.get(LedSpriteProperty.X) < hero.get(LedSpriteProperty.X)) {
@ -99,7 +99,7 @@ let hero = game.createSprite(2, 2);
let food = game.createSprite(4, 4);
let ghost = game.createSprite(0, 0);
ghost.change(LedSpriteProperty.Blink, 100);
food = led.brightness() == 8;
food.set(LedSpriteProperty.Brightness, 8);
while (true) {
basic.pause(400);
if (ghost.get(LedSpriteProperty.X) < hero.get(LedSpriteProperty.X)) {
@ -127,7 +127,7 @@ let hero = game.createSprite(2, 2);
let food = game.createSprite(4, 4);
let ghost = game.createSprite(0, 0);
ghost.change(LedSpriteProperty.Blink, 100);
food = led.brightness() == 8;
food.set(LedSpriteProperty.Brightness, 8);
while (true) {
basic.pause(400);
if (ghost.get(LedSpriteProperty.X) < hero.get(LedSpriteProperty.X)) {
@ -164,7 +164,7 @@ let hero = game.createSprite(2, 2);
let food = game.createSprite(4, 4);
let ghost = game.createSprite(0, 0);
ghost.change(LedSpriteProperty.Blink, 100);
food = led.brightness() == 8;
food.set(LedSpriteProperty.Brightness, 8);
while (true) {
basic.pause(400);
if (ghost.get(LedSpriteProperty.X) < hero.get(LedSpriteProperty.X)) {
@ -212,7 +212,7 @@ let hero = game.createSprite(2, 2);
let food = game.createSprite(4, 4);
let ghost = game.createSprite(0, 0);
ghost.change(LedSpriteProperty.Blink, 100);
food = led.brightness() == 8;
food.set(LedSpriteProperty.Brightness, 8);
while (true) {
basic.pause(400);
if (ghost.get(LedSpriteProperty.X) < hero.get(LedSpriteProperty.X)) {

36
docs/projects/guitar.md Normal file
View File

@ -0,0 +1,36 @@
# Guitar
![guitar icon](/static/mb/projects/guitar.png)
### @description A beginner-intermediate maker activity, building a guitar with the micro:bit
### ~avatar avatar
Make a micro:bit guitar with this guided tutorial!
### ~
*playing micro:bit guitar*
https://youtu.be/GYmdTFvxz80
## Duration
5 Activities, approx 30-45 min each based on familiarity with the coding concepts
## Materials
* Cardboard large pieces (recycle!)
* Tape (masking, duct Tape, and/or packing tape)
* Markers and/or paint
* Aluminum Foil
* Scissors that can cut cardboard
* 1 micro:bit, battery holder and 2 AAA batteries
* 4-5 Crocodile clips
* Headphones
## Activities
* [Making the Guitar Body](/projects/guitar/making)
* [Buttons, Display & Sound](/projects/guitar/displaybuttons)
* [Light Sensor Tone control](/projects/guitar/lightsensor)
* [Accelerometer Beat control](/projects/guitar/accelerometer)
* [Pin Press Switch](/projects/guitar/pinpress)
### ~button /projects/guitar/making
Let's get started!
### ~

View File

@ -0,0 +1,114 @@
# Accelerometer Beat control
### @description micro:bit guitar: using accelerometer to control tempo
### ~avatar avatar
Use the Accelerometer to control guitar tempo
* Duration: 30 - 45 minutes
* Concepts:
* Gravity
* Acceleration
* X, Y, Z coordinates
* Tempo
* Beat
* Mapping
* Graphing
* Absolute value
### ~
*accelerometer controlled tempo*
https://youtu.be/h_gPkBaVkoo
TODO: add sound to video
## Blocks
```cards
input.acceleration(Dimension.Y)
music.setTempo(120)
pins.map(0, 0, 1023,60, 320)
Math.abs(1)
```
## Accelerometer, gravity and tilting!
The micro:bit contains an **accelerometer** sensor that is able to measure forces applied to the board.
On earth, we are subject to the **gravity force** which pulls us to the ground!
https://youtu.be/0SULoTKmkhI
When the micro:bit is flat on a table, with the screen pointing up, the gravity force is aligned
with the **Z** axis of the micro:bit.
![micro:bit x, y, z axis image](/static/mb/projects/guitar/accelleration_axis.png)
If you tilt it up and down, the force will align with the **Y** axis -- this is how we can detect tilting!!!
If the force along **Y** grows, the micro:bit is tilting more and more vertically!
## Measuring Acceleration along different coordinates (X, Y, Z axis)
The acceleration block approximately measures **milli-g**, which is 1/1000 of a **g** or the
acceleration of gravity.
### Step 1: Graphing acceleration
```blocks
basic.forever(() => {
led.plotBarGraph(input.acceleration(Dimension.Y), 1023)
})
```
**Create the code** that measures the change in the Y axis acceleration as a graph on the LEDs
**Dowload the code** to the micro:bit
**Test the movements that move the graph from 1 to 5 bars on the LEDs**
### Extra
Try graphing the acceleration along the **X** and **Z** axis. Can you explain the differences?
### ~hint
## Mapping
**It is common to map one standard to another - such as with temperature**
![Fahrenheit to Celsius](/static/mb/projects/guitar/map_analogy.png "Fahrenheit to Celsius")
### ~
### Step 2: Mapping acceleration to Beat
**micro:bit sensors produce signal values between 0 to 1023. The *[map block](/reference/pins/map)* converts the signal to a desired range.**
```blocks
basic.forever(() => {
music.setTempo(pins.map(Math.abs(input.acceleration(Dimension.Y)),
0, 1023,
60, 320))
music.playTone(Note.C, music.beat(BeatFraction.Quarter));
})
```
**Create the code** that *Maps* Y axis acceleration as *tempo*
**Download the code** to the micro:bit on the guitar
**Test the movements that speed and slow the tempo**
### Step 3: Combine with light sensor tone control
**Put it all together!**
```blocks
basic.forever(() => {
music.setTempo(pins.map(Math.abs(input.acceleration(Dimension.Y)),
0, 1023,
60, 320))
music.playTone(
input.lightLevel() * 25,
music.beat(BeatFraction.Quarter)
);
})
```
**Combine the code above with the light sensor tone control code from the previous activity**
**Download the code** to the micro:bit on the guitar
### Now play the guitar adjusting tone and tempo using the light sensor and accelerometer!
### ~button /projects/guitar/pinpress
NEXT: Pin Press on/off
### ~

View File

@ -0,0 +1,179 @@
# Buttons, Display & Sound
### @description micro:bit guitar: using buttons with display and sound
### ~avatar avatar
Use Button Events to control LED Display and play Sound
* **Concepts:**
* Events
* Tone/Note
* Sequence
### ~
## Duration: 30 - 45 minutes
## Materials
A micro:bit, battery pack and 2 x AAA batteries
![battery pack and micro:bit](/static/mb/projects/guitar/microbit.jpg)
2 to 4 crocodile clips
![crocodile clips](/static/mb/projects/guitar/crocclips.jpg)
Headphones
![earbud headphones](/static/mb/projects/guitar/headphones.jpg)
## Blocks
```cards
basic.showLeds(`
. # . # .
. . . . .
. # # # .
. # . # .
. # # # .
`);
input.onButtonPressed(Button.A, () => {});
music.playTone(Note.C, music.beat(BeatFraction.Quarter))
music.rest(music.beat(BeatFraction.Whole))
music.beat(BeatFraction.Quarter)
```
## Step 1: Make a Smiley
Open [codethemicrobit.com](https://codethemicrobit.com) in your web browser
```blocks
basic.showLeds(`
. # . # .
. . . . .
. # # # .
. # . # .
. # # # .
`);
```
From **Basics**, drag a **show LEDs** block into the coding area
* Create a face with LEDs
![micro:bit USB connection](/static/mb/projects/guitar/connectmicrobit.jpg)
Connect your micro:bit to your computer via USB and click **`Download`**.
Follow the instructions to move the code to your micro:bit.
## Step 2: Add Smiley LED Button Events
```blocks
input.onButtonPressed(Button.A, () => {
basic.showLeds(`
. # . # .
. . . . .
. # # # .
. # . # .
. # # # .
`)
})
input.onButtonPressed(Button.B, () => {
basic.showLeds(`
. # . # .
. . . . .
. . . . .
# . . . #
. # # # .
`)
})
```
From **Input**, drag an **on button 'A' pressed** block into the coding area
* Snap the LED face into the block
* Create a 'B' button block with a different LED face
* Download the code to your micro:bit and try the A & B buttons
## Step 3: Add Headphone Speakers using Crocodile clips
![crocodile clips attached to pins 0 and GND](/static/mb/projects/guitar/crocclipintoboard.jpg)
![crocodile clips attached to headphone jack](/static/mb/projects/guitar/jacktocrocs.jpg)
Connect **GND** to the **base of the headphone jack** using a second crocodile clip (usually black)
Connect **pin 0** to the **tip of the headphone jack** with a crocodile clip
*attaching batteries and micro:bit*
https://youtu.be/zwRTmpKIaVU
Attach the micro:bit & battery-pack to the guitar body
*connecting headphone speaker*
https://youtu.be/ewyEW_U5G9M
Connect the headphones with crocodile clips
### ~hint
## The micro:bit can play music
The **play tone** block allows a range letter note tones from **C** to **B5**.
Songs are played using sequences notes. Like the beginning of a birthday song (C, C, D, C, F, E).
```blocks
input.onButtonPressed(Button.A, () => {
music.playTone(Note.C, music.beat(BeatFraction.Quarter))
music.rest(music.beat(BeatFraction.Whole))
music.playTone(Note.C, music.beat(BeatFraction.Quarter))
music.rest(music.beat(BeatFraction.Whole))
music.playTone(Note.D, music.beat(BeatFraction.Quarter))
music.rest(music.beat(BeatFraction.Whole))
music.playTone(Note.C, music.beat(BeatFraction.Quarter))
music.rest(music.beat(BeatFraction.Whole))
music.rest(music.beat(BeatFraction.Whole))
music.playTone(Note.F, music.beat(BeatFraction.Half))
music.rest(music.beat(BeatFraction.Whole))
music.playTone(Note.E, music.beat(BeatFraction.Whole))
})
```
### ~
## Step 4: Add Tone Playing Events for Buttons A & B
```blocks
input.onButtonPressed(Button.A, () => {
basic.showLeds(`
. # . # .
. . . . .
. # # # .
. # . # .
. # # # .
`)
music.playTone(Note.A, music.beat(BeatFraction.Whole))
})
input.onButtonPressed(Button.B, () => {
basic.showLeds(`
. # . # .
. . . . .
. . . . .
# . . . #
. # # # .
`)
music.playTone(Note.G, music.beat(BeatFraction.Whole))
})
```
From **Music**, drag **play tone *C* for *1* beat** block under the **show leds** in **Button A Pressed**
* modify **tone** by choosing a note (*letter*) and experiment with high and low pitches
* set **beat** to 1
**Repeat** for **Button B** event
**Download the code** to the micro:bit
**Try the A & B buttons** with headphones and power connected
## Congratulations on completing the basic guitar!
**Challenge:** Create Samples of longer music to play for each button instead of the single tone
* *Tip*: Search for "ABC music notation" or "Easy Music Notes" + the name of a song
## Extra
* [Smiley Buttons tutorial](/projects/smiley-buttons)
* [Hack your headphones](/projects/hack-your-headphones)
### ~button /projects/guitar/lightsensor
NEXT: Light Sensor Tone Control
### ~

View File

@ -0,0 +1,116 @@
# Light Sensor Tone control
### @description micro:bit guitar: using light sensor to control tone
### ~avatar avatar
Use the Light Sensor to control guitar Tone
* **Duration:** 30 - 45 minutes
* **Concepts:**
* Inputs
* Light Intensity
* Tone/Frequency
* Ratio Mapping
* Forever Loop
* Math (multiplication) with code properties
* **Resources:**
* This guitar is inspired by the [Theremin](https://en.wikipedia.org/wiki/Theremin)
### ~
*playing tones with light sensor*
https://youtu.be/2cKg9pokVC4
## The micro:bit LEDs Light Sensors
- the micro:bit can detect external light level intensity reaching the LEDs
- the light level block reports a reading of values 0 (*dark*) to 255 (*bright*)
- a **Forever Loop** is required to continually use measure the current light level to control the tone
## Forever Loop
The forever loop really does run forever. The forever loop is useful when there is a need to continually check for an event or use a changing value in code.
## Blocks
```cards
basic.forever(() => {})
input.lightLevel()
led.plotBarGraph(0, 255)
music.playTone(Note.C, music.beat(BeatFraction.Quarter))
```
## Step 1: Create a light level detector
```blocks
basic.forever(() => {
led.plotBarGraph(input.lightLevel(), 255)
})
```
**Build the blocks**
* From **Basic** drag a **forever loop** block into the coding area
* From **Led** drag a **plot bar graph** block into the **forever loop**
* From **Input** drag a **light level** block into **plot bar graph *of***
**Set the *plot bar graph* value *up to* = *255* **
## Step 2: Test the light required to move the bar graph height
*graphing light input*
https://youtu.be/pqU7bTcfQ_s
Experiment to see the effect on graph height when the **plot bar graph** value ***up to*** is changed
**255 is the maximum light input reading**, try numbers smaller than 255
**Find a value** that allows the graph to show 1 - 5 bars
### ~hint
### Frequency
**Frequency** measured in Hz which are cycles per second or vibrations per second
* A healthy human ear can detect frequencies in the range of 20Hz to 20,000Hz.
* The micro:bit + headphones reliably produce detectable output ~50Hz - 6,000Hz.
**261Hz** represents a C note
```blocks
music.playTone(261, music.beat(BeatFraction.Half))
```
**play tone** blocks can specify a specific numeric **Frequency**
by replacing the letter note 261Hz represents a **C** note with a **number** block
```blocks
music.playTone(261, music.beat(BeatFraction.Half))
```
### ~
## Step 3: Multiply Frequency using Math blocks
```blocks
input.onButtonPressed(Button.A, () => {
music.playTone(261 * 2, music.beat(BeatFraction.Half))
})
```
create a **play tone** block using a **Math** section, **multiplication** block to set *tone*
### Next
**Add** a **B** button block that multiplies the **261** tone by a number other than 2 to set tone
**Download the code to the micro:bit**
**Test the sound for multiples of the 261Hz *C* frequency**
## Step 4: Control the Frequency with the light input
```blocks
basic.forever(() => {
music.playTone(input.lightLevel() * 25, music.beat(BeatFraction.Quarter))
})
```
**Create a *forever loop* containing a *play tone* block**
**Set *tone*, using *Math* multiplication block that multiplies *light level* input by 25**
or experiment with multipliers larger and smaller than 25
**Test light tone control on the guitar**
Cover the LEDs with your hand to vary light detected to control the tone
## Good work, this guitar is sounding good!
**Challenge:** Create a variable for the light level multiplier that you can change using buttons (optional)
### ~button /projects/guitar/accelerometer
NEXT: Accelerometer Beat control
### ~

View File

@ -0,0 +1,59 @@
# Making the Guitar Body
### @description Maker Project for Guitar Body for micro:bit
### ~avatar avatar
Make the Guitar Body for your micro:bit Guitar
### ~
## Duration: ~45 minutes
## Materials
* Cardboard large pieces (recycle!)
* Tape (masking, duct Tape, and/or packing tape)
* Scissors that can cut cardboard
* Markers and/or paint
![Materials: cardboard, tape, scissors, markers](/static/mb/projects/guitar/materials.jpg)
## Step 1: Design the body
*tracing the guitar design*
https://youtu.be/xMSrWaOZkFg
* Search for [Guitar Silhouette](https://www.bing.com/images/search?q=Guitar+Silhouettes) design ideas and customize
the shape of your guitar
* Trace the design on a flat piece of cardboard (40-80 cm is best)
### ~hint
* Avoid small details that are difficult to cut into cardboard
* Unfolding a box gives longer pieces of cardboard, and creases can be reinforced
### ~
## Step 2: Cut out the body
*cutting the cardboard*
https://youtu.be/aUQkrFoEank
## Step 3: Personalize the Guitar
Create unique styling using tape, markers, paint and other available materials (*calling all artist!*)
*decorating the guitar*
https://youtu.be/zNAZTJeSxY8
Everyone can come up with a unique design!
![guitar design samples](/static/mb/projects/guitar/otherdesigns.jpg)
## Extra!
*strengthening the guitar*
https://youtu.be/q0GkQdJmxjE
Strengthen the guitar next with an angled cardboard strip (*optional*).
### ~button /projects/guitar/displaybuttons
NEXT: Buttons, Display and Sound
### ~

View File

@ -0,0 +1,128 @@
# Pin Press Switch
### @description micro:bit guitar: use pin press to toggle guitar play on/off
### ~avatar avatar
Use pin press to switch guitar play on/off
* **Duration:** approximately 45 minutes
* **Materials:**
* 2-3 Crocodile clips
* Concepts:
* Circuit
* Conductor
* Variable/Global-Variable
* Conditional: **`if`**, **`else`**
* Boolean: **`True`/`False`**
### ~
## Blocks
```cards
var on = false
on;
if (on) { } else {}
input.onPinPressed(TouchPin.P1, () => {})
```
### ~hint
## Circuits & Switches
* **Circuits** need a power supply (battery), a resister (like a LED) & a conductor (metal, water, hand)
* **Switches** turn electric power on by closing (completing) a circuit with a conductor so power can flow
**Metal foil and wires make excellent conductors**
**In this activity we use YOU to conduct electricity**
**to close the circuit that switches the guitar ON and OFF!**
### ~
## Step 1: Pin Press Test
```blocks
input.onPinPressed(TouchPin.P0, () => {
basic.showNumber(0)
})
input.onPinPressed(TouchPin.P1, () => {
basic.showNumber(1)
})
input.onPinPressed(TouchPin.P2, () => {
basic.showNumber(2)
})
```
**Create the pin-press code**
**Download the code** on the micro:bit
https://youtu.be/PAIU-vHqyGU
**Hold the micro:bit touching The GND pin with one hand**
**with the other hand alternately touch the 0, 1 and 2 pins**
### ~hint
**The electric signal traveled from pins, between your hands to `GND` and the micro:bit detected the electric signal!**
### ~
## Step 2: Installing conductive foil on the guitar
https://youtu.be/NX0ECcpXFes
**Add foil to the guitar body where it is easy to touch while playing**
**Connect the foil to `GND` using a crocodile clip**
https://youtu.be/YkymZGNmkrE
**Add foil to the guitar neck**
**Connect the foil to `pin 1` using a crocodile clip**
## Step 3: Add a switch to turn the guitar ON and OFF
**Using the `on` global variable we can switch the message on the micro:bit**
**between ON and OFF**
```blocks
let on = false
basic.forever(() => {
if (on == true) {
basic.showString("ON")
} else {
basic.showString("OFF")
}
})
input.onPinPressed(TouchPin.P1, () => {
if (on == true) {
on = false
} else {
on = true
}
})
```
**Create the ON/OFF switch code**
**Download the code on the micro:bit**
**Test by touching `P1` to toggle the LED message between ON and OFF**
*Final code*
TODO: do we want to use `on = !on;` or be more direct in flipping the switch? `on = true; on = false;`
```blocks
var on = false
basic.forever(() => {
if (on) {
music.setTempo(pins.map(Math.abs(input.acceleration(Dimension.Y)),
0, 1023,
60, 320))
music.playTone(
input.lightLevel() * 25,
music.beat(BeatFraction.Quarter)
);
} else {
music.rest(music.beat())
}
})
input.onPinPressed(TouchPin.P1, () => {
on = !on;
})
```
## Now Play!
**Turn the guitar ON and OFF with a pin press on the connected foil**
**touching both pieces of foil at the same time to connect the switches**
https://youtu.be/GYmdTFvxz80

85
docs/share.md Normal file
View File

@ -0,0 +1,85 @@
# Sharing your project
Once you've made your project, you can save it the cloud, share it, or embed it on another website.
* Click **More...**, then **Embed Project**:
![Asks to embed](/static/embed/publish.png)
* Click **Publish project**. This will make the project publicly available
* You will then see this information:
![Embedding information](/static/embed/embed-info.png)
## Sharing the URL
You can share the URL for the project ([https://codethemicrobit.com/httuftrbtg](https://codethemicrobit.com/httuftrbtg) above) with other people, and they will be able to visit that page to see your project, download it, or edit it:
![Project page](/static/embed/project-page.png)
## Embedding into a blog or web site
Rather than just sharing the link, you can also embed the project so that your visitors can use the simulator, edit blocks or code, or download the project without having to leave your site.
### General instructions
* Copy the HTML for embedding the page from the publish dialog. It will look like the following:
```html
<div class="ui card sim"><div class="ui content"><div style="position:relative;height:0;padding-bottom:70%;overflow:hidden;"><iframe style="position:absolute;top:0;left:0;width:100%;height:100%;" src="https://codethemicrobit.com/?sandbox=1#pub:httuftrbtg" allowfullscreen="allowfullscreen" frameborder="0"></iframe></div></div></div>
```
* Open the HTML editor for your blog or website and paste it with your content
### Wordpress
[wordpress.com][] blogs do not support embedding content from most websites, so you will need to link to your project instead. Alternatively, if you have a Wordpress VIP account you can follow [these instructions][wordpress-vip] to embed an `iframe` into your blog. The URL that you need to add is like `https://codethemicrobit.com/?sandbox=1#pub:httuftrbtg`, but replace `httuftrbtg` with your project's unique identifier.
If you self host a Wordpress blog you can install the [iframe-plugin][] and then write the following in your blog-post (again, replacing the `httuftrbtg` with your project's identifier):
```
[iframe src="https://codethemicrobit.com/?sandbox=1#pub:httuftrbtg"]
```
### Blogger
* Create a new post
* Click the 'HTML' button next to 'Compose' and paste in the HTML
![Blogger](/static/embed/blogger.png)
### Squarespace
[Squarespace][] allows you to embed HTML code inside a blog post or page. In the editor, click to add a new block:
![Squarespace block insertion](/static/embed/squarespace-insert.png)
Scroll to **More** and select **Code**. Paste the embed HTML and click **Apply**:
![Squarespace code insertion](/static/embed/squarespace-code.png)
### Google Sites
Google Sites doesn't currently [support iframes in custom HTML][google-sites-iframes], so you'll have to insert a link to your project's URL instead.
### Office Sway
[Microsoft Office Sway][sway] only allows iframes from [certain websites][sway-restricted], so you'll need to insert a link to your project instead.
### Embedding in Markdown documents
[Markdown][] is a popular text format supported by many blog editors. As Markdown supports embedded HTML, you should be able to paste the HTML into the document, although some sites may prevent you from doing this.
### ~hint
**Developers:** This page supports OEmbed as well
### ~
[wordpress.com]: https://wordpress.com
[wordpress-vip]: https://vip.wordpress.com/documentation/embedding-rich-media-from-around-the-web-with-protected-embeds/#scripts-iframes-and-objects
[iframe-plugin]: https://wordpress.org/plugins/iframe/
[squarespace]: https://squarespace.com
[google-sites-iframes]: https://support.google.com/sites/answer/2500646?hl=en
[sway]: https://sway.com/my
[sway-restricted]: https://support.office.com/en-us/article/Embed-content-in-your-Sway-1e1ab12a-f961-4a26-8afc-77a15f892b1d
[Markdown]: https://daringfireball.net/projects/markdown/

145
docs/static/Logo_Calliope_Woman.svg vendored Normal file
View File

@ -0,0 +1,145 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Ebene_1"
x="0px"
y="0px"
viewBox="0 0 175.49999 172.4"
enable-background="new 0 0 841.9 595.3"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="Logo_Calliope_Woman.svg"
width="175.5"
height="172.39999"><metadata
id="metadata5011"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs5009" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1137"
id="namedview5007"
showgrid="false"
inkscape:zoom="0.34208337"
inkscape:cx="420.95001"
inkscape:cy="297.64999"
inkscape:window-x="-8"
inkscape:window-y="156"
inkscape:window-maximized="1"
inkscape:current-layer="Ebene_1" /><g
id="g4955"
transform="translate(-260.90025,-204.1)"><g
id="g4957"><defs
id="defs4959"><rect
id="SVGID_7_"
x="193.10001"
y="204.10001"
width="318.29999"
height="256.29999" /></defs><clipPath
id="SVGID_1_"><use
xlink:href="#SVGID_7_"
overflow="visible"
id="use4963"
style="overflow:visible"
x="0"
y="0"
width="100%"
height="100%" /></clipPath></g><g
id="g4965"><defs
id="defs4967"><rect
id="SVGID_9_"
x="193.10001"
y="204.10001"
width="318.29999"
height="256.29999" /></defs><clipPath
id="SVGID_2_"><use
xlink:href="#SVGID_9_"
overflow="visible"
id="use4971"
style="overflow:visible"
x="0"
y="0"
width="100%"
height="100%" /></clipPath></g><g
id="g4973"><defs
id="defs4975"><rect
id="SVGID_11_"
x="193.10001"
y="204.10001"
width="318.29999"
height="256.29999" /></defs><clipPath
id="SVGID_3_"><use
xlink:href="#SVGID_11_"
overflow="visible"
id="use4979"
style="overflow:visible"
x="0"
y="0"
width="100%"
height="100%" /></clipPath><path
clip-path="url(#SVGID_3_)"
d="m 436.4,262 -47.9,0 0,-46 c 0,-4.7 3.8,-8.4 8.4,-8.4 l 31,0 c 4.7,0 8.4,3.8 8.4,8.4 l 0,46 z"
id="path4981"
inkscape:connector-curvature="0"
style="fill:#4a5261" /></g><rect
x="394.79999"
y="218.7"
width="35.099998"
height="43.200001"
id="rect4983"
style="fill:#8096a1" /><path
d="m 317.6,239.5 0,61 71,0.2 c 0,0 0,-57.3 0,-61 0,-19.5 -16.1,-35.6 -35.6,-35.6 -19.6,0 -35.4,15.8 -35.4,35.4"
id="path4985"
inkscape:connector-curvature="0"
style="fill:#855c33" /><path
d="m 412.4,376.5 -114.2,0 c -35.6,0 -50.9,-45.2 -22.6,-66.8 l 63.8,-47.8 96.9,0 0,90.7 c 0.1,13.2 -10.6,23.9 -23.9,23.9"
id="path4987"
inkscape:connector-curvature="0"
style="fill:#26a6ab" /><polygon
points="345.7,257.3 334.8,298.8 285.1,302.5 "
id="polygon4989"
style="fill:#42c9c9" /><polygon
points="354,283.8 332.5,283.8 345.7,257.3 "
id="polygon4991"
style="fill:#f7f5e8" /><polygon
points="375.4,283.8 354,283.8 362.2,257.3 "
id="polygon4993"
style="fill:#f7f5e8" /><polygon
points="373.1,298.8 334.8,298.8 332.5,283.8 375.4,283.8 "
id="polygon4995"
style="fill:#bdd1cf" /><path
d="m 400.6,376.5 c -3.5,-26.2 -10.6,-58 -27.3,-77.7 l -0.2,0 -19,0 -19,0 -0.2,0 c -16.7,19.8 -23.8,51.5 -27.3,77.7 l 93,0 z"
id="path4997"
inkscape:connector-curvature="0"
style="fill:#f7f5e8" /><path
d="m 357,258 -6.1,0 c -6.4,0 -11.5,-5.2 -11.5,-11.5 l 0,-19.7 29.2,0 0,19.7 c -0.1,6.3 -5.3,11.5 -11.6,11.5"
id="path4999"
inkscape:connector-curvature="0"
style="fill:#ffcc99" /><path
d="m 335.8,376.5 0,-77.7 c 12.4,29.1 27.7,64.3 46.5,77.7 l -46.5,0 z"
id="path5001"
inkscape:connector-curvature="0"
style="fill:#bdd1cf" /><polygon
points="362.2,257.3 345.7,257.3 354,283.8 "
id="polygon5003"
style="fill:#ffcc99" /><polygon
points="436.4,315.3 394.8,262 436.4,262 "
id="polygon5005"
style="fill:#42c9c9" /></g></svg>

After

Width:  |  Height:  |  Size: 5.2 KiB

70
docs/static/Logo_Calliope_lang.svg vendored Normal file
View File

@ -0,0 +1,70 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 841.9 595.3" enable-background="new 0 0 841.9 595.3" xml:space="preserve">
<path fill="#4A5261" d="M406.9,292.9l0.2,0l5.6,17l-11.1,0.1L406.9,292.9z M402,281.8l-14.3,42.2l-3.5,0.5l0.1,5.8l16.5-0.1
l-0.1-5.8l-3.4-0.6l2.1-6.7l15.7-0.1l2.2,6.6l-3.3,0.6l0,5.8l16.5-0.2l0-5.8l-3.5-0.5l-15-41.9L402,281.8z"/>
<polygon fill="#4A5261" points="454.9,281.9 445.2,282 440,282 440.1,287.9 445.2,288.8 445.6,323.5 440.4,324.6 440.5,330.4
476.9,330.1 476.7,316.5 469.3,316.6 468.9,322.7 455.3,322.8 454.9,288.7 460.1,287.7 460.1,281.8 "/>
<polygon fill="#4A5261" points="501.6,281.9 491.9,282 486.7,282 486.8,287.9 491.9,288.8 492.2,323.5 487.1,324.6 487.2,330.4
523.6,330.1 523.4,316.5 516,316.6 515.6,322.7 501.9,322.8 501.6,288.7 506.8,287.7 506.8,281.8 "/>
<polygon fill="#4A5261" points="533.4,282 533.4,287.9 538.6,288.8 538.9,323.5 533.8,324.6 533.8,330.4 553.9,330.2 553.8,324.4
548.6,323.5 548.3,288.7 553.5,287.7 553.4,281.8 "/>
<polygon fill="#4A5261" points="674.9,282 669.7,282 669.8,287.9 674.9,288.8 675.2,323.5 670.1,324.6 670.2,330.4 708.4,330.1
708.3,316.8 700.9,316.9 700.6,322.7 684.9,322.8 684.8,309 701.2,308.8 701.1,301.4 684.7,301.5 684.6,289.4 700.1,289.2
700.6,295 708.1,294.9 707.9,281.7 "/>
<g>
<g>
<defs>
<rect id="SVGID_7_" x="133.2" y="204.1" width="234.3" height="188.7"/>
</defs>
<clipPath id="SVGID_1_">
<use xlink:href="#SVGID_7_" overflow="visible"/>
</clipPath>
</g>
<g>
<defs>
<rect id="SVGID_9_" x="133.2" y="204.1" width="234.3" height="188.7"/>
</defs>
<clipPath id="SVGID_2_">
<use xlink:href="#SVGID_9_" overflow="visible"/>
</clipPath>
</g>
<g>
<defs>
<rect id="SVGID_11_" x="133.2" y="204.1" width="234.3" height="188.7"/>
</defs>
<clipPath id="SVGID_3_">
<use xlink:href="#SVGID_11_" overflow="visible"/>
</clipPath>
<path clip-path="url(#SVGID_3_)" fill="#4A5261" d="M312.3,246.7H277v-33.8c0-3.4,2.8-6.2,6.2-6.2h22.9c3.4,0,6.2,2.8,6.2,6.2
V246.7z"/>
</g>
<rect x="281.8" y="214.8" fill="#8096A1" width="25.8" height="31.8"/>
<path fill="#855C33" d="M224.9,230.1V275l52.3,0.2c0,0,0-42.2,0-44.9c0-14.4-11.8-26.2-26.2-26.2
C236.6,204.1,224.9,215.7,224.9,230.1"/>
<path fill="#26A6AB" d="M294.7,331h-84.1c-26.2,0-37.4-33.3-16.6-49.2l47-35.2h71.3v66.8C312.3,323.2,304.4,331,294.7,331"/>
<polygon fill="#42C9C9" points="237.6,273.8 201,276.6 245.6,243.3 "/>
<polygon fill="#F7F5E8" points="235.9,262.7 245.6,243.3 251.7,262.7 "/>
<polygon fill="#F7F5E8" points="251.7,262.7 257.7,243.3 267.4,262.7 "/>
<polygon fill="#BDD1CF" points="265.7,273.8 237.6,273.8 235.9,262.7 267.4,262.7 "/>
<path fill="#F7F5E8" d="M286,331c-2.6-19.3-7.8-42.7-20.1-57.2h-0.1h-14h-14h-0.1c-12.3,14.5-17.6,37.9-20.1,57.2H286z"/>
<path fill="#FFCC99" d="M253.9,243.8h-4.5c-4.7,0-8.5-3.8-8.5-8.5v-14.5h21.5v14.5C262.4,240,258.6,243.8,253.9,243.8"/>
<path fill="#BDD1CF" d="M238.3,331v-57.2c9.1,21.4,20.4,47.3,34.2,57.2H238.3z"/>
<polygon fill="#FFCC99" points="245.6,243.3 251.7,262.7 257.7,243.3 "/>
<polygon fill="#42C9C9" points="281.8,246.7 312.3,246.7 312.3,285.9 "/>
</g>
<path fill="#4A5261" d="M373.2,297.5l-7.2,0.1l-1.1-6.4c-1-0.9-2.2-1.7-3.6-2.2c-1.5-0.5-3.2-0.8-5.1-0.8c-4.2,0-7.4,1.6-9.7,4.7
c-2.2,3.1-3.3,7.1-3.3,12l0,1.7c0,4.9,1.2,8.9,3.5,12c2.3,3.1,5.5,4.6,9.6,4.5c1.9,0,3.7-0.3,5.2-0.9c1.6-0.6,2.8-1.3,3.7-2.3
l0.9-6.5l7.2-0.1l0.1,9.6c-1.9,2.3-4.4,4.1-7.4,5.5c-3,1.4-6.4,2.1-10.1,2.1c-6.5,0.1-11.8-2.1-16-6.6c-4.2-4.5-6.3-10.2-6.4-17.3
l0-1.6c-0.1-7,1.9-12.8,6-17.4c4.1-4.6,9.4-6.9,15.9-6.9c3.7,0,7.1,0.6,10.2,2c3,1.3,5.5,3.1,7.5,5.3L373.2,297.5z"/>
<path fill="#4A5261" d="M598.7,305c0-5-1.1-9.1-3.2-12.2c-2.1-3.1-5.2-4.6-9.3-4.6c-4.1,0-7.1,1.6-9.1,4.7c-2,3.1-2.9,7.2-2.9,12.3
l0,0.8c0,5.1,1.1,9.2,3.2,12.3c2.1,3.1,5.1,4.6,9.2,4.6c4.1,0,7.2-1.6,9.2-4.8c2-3.1,3-7.2,3-12.3L598.7,305z M608.4,305.7
c0.1,7.1-1.9,13-5.9,17.6c-4,4.7-9.3,7-15.9,7.1c-6.5,0.1-11.8-2.2-15.9-6.8c-4.1-4.6-6.1-10.4-6.2-17.5l0-0.7
c-0.1-7,1.9-12.9,5.9-17.6c4-4.7,9.2-7.1,15.8-7.1c6.6-0.1,11.9,2.2,16,6.8c4.1,4.6,6.2,10.4,6.3,17.5L608.4,305.7z"/>
<path fill="#4A5261" d="M633.9,305.2l8.2-0.1c2.7,0,4.7-0.8,6.1-2.3c1.4-1.5,2-3.4,2-5.7c0-2.3-0.7-4.2-2.1-5.7
c-1.4-1.5-3.5-2.2-6.2-2.2l-8.2,0.1L633.9,305.2z M641.9,281.8c5.5,0,9.9,1.3,13.2,4.1c3.2,2.8,4.9,6.5,4.9,11.1
c0,4.6-1.5,8.4-4.7,11.2s-7.5,4.3-13.1,4.3l-8.2,0.1l0.1,10.7l5.2,0.9l0,5.8l-20,0.2l-0.1-5.8l5.1-1l-0.3-34.7l-5.2-1l-0.1-5.9
l5.2,0L641.9,281.8z"/>
</svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

228
docs/static/Logo_Calliope_norm.svg vendored Normal file
View File

@ -0,0 +1,228 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Ebene_1"
x="0px"
y="0px"
viewBox="0 0 234.4 188.6"
enable-background="new 0 0 595.3 841.9"
xml:space="preserve"
inkscape:version="0.91 r13725"
sodipodi:docname="Logo_Calliope_norm.svg"
width="234.39999"
height="188.60001"><metadata
id="metadata89"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs87" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1137"
id="namedview85"
showgrid="false"
inkscape:zoom="3.1714397"
inkscape:cx="73.725892"
inkscape:cy="132.25623"
inkscape:window-x="-8"
inkscape:window-y="156"
inkscape:window-maximized="1"
inkscape:current-layer="Ebene_1" /><g
id="g4307"
transform="translate(0.15971695,653.11241)"><g
transform="translate(-180.35972,-805.91209)"
id="g3"><defs
id="defs5"><rect
height="188.7"
width="234.3"
y="152.7"
x="180.2"
id="SVGID_1_" /></defs><clipPath
id="SVGID_2_"><use
height="100%"
width="100%"
y="0"
x="0"
style="overflow:visible"
id="use9"
overflow="visible"
xlink:href="#SVGID_1_" /></clipPath><path
style="fill:#4a5261"
inkscape:connector-curvature="0"
id="path11"
d="m 205,320.8 -4.5,0 -0.7,-4 c -0.6,-0.6 -1.4,-1.1 -2.3,-1.4 -0.9,-0.3 -2,-0.5 -3.2,-0.5 -2.6,0 -4.6,1 -6.1,2.9 -1.4,1.9 -2.1,4.4 -2.1,7.5 l 0,1.1 c 0,3.1 0.8,5.6 2.2,7.5 1.4,1.9 3.4,2.9 6,2.8 1.2,0 2.3,-0.2 3.3,-0.5 1,-0.4 1.7,-0.8 2.3,-1.4 l 0.6,-4 4.5,0 0.1,6 c -1.2,1.4 -2.7,2.6 -4.6,3.4 -1.9,0.8 -4,1.3 -6.3,1.3 -4.1,0 -7.4,-1.3 -10,-4.1 -2.6,-2.8 -3.9,-6.4 -4,-10.8 l 0,-1 c 0,-4.4 1.2,-8 3.8,-10.9 2.6,-2.8 5.9,-4.3 10,-4.3 2.3,0 4.5,0.4 6.3,1.2 1.9,0.8 3.5,1.9 4.7,3.3 l 0,5.9 z"
clip-path="url(#SVGID_2_)" /></g><path
style="fill:#4a5261"
inkscape:connector-curvature="0"
id="path13"
d="m 45.740275,-488.51209 0.1,0 3.5,10.6 -6.9,0.1 3.3,-10.7 z m -3.1,-6.9 -9,26.4 -2.2,0.3 0,3.6 10.3,-0.1 0,-3.6 -2.1,-0.4 1.3,-4.2 9.8,-0.1 1.4,4.1 -2.1,0.4 0,3.6 10.3,-0.1 0,-3.6 -2.2,-0.3 -9.4,-26.2 -6.1,0.2 z" /><polygon
style="fill:#4a5261"
transform="translate(-180.35972,-805.91209)"
id="polygon15"
points="256.3,335.8 256.1,314.4 259.4,313.8 259.3,310.1 256.1,310.2 250,310.2 246.8,310.3 246.8,313.9 250.1,314.5 250.3,336.2 247,336.9 247.1,340.5 269.8,340.3 269.7,331.8 265.1,331.9 264.9,335.7 " /><polygon
style="fill:#4a5261"
transform="translate(-180.35972,-805.91209)"
id="polygon17"
points="285.5,335.5 285.3,314.2 288.5,313.5 288.5,309.9 285.3,309.9 279.2,310 276,310 276,313.6 279.2,314.2 279.4,335.9 276.2,336.6 276.3,340.2 299,340 298.9,331.6 294.3,331.6 294,335.4 " /><polygon
style="fill:#4a5261"
transform="translate(-180.35972,-805.91209)"
id="polygon19"
points="305.1,309.7 305.2,313.4 308.4,314 308.6,335.7 305.4,336.3 305.4,340 317.9,339.9 317.9,336.2 314.7,335.6 314.5,313.9 317.7,313.3 317.7,309.6 " /><g
transform="translate(-180.35972,-805.91209)"
id="g21"><defs
id="defs23"><rect
height="188.7"
width="234.3"
y="152.7"
x="180.2"
id="SVGID_3_" /></defs><clipPath
id="SVGID_4_"><use
height="100%"
width="100%"
y="0"
x="0"
style="overflow:visible"
id="use27"
overflow="visible"
xlink:href="#SVGID_3_" /></clipPath><path
style="fill:#4a5261"
inkscape:connector-curvature="0"
id="path29"
d="m 346,324.2 c 0,-3.1 -0.7,-5.7 -2,-7.6 -1.3,-1.9 -3.3,-2.9 -5.8,-2.9 -2.6,0 -4.4,1 -5.7,3 -1.2,2 -1.8,4.5 -1.8,7.7 l 0,0.5 c 0,3.2 0.7,5.7 2,7.7 1.3,1.9 3.2,2.9 5.7,2.9 2.6,0 4.5,-1 5.7,-3 1.3,-2 1.9,-4.5 1.9,-7.7 l 0,-0.6 z m 6,0.4 c 0,4.4 -1.2,8.1 -3.7,11 -2.5,2.9 -5.8,4.4 -9.9,4.4 -4.1,0 -7.4,-1.4 -9.9,-4.3 -2.5,-2.9 -3.8,-6.5 -3.9,-11 l 0,-0.5 c 0,-4.4 1.2,-8.1 3.7,-11 2.5,-2.9 5.8,-4.4 9.8,-4.5 4.1,0 7.4,1.4 10,4.3 2.6,2.9 3.9,6.5 3.9,10.9 l 0,0.7 z"
clip-path="url(#SVGID_4_)" /><path
style="fill:#4a5261"
inkscape:connector-curvature="0"
id="path31"
d="m 368,323.8 5.1,0 c 1.7,0 3,-0.5 3.8,-1.4 0.9,-0.9 1.3,-2.1 1.3,-3.5 0,-1.5 -0.5,-2.7 -1.3,-3.6 -0.9,-0.9 -2.2,-1.4 -3.8,-1.4 l -5.1,0 0,9.9 z m 5,-14.7 c 3.5,0 6.2,0.8 8.2,2.6 2,1.8 3,4.1 3.1,7 0,2.9 -1,5.2 -2.9,7 -2,1.8 -4.7,2.7 -8.2,2.7 l -5.1,0 0.1,6.7 3.2,0.6 0,3.6 -12.5,0.1 0,-3.6 3.2,-0.7 -0.2,-21.7 -3.2,-0.6 0,-3.7 3.2,0 11.1,0 z"
clip-path="url(#SVGID_4_)" /></g><polygon
style="fill:#4a5261"
transform="translate(-180.35972,-805.91209)"
id="polygon33"
points="399.8,325.8 410,325.7 410,321 399.8,321.1 399.7,313.5 409.4,313.4 409.7,317 414.3,317 414.2,308.7 393.6,308.9 390.3,308.9 390.4,312.6 393.6,313.2 393.8,334.9 390.6,335.6 390.6,339.2 414.6,339 414.5,330.7 409.9,330.7 409.6,334.4 399.9,334.4 " /><g
transform="translate(-180.35972,-805.91209)"
id="g35"><defs
id="defs37"><rect
height="188.7"
width="234.3"
y="152.7"
x="180.2"
id="SVGID_5_" /></defs><clipPath
id="SVGID_6_"><use
height="100%"
width="100%"
y="0"
x="0"
style="overflow:visible"
id="use41"
overflow="visible"
xlink:href="#SVGID_5_" /></clipPath><path
style="fill:#4a5261"
inkscape:connector-curvature="0"
id="path43"
d="m 359.3,195.4 -35.3,0 0,-33.8 c 0,-3.4 2.8,-6.2 6.2,-6.2 l 22.9,0 c 3.4,0 6.2,2.8 6.2,6.2 l 0,33.8 z"
clip-path="url(#SVGID_6_)" /></g><rect
style="fill:#8096a1"
id="rect45"
height="31.799999"
width="25.799999"
y="-642.41211"
x="148.44026" /><g
transform="translate(-180.35972,-805.91209)"
id="g47"><defs
id="defs49"><rect
height="188.7"
width="234.3"
y="152.7"
x="180.2"
id="SVGID_7_" /></defs><clipPath
id="SVGID_8_"><use
height="100%"
width="100%"
y="0"
x="0"
style="overflow:visible"
id="use53"
overflow="visible"
xlink:href="#SVGID_7_" /></clipPath><path
style="fill:#855c33"
inkscape:connector-curvature="0"
id="path55"
d="m 271.9,178.8 0,44.9 52.3,0.2 c 0,0 0,-42.2 0,-44.9 0,-14.4 -11.8,-26.2 -26.2,-26.2 -14.4,-0.1 -26.1,11.6 -26.1,26"
clip-path="url(#SVGID_8_)" /><path
style="fill:#26a6ab"
inkscape:connector-curvature="0"
id="path57"
d="m 341.7,279.7 -84.1,0 c -26.2,0 -37.4,-33.3 -16.6,-49.2 l 47,-35.2 71.3,0 0,66.8 c 0,9.7 -7.9,17.6 -17.6,17.6"
clip-path="url(#SVGID_8_)" /></g><polygon
style="fill:#42c9c9"
transform="translate(-180.35972,-805.91209)"
id="polygon59"
points="284.6,222.5 248,225.2 292.6,191.9 " /><polygon
style="fill:#f7f5e8"
transform="translate(-180.35972,-805.91209)"
id="polygon61"
points="282.9,211.4 292.6,191.9 298.7,211.4 " /><polygon
style="fill:#f7f5e8"
transform="translate(-180.35972,-805.91209)"
id="polygon63"
points="298.7,211.4 304.7,191.9 314.4,211.4 " /><polygon
style="fill:#bdd1cf"
transform="translate(-180.35972,-805.91209)"
id="polygon65"
points="312.7,222.5 284.6,222.5 282.9,211.4 314.4,211.4 " /><g
transform="translate(-180.35972,-805.91209)"
id="g67"><defs
id="defs69"><rect
height="188.7"
width="234.3"
y="152.7"
x="180.2"
id="SVGID_9_" /></defs><clipPath
id="SVGID_10_"><use
height="100%"
width="100%"
y="0"
x="0"
style="overflow:visible"
id="use73"
overflow="visible"
xlink:href="#SVGID_9_" /></clipPath><path
style="fill:#f7f5e8"
inkscape:connector-curvature="0"
id="path75"
d="m 333,279.7 c -2.6,-19.3 -7.8,-42.7 -20.1,-57.2 l -0.1,0 -14,0 -14,0 -0.1,0 c -12.3,14.5 -17.6,37.9 -20.1,57.2 l 68.4,0 z"
clip-path="url(#SVGID_10_)" /><path
style="fill:#ffcc99"
inkscape:connector-curvature="0"
id="path77"
d="m 300.9,192.4 -4.5,0 c -4.7,0 -8.5,-3.8 -8.5,-8.5 l 0,-14.5 21.5,0 0,14.5 c 0,4.7 -3.8,8.5 -8.5,8.5"
clip-path="url(#SVGID_10_)" /><path
style="fill:#bdd1cf"
inkscape:connector-curvature="0"
id="path79"
d="m 285.3,279.7 0,-57.2 c 9.1,21.4 20.4,47.3 34.2,57.2 l -34.2,0 z"
clip-path="url(#SVGID_10_)" /></g><polygon
style="fill:#ffcc99"
transform="translate(-180.35972,-805.91209)"
id="polygon81"
points="292.6,191.9 298.7,211.4 304.7,191.9 " /><polygon
style="fill:#42c9c9"
transform="translate(-180.35972,-805.91209)"
id="polygon83"
points="328.8,195.4 359.3,195.4 359.3,234.6 " /></g></svg>

After

Width:  |  Height:  |  Size: 9.9 KiB

921
docs/static/calliope.simplified.svg vendored Normal file
View File

@ -0,0 +1,921 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 18.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
x="0px"
y="0px"
viewBox="0 0 340.2 311.8"
enable-background="new 0 0 340.2 311.8"
xml:space="preserve"
id="svg2"
inkscape:version="0.91 r13725"
sodipodi:docname="calliope.simplified.svg"><metadata
id="metadata945"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs943" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1137"
id="namedview941"
showgrid="false"
inkscape:zoom="3.0275819"
inkscape:cx="131.29885"
inkscape:cy="162.10198"
inkscape:window-x="-8"
inkscape:window-y="156"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" /><symbol
id="Mini_front"
viewBox="-122.3 -112.9 244.6 225.8"><g
id="g5"><use
xlink:href="#calliope_mini_backside"
width="298.9"
height="263.3"
id="XMLID_3_"
x="-150.5"
y="-131.7"
transform="matrix(0.8169 0 0 0.8169 0.6672 -5.3582)"
overflow="visible" /><g
id="holes_3_"><g
id="g9"><g
id="g11"><path
d="M-42.4-78.2c-1.2,0-2.1-1-2.1-2.1s1-2.1,2.1-2.1s2.1,1,2.1,2.1S-41.3-78.2-42.4-78.2z M-42.4-81.4 c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C-41.4-80.9-41.9-81.4-42.4-81.4z"
id="path13"
fill="#EFDA48" /><path
d="M-42.4-81.4c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C-41.4-80.9-41.9-81.4-42.4-81.4z"
id="path15" /></g><g
id="g17"><path
d="M-35.2-78.2c-1.2,0-2.1-1-2.1-2.1s1-2.1,2.1-2.1c1.2,0,2.1,1,2.1,2.1S-34.1-78.2-35.2-78.2z M-35.2-81.4c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C-34.2-80.9-34.7-81.4-35.2-81.4z"
id="path19"
fill="#EFDA48" /><path
d="M-35.2-81.4c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C-34.2-80.9-34.7-81.4-35.2-81.4z"
id="path21" /></g><g
id="g23"><path
d="M-28-78.2c-1.2,0-2.1-1-2.1-2.1s1-2.1,2.1-2.1c1.2,0,2.1,1,2.1,2.1S-26.9-78.2-28-78.2z M-28-81.4 c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-27-80.9-27.5-81.4-28-81.4z"
id="path25"
fill="#EFDA48" /><path
d="M-28-81.4c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-27-80.9-27.5-81.4-28-81.4z"
id="path27" /></g><g
id="g29"><path
d="M-20.9-78.2c-1.2,0-2.1-1-2.1-2.1s1-2.1,2.1-2.1c1.2,0,2.1,1,2.1,2.1S-19.7-78.2-20.9-78.2z M-20.9-81.4c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-19.8-80.9-20.3-81.4-20.9-81.4z"
id="path31"
fill="#EFDA48" /><path
d="M-20.9-81.4c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-19.8-80.9-20.3-81.4-20.9-81.4z"
id="path33" /></g><g
id="g35"><path
d="M-13.7-78.2c-1.2,0-2.1-1-2.1-2.1s1-2.1,2.1-2.1s2.1,1,2.1,2.1S-12.5-78.2-13.7-78.2z M-13.7-81.4 c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-12.6-80.9-13.1-81.4-13.7-81.4z"
id="path37"
fill="#EFDA48" /><path
d="M-13.7-81.4c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-12.6-80.9-13.1-81.4-13.7-81.4z"
id="path39" /></g><g
id="g41"><path
d="M-6.5-78.2c-1.2,0-2.1-1-2.1-2.1s1-2.1,2.1-2.1s2.1,1,2.1,2.1S-5.3-78.2-6.5-78.2z M-6.5-81.4 c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-5.4-80.9-5.9-81.4-6.5-81.4z"
id="path43"
fill="#EFDA48" /><path
d="M-6.5-81.4c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-5.4-80.9-5.9-81.4-6.5-81.4z"
id="path45" /></g><g
id="g47"><path
d="M0.7-78.2c-1.2,0-2.1-1-2.1-2.1s1-2.1,2.1-2.1s2.1,1,2.1,2.1S1.9-78.2,0.7-78.2z M0.7-81.4 c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C1.8-80.9,1.3-81.4,0.7-81.4z"
id="path49"
fill="#EFDA48" /><path
d="M0.7-81.4c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C1.8-80.9,1.3-81.4,0.7-81.4z"
id="path51" /></g><g
id="g53"><path
d="M7.9-78.2c-1.2,0-2.1-1-2.1-2.1s1-2.1,2.1-2.1s2.1,1,2.1,2.1S9.1-78.2,7.9-78.2z M7.9-81.4 c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C8.9-80.9,8.5-81.4,7.9-81.4z"
id="path55"
fill="#EFDA48" /><path
d="M7.9-81.4c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C8.9-80.9,8.5-81.4,7.9-81.4z"
id="path57" /></g><g
id="g59"><path
d="M15.1-78.2c-1.2,0-2.1-1-2.1-2.1s1-2.1,2.1-2.1s2.1,1,2.1,2.1S16.3-78.2,15.1-78.2z M15.1-81.4 c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C16.1-80.9,15.7-81.4,15.1-81.4z"
id="path61"
fill="#EFDA48" /><path
d="M15.1-81.4c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C16.1-80.9,15.7-81.4,15.1-81.4z"
id="path63" /></g><g
id="g65"><path
d="M22.3-78.2c-1.2,0-2.1-1-2.1-2.1s1-2.1,2.1-2.1c1.2,0,2.1,1,2.1,2.1S23.5-78.2,22.3-78.2z M22.3-81.4 c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C23.3-80.9,22.9-81.4,22.3-81.4z"
id="path67"
fill="#EFDA48" /><path
d="M22.3-81.4c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C23.3-80.9,22.9-81.4,22.3-81.4z"
id="path69" /></g><g
id="g71"><path
d="M29.5-78.2c-1.2,0-2.1-1-2.1-2.1s1-2.1,2.1-2.1c1.2,0,2.1,1,2.1,2.1S30.7-78.2,29.5-78.2z M29.5-81.4 c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C30.5-80.9,30.1-81.4,29.5-81.4z"
id="path73"
fill="#EFDA48" /><path
d="M29.5-81.4c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C30.5-80.9,30.1-81.4,29.5-81.4z"
id="path75" /></g><g
id="g77"><path
d="M36.7-78.2c-1.2,0-2.1-1-2.1-2.1s1-2.1,2.1-2.1c1.2,0,2.1,1,2.1,2.1S37.9-78.2,36.7-78.2z M36.7-81.4 c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C37.7-80.9,37.3-81.4,36.7-81.4z"
id="path79"
fill="#EFDA48" /><path
d="M36.7-81.4c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C37.7-80.9,37.3-81.4,36.7-81.4z"
id="path81" /></g><g
id="g83"><path
d="M43.9-78.2c-1.2,0-2.1-1-2.1-2.1s1-2.1,2.1-2.1c1.2,0,2.1,1,2.1,2.1S45.1-78.2,43.9-78.2z M43.9-81.4 c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C44.9-80.9,44.5-81.4,43.9-81.4z"
id="path85"
fill="#EFDA48" /><path
d="M43.9-81.4c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C44.9-80.9,44.5-81.4,43.9-81.4z"
id="path87" /></g></g><g
id="g89"><g
id="g91"><path
d="M-42.4-71c-1.2,0-2.1-1-2.1-2.1c0-1.2,1-2.1,2.1-2.1s2.1,1,2.1,2.1C-40.3-71.9-41.3-71-42.4-71z M-42.4-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C-41.4-73.7-41.9-74.1-42.4-74.1z"
id="path93"
fill="#EFDA48" /><path
d="M-42.4-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C-41.4-73.7-41.9-74.1-42.4-74.1z"
id="path95" /></g><g
id="g97"><path
d="M-35.2-71c-1.2,0-2.1-1-2.1-2.1c0-1.2,1-2.1,2.1-2.1c1.2,0,2.1,1,2.1,2.1C-33.1-71.9-34.1-71-35.2-71z M-35.2-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C-34.2-73.7-34.7-74.1-35.2-74.1z"
id="path99"
fill="#EFDA48" /><path
d="M-35.2-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C-34.2-73.7-34.7-74.1-35.2-74.1z"
id="path101" /></g><g
id="g103"><path
d="M-28-71c-1.2,0-2.1-1-2.1-2.1c0-1.2,1-2.1,2.1-2.1c1.2,0,2.1,1,2.1,2.1C-25.9-71.9-26.9-71-28-71z M-28-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-27-73.7-27.5-74.1-28-74.1z"
id="path105"
fill="#EFDA48" /><path
d="M-28-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-27-73.7-27.5-74.1-28-74.1z"
id="path107" /></g><g
id="g109"><path
d="M-20.9-71c-1.2,0-2.1-1-2.1-2.1c0-1.2,1-2.1,2.1-2.1c1.2,0,2.1,1,2.1,2.1C-18.7-71.9-19.7-71-20.9-71z M-20.9-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-19.8-73.7-20.3-74.1-20.9-74.1z"
id="path111"
fill="#EFDA48" /><path
d="M-20.9-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-19.8-73.7-20.3-74.1-20.9-74.1z"
id="path113" /></g><g
id="g115"><path
d="M-13.7-71c-1.2,0-2.1-1-2.1-2.1c0-1.2,1-2.1,2.1-2.1s2.1,1,2.1,2.1C-11.5-71.9-12.5-71-13.7-71z M-13.7-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-12.6-73.7-13.1-74.1-13.7-74.1z"
id="path117"
fill="#EFDA48" /><path
d="M-13.7-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-12.6-73.7-13.1-74.1-13.7-74.1z"
id="path119" /></g><g
id="g121"><path
d="M-6.5-71c-1.2,0-2.1-1-2.1-2.1c0-1.2,1-2.1,2.1-2.1s2.1,1,2.1,2.1C-4.3-71.9-5.3-71-6.5-71z M-6.5-74.1 c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-5.4-73.7-5.9-74.1-6.5-74.1z"
id="path123"
fill="#EFDA48" /><path
d="M-6.5-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-5.4-73.7-5.9-74.1-6.5-74.1z"
id="path125" /></g><g
id="g127"><path
d="M0.7-71c-1.2,0-2.1-1-2.1-2.1c0-1.2,1-2.1,2.1-2.1s2.1,1,2.1,2.1C2.9-71.9,1.9-71,0.7-71z M0.7-74.1 c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C1.8-73.7,1.3-74.1,0.7-74.1z"
id="path129"
fill="#EFDA48" /><path
d="M0.7-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C1.8-73.7,1.3-74.1,0.7-74.1z"
id="path131" /></g><g
id="g133"><path
d="M7.9-71c-1.2,0-2.1-1-2.1-2.1c0-1.2,1-2.1,2.1-2.1s2.1,1,2.1,2.1C10.1-71.9,9.1-71,7.9-71z M7.9-74.1 c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C8.9-73.7,8.5-74.1,7.9-74.1z"
id="path135"
fill="#EFDA48" /><path
d="M7.9-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C8.9-73.7,8.5-74.1,7.9-74.1z"
id="path137" /></g><g
id="g139"><path
d="M15.1-71c-1.2,0-2.1-1-2.1-2.1c0-1.2,1-2.1,2.1-2.1s2.1,1,2.1,2.1C17.3-71.9,16.3-71,15.1-71z M15.1-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C16.1-73.7,15.7-74.1,15.1-74.1z"
id="path141"
fill="#EFDA48" /><path
d="M15.1-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C16.1-73.7,15.7-74.1,15.1-74.1z"
id="path143" /></g><g
id="g145"><path
d="M22.3-71c-1.2,0-2.1-1-2.1-2.1c0-1.2,1-2.1,2.1-2.1c1.2,0,2.1,1,2.1,2.1C24.5-71.9,23.5-71,22.3-71z M22.3-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C23.3-73.7,22.9-74.1,22.3-74.1z"
id="path147"
fill="#EFDA48" /><path
d="M22.3-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C23.3-73.7,22.9-74.1,22.3-74.1z"
id="path149" /></g><g
id="g151"><path
d="M29.5-71c-1.2,0-2.1-1-2.1-2.1c0-1.2,1-2.1,2.1-2.1c1.2,0,2.1,1,2.1,2.1C31.7-71.9,30.7-71,29.5-71z M29.5-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C30.5-73.7,30.1-74.1,29.5-74.1z"
id="path153"
fill="#EFDA48" /><path
d="M29.5-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C30.5-73.7,30.1-74.1,29.5-74.1z"
id="path155" /></g><g
id="g157"><path
d="M36.7-71c-1.2,0-2.1-1-2.1-2.1c0-1.2,1-2.1,2.1-2.1c1.2,0,2.1,1,2.1,2.1C38.9-71.9,37.9-71,36.7-71z M36.7-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C37.7-73.7,37.3-74.1,36.7-74.1z"
id="path159"
fill="#EFDA48" /><path
d="M36.7-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C37.7-73.7,37.3-74.1,36.7-74.1z"
id="path161" /></g><g
id="g163"><path
d="M43.9-71c-1.2,0-2.1-1-2.1-2.1c0-1.2,1-2.1,2.1-2.1c1.2,0,2.1,1,2.1,2.1C46-71.9,45.1-71,43.9-71z M43.9-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C44.9-73.7,44.5-74.1,43.9-74.1z"
id="path165"
fill="#EFDA48" /><path
d="M43.9-74.1c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C44.9-73.7,44.5-74.1,43.9-74.1z"
id="path167" /></g></g><g
id="g169"><g
id="g171"><path
d="M-13.7-57.2c-1.2,0-2.1-1-2.1-2.1c0-1.2,1-2.1,2.1-2.1s2.1,1,2.1,2.1C-11.5-58.1-12.5-57.2-13.7-57.2z M-13.7-60.3c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-12.6-59.9-13.1-60.3-13.7-60.3z"
id="path173"
fill="#EFDA48" /><path
d="M-13.7-60.3c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-12.6-59.9-13.1-60.3-13.7-60.3z"
id="path175" /></g><g
id="g177"><path
d="M-6.5-57.2c-1.2,0-2.1-1-2.1-2.1c0-1.2,1-2.1,2.1-2.1s2.1,1,2.1,2.1C-4.3-58.1-5.3-57.2-6.5-57.2z M-6.5-60.3c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-5.4-59.9-5.9-60.3-6.5-60.3z"
id="path179"
fill="#EFDA48" /><path
d="M-6.5-60.3c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C-5.4-59.9-5.9-60.3-6.5-60.3z"
id="path181" /></g><g
id="g183"><path
d="M0.7-57.2c-1.2,0-2.1-1-2.1-2.1c0-1.2,1-2.1,2.1-2.1s2.1,1,2.1,2.1C2.9-58.1,1.9-57.2,0.7-57.2z M0.7-60.3c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C1.8-59.9,1.3-60.3,0.7-60.3z"
id="path185"
fill="#EFDA48" /><path
d="M0.7-60.3c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C1.8-59.9,1.3-60.3,0.7-60.3z"
id="path187" /></g><g
id="g189"><path
d="M7.9-57.2c-1.2,0-2.1-1-2.1-2.1c0-1.2,1-2.1,2.1-2.1s2.1,1,2.1,2.1C10.1-58.1,9.1-57.2,7.9-57.2z M7.9-60.3c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C8.9-59.9,8.5-60.3,7.9-60.3z"
id="path191"
fill="#EFDA48" /><path
d="M7.9-60.3c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1s1-0.5,1-1C8.9-59.9,8.5-60.3,7.9-60.3z"
id="path193" /></g><g
id="g195"><path
d="M15.1-57.2c-1.2,0-2.1-1-2.1-2.1c0-1.2,1-2.1,2.1-2.1s2.1,1,2.1,2.1C17.3-58.1,16.3-57.2,15.1-57.2z M15.1-60.3c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C16.1-59.9,15.7-60.3,15.1-60.3z"
id="path197"
fill="#EFDA48" /><path
d="M15.1-60.3c-0.6,0-1,0.5-1,1c0,0.6,0.5,1,1,1c0.6,0,1-0.5,1-1C16.1-59.9,15.7-60.3,15.1-60.3z"
id="path199" /></g></g><g
id="g201"><g
id="g203"><polygon
points="80.6,17.6 77.6,20.5 80.6,23.5 83.5,20.5 "
id="polygon205"
fill="#EFDA48" /><path
d="M79.9,19.8c-0.4,0.4-0.4,1,0,1.4c0.4,0.4,1,0.4,1.4,0s0.4-1,0-1.4C80.9,19.4,80.3,19.4,79.9,19.8z"
id="path207" /></g><g
id="g209"><path
d="M86.3,18.1c-0.8,0.8-2.2,0.8-3,0c-0.8-0.8-0.8-2.2,0-3c0.8-0.8,2.2-0.8,3,0 C87.1,15.9,87.1,17.2,86.3,18.1z M84.1,15.8c-0.4,0.4-0.4,1,0,1.4s1,0.4,1.4,0s0.4-1,0-1.4S84.5,15.4,84.1,15.8z"
id="path211"
fill="#EFDA48" /><path
d="M84.1,15.8c-0.4,0.4-0.4,1,0,1.4s1,0.4,1.4,0s0.4-1,0-1.4S84.5,15.4,84.1,15.8z"
id="path213" /></g><g
id="g215"><path
d="M90.1,14.3c-0.8,0.8-2.2,0.8-3,0c-0.8-0.8-0.8-2.2,0-3s2.2-0.8,3,0C90.9,12.1,90.9,13.5,90.1,14.3z M87.9,12.1c-0.4,0.4-0.4,1,0,1.4c0.4,0.4,1,0.4,1.4,0s0.4-1,0-1.4C88.9,11.7,88.3,11.7,87.9,12.1z"
id="path217"
fill="#EFDA48" /><path
d="M87.9,12.1c-0.4,0.4-0.4,1,0,1.4c0.4,0.4,1,0.4,1.4,0s0.4-1,0-1.4C88.9,11.7,88.3,11.7,87.9,12.1z"
id="path219" /></g><g
id="g221"><path
d="M94.4,10c-0.8,0.8-2.2,0.8-3,0c-0.8-0.8-0.8-2.2,0-3s2.2-0.8,3,0C95.3,7.8,95.3,9.2,94.4,10z M92.2,7.8 c-0.4,0.4-0.4,1,0,1.4c0.4,0.4,1,0.4,1.4,0s0.4-1,0-1.4C93.2,7.4,92.6,7.4,92.2,7.8z"
id="path223"
fill="#EFDA48" /><path
d="M92.2,7.8c-0.4,0.4-0.4,1,0,1.4c0.4,0.4,1,0.4,1.4,0s0.4-1,0-1.4C93.2,7.4,92.6,7.4,92.2,7.8z"
id="path225" /></g></g><g
id="g227"><g
id="g229"><polygon
points="-88,8.6 -91,5.7 -94,8.6 -91,11.6 "
id="polygon231"
fill="#EFDA48" /><path
d="M-90.3,8c-0.4-0.4-1-0.4-1.4,0c-0.4,0.4-0.4,1,0,1.4s1,0.4,1.4,0C-89.9,9-89.9,8.3-90.3,8z"
id="path233" /></g><g
id="g235"><path
d="M-88.5,14.4c-0.8-0.8-0.8-2.2,0-3c0.8-0.8,2.2-0.8,3,0c0.8,0.8,0.8,2.2,0,3 C-86.3,15.2-87.7,15.2-88.5,14.4z M-86.3,12.2c-0.4-0.4-1-0.4-1.4,0c-0.4,0.4-0.4,1,0,1.4s1,0.4,1.4,0 C-85.9,13.2-85.9,12.5-86.3,12.2z"
id="path237"
fill="#EFDA48" /><path
d="M-86.3,12.2c-0.4-0.4-1-0.4-1.4,0c-0.4,0.4-0.4,1,0,1.4s1,0.4,1.4,0C-85.9,13.2-85.9,12.5-86.3,12.2z"
id="path239" /></g><g
id="g241"><path
d="M-84.8,18.2c-0.8-0.8-0.8-2.2,0-3c0.8-0.8,2.2-0.8,3,0c0.8,0.8,0.8,2.2,0,3C-82.6,19-84,19-84.8,18.2z M-82.6,16c-0.4-0.4-1-0.4-1.4,0c-0.4,0.4-0.4,1,0,1.4s1,0.4,1.4,0C-82.2,17-82.2,16.4-82.6,16z"
id="path243"
fill="#EFDA48" /><path
d="M-82.6,16c-0.4-0.4-1-0.4-1.4,0c-0.4,0.4-0.4,1,0,1.4s1,0.4,1.4,0C-82.2,17-82.2,16.4-82.6,16z"
id="path245" /></g><g
id="g247"><path
d="M-80.5,22.5c-0.8-0.8-0.8-2.2,0-3c0.8-0.8,2.2-0.8,3,0c0.8,0.8,0.8,2.2,0,3 C-78.3,23.3-79.7,23.3-80.5,22.5z M-78.3,20.3c-0.4-0.4-1-0.4-1.4,0c-0.4,0.4-0.4,1,0,1.4s1,0.4,1.4,0 C-77.9,21.3-77.9,20.7-78.3,20.3z"
id="path249"
fill="#EFDA48" /><path
d="M-78.3,20.3c-0.4-0.4-1-0.4-1.4,0c-0.4,0.4-0.4,1,0,1.4s1,0.4,1.4,0C-77.9,21.3-77.9,20.7-78.3,20.3z"
id="path251" /></g></g><g
id="g253"><path
d="M-107.8,8.6c-7.7,0-13.9-6.2-13.9-13.9s6.2-13.9,13.9-13.9s13.9,6.2,13.9,13.9S-100.1,8.6-107.8,8.6z M-107.8-12c-3.7,0-6.6,3-6.6,6.6s3,6.6,6.6,6.6c3.7,0,6.6-3,6.6-6.6S-104.1-12-107.8-12z"
id="path255"
fill="#EFDA48" /><path
d="M54.8,102.3c-7.7,0-13.9-6.2-13.9-13.9s6.2-13.9,13.9-13.9s13.9,6.2,13.9,13.9S62.4,102.3,54.8,102.3z M54.8,81.7c-3.7,0-6.6,3-6.6,6.6s3,6.6,6.6,6.6s6.6-3,6.6-6.6S58.4,81.7,54.8,81.7z"
id="path257"
fill="#EFDA48" /><path
d="M108.4,8.6c-7.7,0-13.9-6.2-13.9-13.9s6.2-13.9,13.9-13.9s13.9,6.2,13.9,13.9S116.1,8.6,108.4,8.6z M108.4-12c-3.7,0-6.6,3-6.6,6.6s3,6.6,6.6,6.6s6.6-3,6.6-6.6S112-12,108.4-12z"
id="path259"
fill="#EFDA48" /><path
d="M54.8-84.2c-7.7,0-13.9-6.2-13.9-13.9S47.1-112,54.8-112s13.9,6.2,13.9,13.9S62.4-84.2,54.8-84.2z M54.8-104.7c-3.7,0-6.6,3-6.6,6.6s3,6.6,6.6,6.6c3.7,0,6.6-3,6.6-6.6S58.4-104.7,54.8-104.7z"
id="path261"
fill="#EFDA48" /><path
d="M-53.1-85C-60.8-85-67-91.2-67-98.9s6.2-13.9,13.9-13.9s13.9,6.2,13.9,13.9S-45.4-85-53.1-85z M-53.1-105.5c-3.7,0-6.6,3-6.6,6.6c0,3.7,3,6.6,6.6,6.6s6.6-3,6.6-6.6C-46.5-102.6-49.4-105.5-53.1-105.5z"
id="path263"
fill="#EFDA48" /><path
d="M-53.1,102.3c-7.7,0-13.9-6.2-13.9-13.9s6.2-13.9,13.9-13.9s13.9,6.2,13.9,13.9S-45.4,102.3-53.1,102.3z M-53.1,81.7c-3.7,0-6.6,3-6.6,6.6s3,6.6,6.6,6.6c3.7,0,6.6-3,6.6-6.6S-49.4,81.7-53.1,81.7z"
id="path265"
fill="#EFDA48" /></g></g></g><g
id="g273"><g
id="g275"><polygon
points="-20.9,36.6 -23,36.6 -23,42 -20.9,42 "
id="polygon277"
fill="#FFFFFF" /><polygon
points="-9.9,36.6 -12.1,36.6 -12.1,42 -9.9,42 "
id="polygon279"
fill="#FFFFFF" /><polygon
points="1,36.6 -1.1,36.6 -1.1,42 1,42 "
id="polygon281"
fill="#FFFFFF" /><polygon
points="12,36.6 9.8,36.6 9.8,42 12,42 "
id="polygon283"
fill="#FFFFFF" /><polygon
points="22.9,36.6 20.8,36.6 20.8,42 22.9,42 "
id="polygon285"
fill="#FFFFFF" /></g><g
id="g287"><polygon
points="-20.9,25.9 -23,25.9 -23,31.3 -20.9,31.3 "
id="polygon289"
fill="#FFFFFF" /><polygon
points="-9.9,25.9 -12.1,25.9 -12.1,31.3 -9.9,31.3 "
id="polygon291"
fill="#FFFFFF" /><polygon
points="1,25.9 -1.1,25.9 -1.1,31.3 1,31.3 "
id="polygon293"
fill="#FFFFFF" /><polygon
points="12,25.9 9.8,25.9 9.8,31.3 12,31.3 "
id="polygon295"
fill="#FFFFFF" /><polygon
points="22.9,25.9 20.8,25.9 20.8,31.3 22.9,31.3 "
id="polygon297"
fill="#FFFFFF" /></g><g
id="g299"><polygon
points="-20.9,15.1 -23,15.1 -23,20.6 -20.9,20.6 "
id="polygon301"
fill="#FFFFFF" /><polygon
points="-9.9,15.1 -12.1,15.1 -12.1,20.6 -9.9,20.6 "
id="polygon303"
fill="#FFFFFF" /><polygon
points="1,15.1 -1.1,15.1 -1.1,20.6 1,20.6 "
id="polygon305"
fill="#FFFFFF" /><polygon
points="12,15.1 9.8,15.1 9.8,20.6 12,20.6 "
id="polygon307"
fill="#FFFFFF" /><polygon
points="22.9,15.1 20.8,15.1 20.8,20.6 22.9,20.6 "
id="polygon309"
fill="#FFFFFF" /></g><g
id="g311"><polygon
points="-20.9,4.4 -23,4.4 -23,9.9 -20.9,9.9 "
id="polygon313"
fill="#FFFFFF" /><polygon
points="-9.9,4.4 -12.1,4.4 -12.1,9.9 -9.9,9.9 "
id="polygon315"
fill="#FFFFFF" /><polygon
points="1,4.4 -1.1,4.4 -1.1,9.9 1,9.9 "
id="polygon317"
fill="#FFFFFF" /><polygon
points="12,4.4 9.8,4.4 9.8,9.9 12,9.9 "
id="polygon319"
fill="#FFFFFF" /><polygon
points="22.9,4.4 20.8,4.4 20.8,9.9 22.9,9.9 "
id="polygon321"
fill="#FFFFFF" /></g><g
id="g323"><polygon
points="-20.9,-6.3 -23,-6.3 -23,-0.9 -20.9,-0.9 "
id="polygon325"
fill="#FFFFFF" /><polygon
points="-9.9,-6.3 -12.1,-6.3 -12.1,-0.9 -9.9,-0.9 "
id="polygon327"
fill="#FFFFFF" /><polygon
points="1,-6.3 -1.1,-6.3 -1.1,-0.9 1,-0.9 "
id="polygon329"
fill="#FFFFFF" /><polygon
points="12,-6.3 9.8,-6.3 9.8,-0.9 12,-0.9 "
id="polygon331"
fill="#FFFFFF" /><polygon
points="22.9,-6.3 20.8,-6.3 20.8,-0.9 22.9,-0.9 "
id="polygon333"
fill="#FFFFFF" /></g></g><g
id="g335"><path
d="M-61.4,47.4c0-0.9-0.7-1.6-1.6-1.6s-1.6,0.7-1.6,1.6s0.7,1.6,1.6,1.6S-61.4,48.3-61.4,47.4z"
id="path337"
fill="#EFDA48" /><path
d="M-55.9,47.4c0-0.9-0.7-1.6-1.6-1.6s-1.6,0.7-1.6,1.6s0.7,1.6,1.6,1.6S-55.9,48.3-55.9,47.4z"
id="path339"
fill="#EFDA48" /><path
d="M-50.4,47.4c0-0.9-0.7-1.6-1.6-1.6s-1.6,0.7-1.6,1.6s0.7,1.6,1.6,1.6S-50.4,48.3-50.4,47.4z"
id="path341"
fill="#EFDA48" /><path
d="M-45,47.4c0-0.9-0.7-1.6-1.6-1.6c-0.9,0-1.6,0.7-1.6,1.6s0.7,1.6,1.6,1.6C-45.7,49.1-45,48.3-45,47.4z"
id="path343"
fill="#EFDA48" /><path
d="M-39.5,47.4c0-0.9-0.7-1.6-1.6-1.6s-1.6,0.7-1.6,1.6s0.7,1.6,1.6,1.6S-39.5,48.3-39.5,47.4z"
id="path345"
fill="#EFDA48" /><path
d="M-34.1,47.4c0-0.9-0.7-1.6-1.6-1.6s-1.6,0.7-1.6,1.6s0.7,1.6,1.6,1.6S-34.1,48.3-34.1,47.4z"
id="path347"
fill="#EFDA48" /></g><g
id="g349"><path
d="M-39.5,76.6c0-0.9-0.7-1.6-1.6-1.6s-1.6,0.7-1.6,1.6c0,0.9,0.7,1.6,1.6,1.6S-39.5,77.5-39.5,76.6z"
id="path351"
fill="#EFDA48" /><path
d="M-34.1,76.6c0-0.9-0.7-1.6-1.6-1.6s-1.6,0.7-1.6,1.6c0,0.9,0.7,1.6,1.6,1.6S-34.1,77.5-34.1,76.6z"
id="path353"
fill="#EFDA48" /><path
d="M-28.6,76.6c0-0.9-0.7-1.6-1.6-1.6s-1.6,0.7-1.6,1.6c0,0.9,0.7,1.6,1.6,1.6S-28.6,77.5-28.6,76.6z"
id="path355"
fill="#EFDA48" /><path
d="M-23.1,76.6c0-0.9-0.7-1.6-1.6-1.6s-1.6,0.7-1.6,1.6c0,0.9,0.7,1.6,1.6,1.6S-23.1,77.5-23.1,76.6z"
id="path357"
fill="#EFDA48" /><path
d="M-17.7,76.6c0-0.9-0.7-1.6-1.6-1.6s-1.6,0.7-1.6,1.6c0,0.9,0.7,1.6,1.6,1.6S-17.7,77.5-17.7,76.6z"
id="path359"
fill="#EFDA48" /><path
d="M-17.7,68.3c0-0.9-0.7-1.6-1.6-1.6s-1.6,0.7-1.6,1.6c0,0.9,0.7,1.6,1.6,1.6S-17.7,69.1-17.7,68.3z"
id="path361"
fill="#EFDA48" /></g><g
id="g363"><path
d="M-0.1,47.4c0-0.9-0.7-1.6-1.6-1.6s-1.6,0.7-1.6,1.6s0.7,1.6,1.6,1.6S-0.1,48.3-0.1,47.4z"
id="path365"
fill="#EFDA48" /><path
d="M5.4,47.4c0-0.9-0.7-1.6-1.6-1.6s-1.6,0.7-1.6,1.6s0.7,1.6,1.6,1.6S5.4,48.3,5.4,47.4z"
id="path367"
fill="#EFDA48" /></g><path
d="M8.8,66.6H-8.8c-0.7,0-1.2,0.5-1.2,1.2v13.5c0,0.7,0.5,1.2,1.2,1.2H8.8c0.7,0,1.2-0.5,1.2-1.2V67.8 C10,67.2,9.4,66.6,8.8,66.6z"
id="path369"
fill="#BDD1CF" /><g
id="g371"><g
id="g373"><polygon
points="-59.9,36.6 -62,36.6 -62,42 -59.9,42 "
id="polygon375"
fill="#FFFFFF" /><polygon
points="-48.2,36.6 -50.3,36.6 -50.3,42 -48.2,42 "
id="polygon377"
fill="#FFFFFF" /><polygon
points="-59.9,16 -62,16 -62,21.5 -59.9,21.5 "
id="polygon379"
fill="#FFFFFF" /><polygon
points="-48.2,16 -50.3,16 -50.3,21.5 -48.2,21.5 "
id="polygon381"
fill="#FFFFFF" /></g><path
d="M-48.3,21.4h-13.6c-0.6,0-1.1,0.5-1.1,1.1v13.7c0,0.6,0.5,1.1,1.1,1.1h13.6c0.6,0,1.1-0.5,1.1-1.1V22.4 C-47.2,21.8-47.7,21.4-48.3,21.4z"
id="path383"
fill="#BDD1CF" /><path
d="M-50.2,29.3c0-2.7-2.2-4.9-4.9-4.9c-2.7,0-4.9,2.2-4.9,4.9s2.2,4.9,4.9,4.9C-52.4,34.2-50.2,32-50.2,29.3z "
id="path385"
fill="#476975" /><path
d="M-59.3,35.2c0-0.9-0.7-1.6-1.6-1.6c-0.9,0-1.6,0.7-1.6,1.6c0,0.9,0.7,1.6,1.6,1.6C-60,36.8-59.3,36.1-59.3,35.2z"
id="path387" /><path
d="M-47.6,35.2c0-0.9-0.7-1.6-1.6-1.6c-0.9,0-1.6,0.7-1.6,1.6c0,0.9,0.7,1.6,1.6,1.6C-48.4,36.8-47.6,36.1-47.6,35.2z"
id="path389" /><path
d="M-59.3,23.6c0-0.9-0.7-1.6-1.6-1.6c-0.9,0-1.6,0.7-1.6,1.6s0.7,1.6,1.6,1.6C-60,25.2-59.3,24.5-59.3,23.6z"
id="path391" /><path
d="M-47.6,23.6c0-0.9-0.7-1.6-1.6-1.6c-0.9,0-1.6,0.7-1.6,1.6s0.7,1.6,1.6,1.6C-48.4,25.2-47.6,24.5-47.6,23.6z"
id="path393" /></g><g
id="g395"><path
d="M68.7-61.4h-17c-0.8,0-1.5,0.7-1.5,1.5V-39c0,0.8,0.7,1.5,1.5,1.5h17c0.8,0,1.5-0.7,1.5-1.5v-20.9 C70.2-60.7,69.5-61.4,68.7-61.4z"
id="path397"
fill="#FFFFFF" /><polygon
points="54.4,-40.8 44,-40.8 44,-37.5 54.4,-37.5 "
id="polygon399"
fill="#FFFFFF" /><polygon
points="54.4,-61.4 44,-61.4 44,-58 54.4,-58 "
id="polygon401"
fill="#FFFFFF" /></g><path
d="M76.6-2.2c-9.9,0-17.9-8-17.9-17.9S66.7-38,76.6-38s17.9,8,17.9,17.9S86.5-2.2,76.6-2.2z"
id="path403" /><g
id="g405"><path
d="M39.1-57.2c-1.2,0-2.1-1-2.1-2.1c0-1.2,1-2.1,2.1-2.1s2.1,1,2.1,2.1C41.3-58.1,40.3-57.2,39.1-57.2z"
id="path407"
fill="#EFDA48" /></g><g
id="g409"><g
id="g411"><polygon
points="51.6,36.6 49.5,36.6 49.5,42 51.6,42 "
id="polygon413"
fill="#FFFFFF" /><polygon
points="63.3,36.6 61.1,36.6 61.1,42 63.3,42 "
id="polygon415"
fill="#FFFFFF" /><polygon
points="51.6,16 49.5,16 49.5,21.5 51.6,21.5 "
id="polygon417"
fill="#FFFFFF" /><polygon
points="63.3,16 61.1,16 61.1,21.5 63.3,21.5 "
id="polygon419"
fill="#FFFFFF" /></g><path
d="M63.2,21.4H49.6c-0.6,0-1.1,0.5-1.1,1.1v13.7c0,0.6,0.5,1.1,1.1,1.1h13.6c0.6,0,1.1-0.5,1.1-1.1V22.4 C64.3,21.8,63.8,21.4,63.2,21.4z"
id="path421"
fill="#BDD1CF" /><path
d="M61.3,29.3c0-2.7-2.2-4.9-4.9-4.9c-2.7,0-4.9,2.2-4.9,4.9s2.2,4.9,4.9,4.9C59.1,34.2,61.3,32,61.3,29.3z"
id="path423"
fill="#476975" /><path
d="M52.2,35.2c0-0.9-0.7-1.6-1.6-1.6c-0.9,0-1.6,0.7-1.6,1.6c0,0.9,0.7,1.6,1.6,1.6C51.5,36.8,52.2,36.1,52.2,35.2z"
id="path425" /><path
d="M63.8,35.2c0-0.9-0.7-1.6-1.6-1.6c-0.9,0-1.6,0.7-1.6,1.6c0,0.9,0.7,1.6,1.6,1.6C63.1,36.8,63.8,36.1,63.8,35.2z"
id="path427" /><path
d="M52.2,23.6c0-0.9-0.7-1.6-1.6-1.6c-0.9,0-1.6,0.7-1.6,1.6s0.7,1.6,1.6,1.6C51.5,25.2,52.2,24.5,52.2,23.6z"
id="path429" /><path
d="M63.8,23.6c0-0.9-0.7-1.6-1.6-1.6c-0.9,0-1.6,0.7-1.6,1.6s0.7,1.6,1.6,1.6C63.1,25.2,63.8,24.5,63.8,23.6z"
id="path431" /></g><g
id="g433"><path
d="M37.3,60H23.7c-0.6,0-1.1,0.5-1.1,1.1v13.7c0,0.6,0.5,1.1,1.1,1.1h13.6c0.6,0,1.1-0.5,1.1-1.1V61.1 C38.4,60.5,37.9,60,37.3,60z"
id="path435"
fill="#BDD1CF" /><path
d="M35.5,68c0-2.7-2.2-4.9-4.9-4.9s-4.9,2.2-4.9,4.9s2.2,4.9,4.9,4.9S35.5,70.7,35.5,68z"
id="path437"
fill="#476975" /></g><polygon
points="37.1,-46 25.4,-46 25.4,-25 37.1,-25 "
id="polygon439"
fill="#F9B233" /><polygon
points="-31.8,-47.4 -43.7,-35.5 -31.8,-23.6 -19.9,-35.5 "
id="polygon441" /><polygon
points="-3.6,-52.5 -3.6,-46.4 2.5,-46.4 2.5,-52.5 "
id="polygon443" /><g
id="g445"><polygon
points="5.3,-35.5 -5.5,-35.5 -5.5,-25 5.3,-25 "
id="polygon447"
fill="#FFFFFF" /><path
d="M4-30.2c0-2.3-1.8-4.1-4.1-4.1s-4.1,1.8-4.1,4.1s1.8,4.1,4.1,4.1S4-28,4-30.2z"
id="path449"
fill="#BDD1CF" /></g><polygon
points="-36.8,-54.6 -43.6,-59 -47.5,-52.9 -40.7,-48.5 "
id="polygon451"
fill="#FFFFFF" /></symbol><symbol
id="calliope_mini_backside"
viewBox="-150.5 -131.7 298.9 263.3"><path
d="M-77.1,127.5L-77.1,127.5c6.2,4.6,14.6,4.8,20.9,0.5c12.5-8.4,34.7-21,56-21c23.2,0,45.7,13.5,56.4,21 c4.3,3,9.8,3.8,14.7,2l0.6-0.2c7.3-2.6,11.8-9.8,11-17.4c-1.7-15.4-3-41.9,13-62.9c16.8-21.9,31.7-31.2,42.3-34.8 c5.9-2,9.9-7.4,10.4-13.6v0c0.5-8-5.1-13.6-12.3-17c-12-5.7-30.8-15.7-42.8-36.2C78.7-77,80.1-103.4,81.7-114.8 c0.7-5.1-1.6-10.1-5.9-12.8c-4.8-3-11.9-4.6-21.4,1.5c-5.5,3.6-12,8.6-20.8,12c-10.8,4.1-16.9,5.5-20.3,5.8c-2.4,0.2-4.4,1.8-5.2,4 c-1.1,2.9-3.4,6.2-8.2,6.2c-5,0-7.2-3.6-8.2-6.6c-0.8-2.5-3.3-3.4-5.9-3.7c-4.9-0.4-12.5-2.4-20.5-6.1c-7.1-3.3-14-7.9-20.4-12.7 c-5.5-4.1-15-5.5-20.4-1.3l0,0c-5.7,4.4-7.4,11.7-6.5,18.8c1.9,15.3,1.1,43.3-16.7,64.2c-17.6,20.8-28.2,26.2-37.2,29.2 c-3.9,1.3-11.4,5.4-12.3,14.1s3,14.5,10.9,18.4c12.3,6.1,30.5,17.2,42.1,34.1c15.1,22,15.1,48.1,13.1,61.7 C-82.8,117.7-81.7,124.1-77.1,127.5z"
id="path454"
fill="#034854" /><g
id="holes_9_"><g
display="none"
id="g457"><g
display="inline"
id="g459"><path
d="M-53.5-89.3c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S-52-89.3-53.5-89.3z M-53.5-93.1 c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2C-52.2-92.6-52.8-93.1-53.5-93.1z"
id="path461"
fill="#EFDA48" /><path
d="M-53.5-93.1c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2C-52.2-92.6-52.8-93.1-53.5-93.1z"
id="path463" /></g><g
display="inline"
id="g465"><path
d="M-44.7-89.3c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S-43.2-89.3-44.7-89.3z M-44.7-93.1 c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2C-43.4-92.6-44-93.1-44.7-93.1z"
id="path467"
fill="#EFDA48" /><path
d="M-44.7-93.1c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2C-43.4-92.6-44-93.1-44.7-93.1z"
id="path469" /></g><g
display="inline"
id="g471"><path
d="M-35.9-89.3c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S-34.4-89.3-35.9-89.3z M-35.9-93.1 c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2C-34.6-92.6-35.2-93.1-35.9-93.1z"
id="path473"
fill="#EFDA48" /><path
d="M-35.9-93.1c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2C-34.6-92.6-35.2-93.1-35.9-93.1z"
id="path475" /></g><g
display="inline"
id="g477"><path
d="M-27-89.3c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S-25.6-89.3-27-89.3z M-27-93.1 c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2C-25.8-92.6-26.4-93.1-27-93.1z"
id="path479"
fill="#EFDA48" /><path
d="M-27-93.1c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2C-25.8-92.6-26.4-93.1-27-93.1z"
id="path481" /></g><g
display="inline"
id="g483"><path
d="M-18.2-89.3c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S-16.8-89.3-18.2-89.3z M-18.2-93.1c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2C-17-92.6-17.6-93.1-18.2-93.1z"
id="path485"
fill="#EFDA48" /><path
d="M-18.2-93.1c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2C-17-92.6-17.6-93.1-18.2-93.1z"
id="path487" /></g><g
display="inline"
id="g489"><path
d="M-9.4-89.3c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S-8-89.3-9.4-89.3z M-9.4-93.1 c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2C-8.2-92.6-8.7-93.1-9.4-93.1z"
id="path491"
fill="#EFDA48" /><path
d="M-9.4-93.1c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2C-8.2-92.6-8.7-93.1-9.4-93.1z"
id="path493" /></g><g
display="inline"
id="g495"><path
d="M-0.6-89.3c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6S2-93.3,2-91.9S0.8-89.3-0.6-89.3z M-0.6-93.1 c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2C0.6-92.6,0.1-93.1-0.6-93.1z"
id="path497"
fill="#EFDA48" /><path
d="M-0.6-93.1c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2C0.6-92.6,0.1-93.1-0.6-93.1z"
id="path499" /></g><g
display="inline"
id="g501"><path
d="M8.2-89.3c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S9.6-89.3,8.2-89.3z M8.2-93.1 c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2C9.4-92.6,8.9-93.1,8.2-93.1z"
id="path503"
fill="#EFDA48" /><path
d="M8.2-93.1c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2C9.4-92.6,8.9-93.1,8.2-93.1z"
id="path505" /></g><g
display="inline"
id="g507"><path
d="M17-89.3c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S18.4-89.3,17-89.3z M17-93.1 c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2C18.2-92.6,17.7-93.1,17-93.1z"
id="path509"
fill="#EFDA48" /><path
d="M17-93.1c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2C18.2-92.6,17.7-93.1,17-93.1z"
id="path511" /></g><g
display="inline"
id="g513"><path
d="M25.8-89.3c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S27.2-89.3,25.8-89.3z M25.8-93.1c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2C27-92.6,26.5-93.1,25.8-93.1z"
id="path515"
fill="#EFDA48" /><path
d="M25.8-93.1c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2C27-92.6,26.5-93.1,25.8-93.1z"
id="path517" /></g><g
display="inline"
id="g519"><path
d="M34.6-89.3c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S36.1-89.3,34.6-89.3z M34.6-93.1 c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2C35.9-92.6,35.3-93.1,34.6-93.1z"
id="path521"
fill="#EFDA48" /><path
d="M34.6-93.1c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2C35.9-92.6,35.3-93.1,34.6-93.1z"
id="path523" /></g><g
display="inline"
id="g525"><path
d="M43.4-89.3c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S44.9-89.3,43.4-89.3z M43.4-93.1 c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2C44.7-92.6,44.1-93.1,43.4-93.1z"
id="path527"
fill="#EFDA48" /><path
d="M43.4-93.1c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2C44.7-92.6,44.1-93.1,43.4-93.1z"
id="path529" /></g><g
display="inline"
id="g531"><path
d="M52.2-89.3c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S53.7-89.3,52.2-89.3z M52.2-93.1 c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2C53.5-92.6,52.9-93.1,52.2-93.1z"
id="path533"
fill="#EFDA48" /><path
d="M52.2-93.1c-0.7,0-1.2,0.6-1.2,1.2c0,0.7,0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2C53.5-92.6,52.9-93.1,52.2-93.1z"
id="path535" /></g></g><g
display="none"
id="g537"><g
display="inline"
id="g539"><path
d="M-53.5-80.4c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S-52-80.4-53.5-80.4z M-53.5-84.3 c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S-52.8-84.3-53.5-84.3z"
id="path541"
fill="#EFDA48" /><path
d="M-53.5-84.3c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S-52.8-84.3-53.5-84.3z"
id="path543" /></g><g
display="inline"
id="g545"><path
d="M-44.7-80.4c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S-43.2-80.4-44.7-80.4z M-44.7-84.3 c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S-44-84.3-44.7-84.3z"
id="path547"
fill="#EFDA48" /><path
d="M-44.7-84.3c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S-44-84.3-44.7-84.3z"
id="path549" /></g><g
display="inline"
id="g551"><path
d="M-35.9-80.4c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S-34.4-80.4-35.9-80.4z M-35.9-84.3 c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S-35.2-84.3-35.9-84.3z"
id="path553"
fill="#EFDA48" /><path
d="M-35.9-84.3c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S-35.2-84.3-35.9-84.3z"
id="path555" /></g><g
display="inline"
id="g557"><path
d="M-27-80.4c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S-25.6-80.4-27-80.4z M-27-84.3 c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S-26.4-84.3-27-84.3z"
id="path559"
fill="#EFDA48" /><path
d="M-27-84.3c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S-26.4-84.3-27-84.3z"
id="path561" /></g><g
display="inline"
id="g563"><path
d="M-18.2-80.4c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S-16.8-80.4-18.2-80.4z M-18.2-84.3c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S-17.6-84.3-18.2-84.3z"
id="path565"
fill="#EFDA48" /><path
d="M-18.2-84.3c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S-17.6-84.3-18.2-84.3z"
id="path567" /></g><g
display="inline"
id="g569"><path
d="M-9.4-80.4c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S-8-80.4-9.4-80.4z M-9.4-84.3 c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2S-8.7-84.3-9.4-84.3z"
id="path571"
fill="#EFDA48" /><path
d="M-9.4-84.3c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2S-8.7-84.3-9.4-84.3z"
id="path573" /></g><g
display="inline"
id="g575"><path
d="M-0.6-80.4c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6S2-84.5,2-83.1S0.8-80.4-0.6-80.4z M-0.6-84.3 c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2S0.1-84.3-0.6-84.3z"
id="path577"
fill="#EFDA48" /><path
d="M-0.6-84.3c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2S0.1-84.3-0.6-84.3z"
id="path579" /></g><g
display="inline"
id="g581"><path
d="M8.2-80.4c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S9.6-80.4,8.2-80.4z M8.2-84.3 c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2S8.9-84.3,8.2-84.3z"
id="path583"
fill="#EFDA48" /><path
d="M8.2-84.3c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2S8.9-84.3,8.2-84.3z"
id="path585" /></g><g
display="inline"
id="g587"><path
d="M17-80.4c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S18.4-80.4,17-80.4z M17-84.3 c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S17.7-84.3,17-84.3z"
id="path589"
fill="#EFDA48" /><path
d="M17-84.3c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S17.7-84.3,17-84.3z"
id="path591" /></g><g
display="inline"
id="g593"><path
d="M25.8-80.4c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S27.2-80.4,25.8-80.4z M25.8-84.3c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2S26.5-84.3,25.8-84.3z"
id="path595"
fill="#EFDA48" /><path
d="M25.8-84.3c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2S26.5-84.3,25.8-84.3z"
id="path597" /></g><g
display="inline"
id="g599"><path
d="M34.6-80.4c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S36.1-80.4,34.6-80.4z M34.6-84.3 c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S35.3-84.3,34.6-84.3z"
id="path601"
fill="#EFDA48" /><path
d="M34.6-84.3c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S35.3-84.3,34.6-84.3z"
id="path603" /></g><g
display="inline"
id="g605"><path
d="M43.4-80.4c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S44.9-80.4,43.4-80.4z M43.4-84.3 c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2S44.1-84.3,43.4-84.3z"
id="path607"
fill="#EFDA48" /><path
d="M43.4-84.3c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2S44.1-84.3,43.4-84.3z"
id="path609" /></g><g
display="inline"
id="g611"><path
d="M52.2-80.4c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S53.7-80.4,52.2-80.4z M52.2-84.3 c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S52.9-84.3,52.2-84.3z"
id="path613"
fill="#EFDA48" /><path
d="M52.2-84.3c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S52.9-84.3,52.2-84.3z"
id="path615" /></g></g><g
display="none"
id="g617"><g
display="inline"
id="g619"><path
d="M-18.2-63.5c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6c1.4,0,2.6,1.2,2.6,2.6S-16.8-63.5-18.2-63.5z M-18.2-67.4c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S-17.6-67.4-18.2-67.4z"
id="path621"
fill="#EFDA48" /><path
d="M-18.2-67.4c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S-17.6-67.4-18.2-67.4z"
id="path623" /></g><g
display="inline"
id="g625"><path
d="M-9.4-63.5c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S-8-63.5-9.4-63.5z M-9.4-67.4 c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2S-8.7-67.4-9.4-67.4z"
id="path627"
fill="#EFDA48" /><path
d="M-9.4-67.4c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2S-8.7-67.4-9.4-67.4z"
id="path629" /></g><g
display="inline"
id="g631"><path
d="M-0.6-63.5c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6S2-67.6,2-66.1S0.8-63.5-0.6-63.5z M-0.6-67.4 c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2S0.1-67.4-0.6-67.4z"
id="path633"
fill="#EFDA48" /><path
d="M-0.6-67.4c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2S0.1-67.4-0.6-67.4z"
id="path635" /></g><g
display="inline"
id="g637"><path
d="M8.2-63.5c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S9.6-63.5,8.2-63.5z M8.2-67.4 c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2S8.9-67.4,8.2-67.4z"
id="path639"
fill="#EFDA48" /><path
d="M8.2-67.4c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2s1.2-0.6,1.2-1.2S8.9-67.4,8.2-67.4z"
id="path641" /></g><g
display="inline"
id="g643"><path
d="M17-63.5c-1.4,0-2.6-1.2-2.6-2.6s1.2-2.6,2.6-2.6s2.6,1.2,2.6,2.6S18.4-63.5,17-63.5z M17-67.4 c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S17.7-67.4,17-67.4z"
id="path645"
fill="#EFDA48" /><path
d="M17-67.4c-0.7,0-1.2,0.6-1.2,1.2s0.6,1.2,1.2,1.2c0.7,0,1.2-0.6,1.2-1.2S17.7-67.4,17-67.4z"
id="path647" /></g></g><g
display="none"
id="g649"><g
display="inline"
id="g651"><polygon
points="97.1,28 93.5,31.6 97.1,35.2 100.7,31.6 "
id="polygon653"
fill="#EFDA48" /><path
d="M96.2,30.8c-0.5,0.5-0.5,1.3,0,1.8c0.5,0.5,1.3,0.5,1.8,0c0.5-0.5,0.5-1.3,0-1.8C97.5,30.3,96.7,30.3,96.2,30.8z"
id="path655" /></g><g
display="inline"
id="g657"><path
d="M104.1,28.6c-1,1-2.7,1-3.7,0s-1-2.7,0-3.7c1-1,2.7-1,3.7,0S105.1,27.5,104.1,28.6z M101.4,25.8 c-0.5,0.5-0.5,1.3,0,1.8c0.5,0.5,1.3,0.5,1.8,0c0.5-0.5,0.5-1.3,0-1.8C102.7,25.3,101.9,25.3,101.4,25.8z"
id="path659"
fill="#EFDA48" /><path
d="M101.4,25.8c-0.5,0.5-0.5,1.3,0,1.8c0.5,0.5,1.3,0.5,1.8,0c0.5-0.5,0.5-1.3,0-1.8C102.7,25.3,101.9,25.3,101.4,25.8z"
id="path661" /></g><g
display="inline"
id="g663"><path
d="M108.8,24c-1,1-2.7,1-3.7,0s-1-2.7,0-3.7c1-1,2.7-1,3.7,0S109.8,23,108.8,24z M106,21.3 c-0.5,0.5-0.5,1.3,0,1.8c0.5,0.5,1.3,0.5,1.8,0c0.5-0.5,0.5-1.3,0-1.8C107.3,20.8,106.5,20.8,106,21.3z"
id="path665"
fill="#EFDA48" /><path
d="M106,21.3c-0.5,0.5-0.5,1.3,0,1.8c0.5,0.5,1.3,0.5,1.8,0c0.5-0.5,0.5-1.3,0-1.8C107.3,20.8,106.5,20.8,106,21.3z"
id="path667" /></g><g
display="inline"
id="g669"><path
d="M114.1,18.7c-1,1-2.7,1-3.7,0s-1-2.7,0-3.7s2.7-1,3.7,0S115.1,17.7,114.1,18.7z M111.3,16 c-0.5,0.5-0.5,1.3,0,1.8c0.5,0.5,1.3,0.5,1.8,0c0.5-0.5,0.5-1.3,0-1.8C112.6,15.5,111.8,15.5,111.3,16z"
id="path671"
fill="#EFDA48" /><path
d="M111.3,16c-0.5,0.5-0.5,1.3,0,1.8c0.5,0.5,1.3,0.5,1.8,0c0.5-0.5,0.5-1.3,0-1.8C112.6,15.5,111.8,15.5,111.3,16z"
id="path673" /></g></g><g
display="none"
id="g675"><g
display="inline"
id="g677"><polygon
points="-109.3,17 -112.9,13.4 -116.6,17 -112.9,20.7 "
id="polygon679"
fill="#EFDA48" /><path
d="M-112.1,16.2c-0.5-0.5-1.3-0.5-1.8,0c-0.5,0.5-0.5,1.3,0,1.8c0.5,0.5,1.3,0.5,1.8,0C-111.6,17.5-111.6,16.7-112.1,16.2z "
id="path681" /></g><g
display="inline"
id="g683"><path
d="M-109.9,24.1c-1-1-1-2.7,0-3.7c1-1,2.7-1,3.7,0s1,2.7,0,3.7S-108.9,25.1-109.9,24.1z M-107.2,21.3 c-0.5-0.5-1.3-0.5-1.8,0c-0.5,0.5-0.5,1.3,0,1.8c0.5,0.5,1.3,0.5,1.8,0C-106.7,22.6-106.7,21.8-107.2,21.3z"
id="path685"
fill="#EFDA48" /><path
d="M-107.2,21.3c-0.5-0.5-1.3-0.5-1.8,0c-0.5,0.5-0.5,1.3,0,1.8c0.5,0.5,1.3,0.5,1.8,0C-106.7,22.6-106.7,21.8-107.2,21.3z "
id="path687" /></g><g
display="inline"
id="g689"><path
d="M-105.3,28.7c-1-1-1-2.7,0-3.7s2.7-1,3.7,0s1,2.7,0,3.7S-104.3,29.8-105.3,28.7z M-102.6,26 c-0.5-0.5-1.3-0.5-1.8,0c-0.5,0.5-0.5,1.3,0,1.8c0.5,0.5,1.3,0.5,1.8,0C-102.1,27.3-102.1,26.5-102.6,26z"
id="path691"
fill="#EFDA48" /><path
d="M-102.6,26c-0.5-0.5-1.3-0.5-1.8,0c-0.5,0.5-0.5,1.3,0,1.8c0.5,0.5,1.3,0.5,1.8,0C-102.1,27.3-102.1,26.5-102.6,26z"
id="path693" /></g><g
display="inline"
id="g695"><path
d="M-100.1,34c-1-1-1-2.7,0-3.7c1-1,2.7-1,3.7,0c1,1,1,2.7,0,3.7S-99,35-100.1,34z M-97.3,31.3 c-0.5-0.5-1.3-0.5-1.8,0c-0.5,0.5-0.5,1.3,0,1.8s1.3,0.5,1.8,0C-96.8,32.6-96.8,31.8-97.3,31.3z"
id="path697"
fill="#EFDA48" /><path
d="M-97.3,31.3c-0.5-0.5-1.3-0.5-1.8,0c-0.5,0.5-0.5,1.3,0,1.8s1.3,0.5,1.8,0C-96.8,32.6-96.8,31.8-97.3,31.3z"
id="path699" /></g></g><g
id="g701"><path
d="M-133.5,17c-9.4,0-17.1-7.6-17.1-17.1s7.6-17.1,17.1-17.1s17.1,7.6,17.1,17.1S-124.1,17-133.5,17z M-133.5-8.2c-4.5,0-8.1,3.6-8.1,8.1S-138,8-133.5,8s8.1-3.6,8.1-8.1S-129-8.2-133.5-8.2z"
id="path703"
fill="#EFDA48" /><path
d="M65.5,131.7c-9.4,0-17.1-7.6-17.1-17.1s7.6-17.1,17.1-17.1s17.1,7.6,17.1,17.1S74.9,131.7,65.5,131.7z M65.5,106.5c-4.5,0-8.1,3.6-8.1,8.1c0,4.5,3.6,8.1,8.1,8.1s8.1-3.6,8.1-8.1C73.6,110.1,70,106.5,65.5,106.5z"
id="path705"
fill="#EFDA48" /><path
d="M131.2,17c-9.4,0-17.1-7.6-17.1-17.1s7.6-17.1,17.1-17.1s17.1,7.6,17.1,17.1S140.6,17,131.2,17z M131.2-8.2c-4.5,0-8.1,3.6-8.1,8.1s3.6,8.1,8.1,8.1s8.1-3.6,8.1-8.1S135.6-8.2,131.2-8.2z"
id="path707"
fill="#EFDA48" /><path
d="M65.5-96.6c-9.4,0-17.1-7.6-17.1-17.1s7.6-17.1,17.1-17.1s17.1,7.6,17.1,17.1S74.9-96.6,65.5-96.6z M65.5-121.7c-4.5,0-8.1,3.6-8.1,8.1c0,4.5,3.6,8.1,8.1,8.1s8.1-3.6,8.1-8.1C73.6-118.1,70-121.7,65.5-121.7z"
id="path709"
fill="#EFDA48" /><path
d="M-66.5-97.6c-9.4,0-17.1-7.6-17.1-17.1s7.6-17.1,17.1-17.1s17.1,7.6,17.1,17.1S-57.1-97.6-66.5-97.6z M-66.5-122.7c-4.5,0-8.1,3.6-8.1,8.1c0,4.5,3.6,8.1,8.1,8.1c4.5,0,8.1-3.6,8.1-8.1C-58.4-119.1-62-122.7-66.5-122.7z"
id="path711"
fill="#EFDA48" /><path
d="M-66.5,131.7c-9.4,0-17.1-7.6-17.1-17.1s7.6-17.1,17.1-17.1s17.1,7.6,17.1,17.1S-57.1,131.7-66.5,131.7z M-66.5,106.5c-4.5,0-8.1,3.6-8.1,8.1c0,4.5,3.6,8.1,8.1,8.1s8.1-3.6,8.1-8.1C-58.4,110.1-62,106.5-66.5,106.5z"
id="path713"
fill="#EFDA48" /></g></g><path
d="M131.2-8.2c-4.5,0-8.1,3.6-8.1,8.1s3.6,8.1,8.1,8.1s8.1-3.6,8.1-8.1S135.6-8.2,131.2-8.2z"
id="path715"
fill="#FFFFFF" /><path
d="M65.5,106.5c-4.5,0-8.1,3.6-8.1,8.1c0,4.5,3.6,8.1,8.1,8.1s8.1-3.6,8.1-8.1C73.6,110.1,70,106.5,65.5,106.5 z"
id="path717"
fill="#FFFFFF" /><path
d="M-66.5,106.5c-4.5,0-8.1,3.6-8.1,8.1c0,4.5,3.6,8.1,8.1,8.1c4.5,0,8.1-3.6,8.1-8.1 C-58.4,110.1-62,106.5-66.5,106.5z"
id="path719"
fill="#FFFFFF" /><path
d="M-133.5-8.1c-4.5,0-8.1,3.6-8.1,8.1s3.6,8.1,8.1,8.1s8.1-3.6,8.1-8.1S-129-8.1-133.5-8.1z"
id="path721"
fill="#FFFFFF" /><path
d="M-66.5-122.7c-4.5,0-8.1,3.6-8.1,8.1c0,4.5,3.6,8.1,8.1,8.1c4.5,0,8.1-3.6,8.1-8.1 C-58.4-119.1-62-122.7-66.5-122.7z"
id="path723"
fill="#FFFFFF" /><path
d="M65.5-121.7c-4.5,0-8.1,3.6-8.1,8.1c0,4.5,3.6,8.1,8.1,8.1s8.1-3.6,8.1-8.1C73.6-118.1,70-121.7,65.5-121.7 z"
id="path725"
fill="#FFFFFF" /></symbol><g
id="Ebene_2"
display="none"><image
display="inline"
overflow="visible"
width="1024"
height="898"
xlink:href="file:///C:/Users/jhalleux/AppData/Local/Microsoft/Windows/INetCache/Content.Outlook/POK9Z6FJ/../../1607_Juli/Calliope/mini_mit_logo_1024.png"
transform="matrix(0.3025 0 0 0.3025 17.8521 265.1405)"
id="image728"
sodipodi:absref="C:\Users\jhalleux\AppData\Local\Microsoft\Windows\INetCache\Content.Outlook\POK9Z6FJ\..\..\1607_Juli\Calliope\mini_mit_logo_1024.png" /></g><g
id="Ebene_1" /><g
id="Ebene_3" /><g
id="Ebene_4" /><use
style="overflow:visible"
overflow="visible"
transform="matrix(1.3709867,0,0,-1.3709867,170.13972,147.46239)"
y="-112.9"
x="-122.3"
id="XMLID_11_"
height="225.8"
width="244.60001"
xlink:href="#Mini_front" /><g
id="Ebene_7"
display="none"><polygon
display="inline"
points="717.6,154.6 604.5,154.6 604.5,54.2 589.7,54.2 589.7,154.6 476.6,154.6 476.6,169.4 589.7,169.4 589.7,221.4 604.5,221.4 604.5,169.4 717.6,169.4 "
id="polygon928"
fill="#E6007E" /><polygon
display="inline"
points="1145.9,152.4 1032.8,152.4 1032.8,52 1018,52 1018,152.4 904.9,152.4 904.9,167.2 1018,167.2 1018,219.2 1032.8,219.2 1032.8,167.2 1145.9,167.2 "
id="polygon930"
fill="#E6007E" /><polygon
display="inline"
points="1986.9,163.6 1873.8,163.6 1873.8,63.2 1859.1,63.2 1859.1,163.6 1746,163.6 1746,178.4 1859.1,178.4 1859.1,230.5 1873.8,230.5 1873.8,178.4 1986.9,178.4 "
id="polygon932"
fill="#E6007E" /><polygon
display="inline"
points="2403,163.6 2289.9,163.6 2289.9,63.2 2275.1,63.2 2275.1,163.6 2162,163.6 2162,178.4 2275.1,178.4 2275.1,230.5 2289.9,230.5 2289.9,178.4 2403,178.4 "
id="polygon934"
fill="#E6007E" /></g><g
id="Ebene_6"
display="none"><rect
x="1859.1"
y="432.2"
display="inline"
width="14.8"
height="167.2"
id="rect937"
fill="#E6007E" /><rect
x="1746"
y="532.6"
display="inline"
width="240.9"
height="14.8"
id="rect939"
fill="#E6007E" /></g></svg>

After

Width:  |  Height:  |  Size: 55 KiB

134
docs/static/calliope.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 36 KiB

BIN
docs/static/embed/blogger.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

BIN
docs/static/embed/embed-info.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

BIN
docs/static/embed/project-page.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

BIN
docs/static/embed/publish.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

BIN
docs/static/embed/squarespace-code.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

BIN
docs/static/embed/squarespace-insert.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

BIN
docs/static/mb/projects/guitar.png vendored Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 18 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 20 KiB

View File

@ -41,14 +41,14 @@
"input.acceleration|param|dimension": "TODO",
"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.compassHeading": "Get the current compass heading in degrees.",
"input.lightLevel": "Reads the light level applied to the LED screen in a range from ``0`` (dark) to ``255`` bright.",
"input.magneticForce": "Get the magnetic force value in ``micro-Teslas`` (``µT``). This function is not supported in the simulator.",
"input.magneticForce|param|dimension": "TODO",
"input.onButtonPressed": "Do something when a button (``A``, ``B`` or both ``A+B``) is pressed",
"input.onButtonPressed|param|body": "TODO",
"input.onButtonPressed|param|button": "TODO",
"input.onGesture": "Attaches code to run when the screen is facing up.",
"input.onGesture": "Do something when when a gesture is done (like shaking the micro:bit).",
"input.onGesture|param|body": "TODO",
"input.onLogoDown": "Attaches code to run when the logo is oriented downwards and the board is vertical.",
"input.onLogoDown|param|body": "TODO",
@ -68,7 +68,7 @@
"input.onShake|param|body": "TODO",
"input.pinIsPressed": "Get the pin state (pressed or not). Requires to hold the ground to close the circuit.",
"input.pinIsPressed|param|name": "pin used to detect the touch",
"input.rotation": "The pitch of the device, rotation along the ``x-axis``, in degrees.",
"input.rotation": "The pitch or roll of the device, rotation along the ``x-axis`` or ``y-axis``, in degrees.",
"input.rotation|param|kind": "TODO",
"input.runningTime": "Gets the number of milliseconds elapsed since power on.",
"input.setAccelerometerRange": "Sets the accelerometer sample range in gravities.",

56
libs/microbit/basic.ts Normal file
View File

@ -0,0 +1,56 @@
/**
Well known colors
*/
enum Colors {
//% blockIdentity=basic.color
//% block=red
Red = 0xFF0000,
//% blockIdentity=basic.color
//% block=orange
Orange = 0xFFA500,
//% blockIdentity=basic.color
//% block=yellow
Yellow = 0xFFFF00,
//% blockIdentity=basic.color
//% block=green
Green = 0x00FF00,
//% blockIdentity=basic.color
//% block=blue
Blue = 0x0000FF,
//% blockIdentity=basic.color
//% block=indigo
Indigo = 0x4b0082,
//% blockIdentity=basic.color
//% block=violet
Violet = 0x8a2be2,
//% blockIdentity=basic.color
//% block=purple
Purple = 0xFF00FF,
//% blockIdentity=basic.color
//% block=white
White = 0xFFFFFF
}
/**
* Provides access to basic micro:bit functionality.
*/
//% color=#0078D7 weight=100
namespace basic {
/**
* Sets the color on the build-in LED
*/
//% blockId=device_set_led_color block="set led to %color=color_id" icon="\uf00a"
//% weight=50
export function setLedColor(color: number) {
// TODO
}
/**
* Converts the color name to a number
*/
//% blockId=color_id block="%c" shim=TD_ID
export function color(c: Colors): number {
return c;
}
}

View File

@ -34,15 +34,15 @@ enum EventBusSource {
MICROBIT_ID_IO_P5_ = MICROBIT_ID_IO_P5,
MICROBIT_ID_IO_P6_ = MICROBIT_ID_IO_P6,
MICROBIT_ID_IO_P7_ = MICROBIT_ID_IO_P7,
MICROBIT_ID_IO_P8_ = MICROBIT_ID_IO_P8,
//MICROBIT_ID_IO_P8_ = MICROBIT_ID_IO_P8,
MICROBIT_ID_IO_P9_ = MICROBIT_ID_IO_P9,
MICROBIT_ID_IO_P10_ = MICROBIT_ID_IO_P10,
MICROBIT_ID_IO_P11_ = MICROBIT_ID_IO_P11,
MICROBIT_ID_IO_P12_ = MICROBIT_ID_IO_P12,
MICROBIT_ID_IO_P13_ = MICROBIT_ID_IO_P13,
MICROBIT_ID_IO_P14_ = MICROBIT_ID_IO_P14,
MICROBIT_ID_IO_P15_ = MICROBIT_ID_IO_P15,
MICROBIT_ID_IO_P16_ = MICROBIT_ID_IO_P16,
//MICROBIT_ID_IO_P12_ = MICROBIT_ID_IO_P12,
//MICROBIT_ID_IO_P13_ = MICROBIT_ID_IO_P13,
//MICROBIT_ID_IO_P14_ = MICROBIT_ID_IO_P14,
//MICROBIT_ID_IO_P15_ = MICROBIT_ID_IO_P15,
//MICROBIT_ID_IO_P16_ = MICROBIT_ID_IO_P16,
MICROBIT_ID_IO_P19_ = MICROBIT_ID_IO_P19,
MICROBIT_ID_IO_P20_ = MICROBIT_ID_IO_P20,
MES_DEVICE_INFO_ID_ = MES_DEVICE_INFO_ID,

227
libs/microbit/dal.d.ts vendored
View File

@ -79,6 +79,7 @@ declare const enum DAL {
MICROBIT_BLE_PAIRING_TIMEOUT = 90,
MICROBIT_BLE_POWER_LEVELS = 8,
MICROBIT_BLE_MAXIMUM_BONDS = 4,
MICROBIT_BLE_EDDYSTONE_URL_ADV_INTERVAL = 400,
// built/yt/yotta_modules/microbit-dal/inc//bluetooth/MicroBitButtonService.h
// built/yt/yotta_modules/microbit-dal/inc//bluetooth/MicroBitDFUService.h
MICROBIT_DFU_OPCODE_START_DFU = 1,
@ -88,6 +89,7 @@ declare const enum DAL {
// built/yt/yotta_modules/microbit-dal/inc//bluetooth/MicroBitIOPinService.h
MICROBIT_IO_PIN_SERVICE_PINCOUNT = 19,
MICROBIT_IO_PIN_SERVICE_DATA_SIZE = 10,
MICROBIT_PWM_PIN_SERVICE_DATA_SIZE = 2,
// built/yt/yotta_modules/microbit-dal/inc//bluetooth/MicroBitLEDService.h
MICROBIT_BLE_MAXIMUM_SCROLLTEXT = 20,
// built/yt/yotta_modules/microbit-dal/inc//bluetooth/MicroBitMagnetometerService.h
@ -131,15 +133,9 @@ declare const enum DAL {
MICROBIT_ID_IO_P5 = 12,
MICROBIT_ID_IO_P6 = 13,
MICROBIT_ID_IO_P7 = 14,
MICROBIT_ID_IO_P8 = 15,
MICROBIT_ID_IO_P9 = 16,
MICROBIT_ID_IO_P10 = 17,
MICROBIT_ID_IO_P11 = 18,
MICROBIT_ID_IO_P12 = 19,
MICROBIT_ID_IO_P13 = 20,
MICROBIT_ID_IO_P14 = 21,
MICROBIT_ID_IO_P15 = 22,
MICROBIT_ID_IO_P16 = 23,
MICROBIT_ID_IO_P19 = 24,
MICROBIT_ID_IO_P20 = 25,
MICROBIT_ID_BUTTON_AB = 26,
@ -149,6 +145,13 @@ declare const enum DAL {
MICROBIT_ID_RADIO_DATA_READY = 30,
MICROBIT_ID_MULTIBUTTON_ATTACH = 31,
MICROBIT_ID_SERIAL = 32,
CALLIOPE_ID_IO_P0 = 33,
CALLIOPE_ID_IO_P7 = 34,
CALLIOPE_ID_IO_P8 = 35,
CALLIOPE_ID_IO_P9 = 36,
CALLIOPE_ID_IO_P13 = 37,
CALLIOPE_ID_IO_P14 = 38,
CALLIOPE_ID_IO_P15 = 39,
MICROBIT_ID_MESSAGE_BUS_LISTENER = 1021,
MICROBIT_ID_NOTIFY_ONE = 1022,
MICROBIT_ID_NOTIFY = 1023,
@ -186,15 +189,220 @@ declare const enum DAL {
MICROBIT_DISPLAY_EVT_FREE = 1,
MICROBIT_SERIAL_EVT_TX_EMPTY = 2,
MICROBIT_UART_S_EVT_TX_EMPTY = 3,
// built/yt/yotta_modules/microbit-dal/inc//drivers/CalliopeRGB.h
RGB_LED_DEFAULT_GREEN = 0,
RGB_LED_DEFAULT_RED = 0,
RGB_LED_DEFAULT_BLUE = 0,
RGB_LED_DEFAULT_WHITE = 0,
RGB_KEEP_VALUE = -1,
RGB_LED_MAX_INTENSITY = 50,
// built/yt/yotta_modules/microbit-dal/inc//drivers/CalliopeSoundMotor.h
CALLIOPE_SM_DEFAULT_DUTY_M = 50,
CALLIOPE_SM_DEFAULT_DUTY_S = 100,
CALLIOPE_SM_DEFAULT_FREQUENCY_S = 4000,
CALLIOPE_SM_DEFAULT_SILENT_MODE = 1,
CALLIOPE_SM_PRESCALER_M = 2,
CALLIOPE_SM_PRESCALER_S = 0,
CALLIOPE_SM_PRESCALER_S_LF = 4,
CALLIOPE_SM_PERIOD_M = 100,
CALLIOPE_MIN_FREQUENCY_HZ_S_NP = 245,
CALLIOPE_MIN_FREQUENCY_HZ_S = 20,
CALLIOPE_MAX_FREQUENCY_HZ_S = 20000,
CALLIOPE_BOARD_FREQUENCY = 16000000,
// built/yt/yotta_modules/microbit-dal/inc//drivers/DynamicPwm.h
NO_PWMS = 3,
MICROBIT_DEFAULT_PWM_PERIOD = 20000,
PWM_PERSISTENCE_TRANSIENT = 1,
PWM_PERSISTENCE_PERSISTENT = 2,
// built/yt/yotta_modules/microbit-dal/inc//drivers/MicroBitAccelerometer.h
// built/yt/yotta_modules/microbit-dal/inc//drivers/MicroBitAccelerometer-bmx.h
BMX055_ACC_WHOAMI = 0x00,
BMX055_ACC_D_X_LSB = 0x02,
BMX055_ACC_D_X_MSB = 0x03,
BMX055_ACC_D_Y_LSB = 0x04,
BMX055_ACC_D_Y_MSB = 0x05,
BMX055_ACC_D_Z_LSB = 0x06,
BMX055_ACC_D_Z_MSB = 0x07,
BMX055_ACC_D_TEMP = 0x08,
BMX055_ACC_INT_STATUS_0 = 0x09,
BMX055_ACC_INT_STATUS_1 = 0x0A,
BMX055_ACC_INT_STATUS_2 = 0x0B,
BMX055_ACC_INT_STATUS_3 = 0x0C,
BMX055_ACC_FIFO_STATUS = 0x0E,
BMX055_ACC_PMU_RANGE = 0x0F,
BMX055_ACC_PMU_BW = 0x10,
BMX055_ACC_PMU_LPW = 0x11,
BMX055_ACC_PMU_LOW_POWER = 0x12,
BMX055_ACC_D_HBW = 0x13,
BMX055_ACC_BGW_SOFTRESET = 0x14,
BMX055_ACC_INT_EN_0 = 0x16,
BMX055_ACC_INT_EN_1 = 0x17,
BMX055_ACC_INT_EN_2 = 0x18,
BMX055_ACC_INT_MAP_0 = 0x19,
BMX055_ACC_INT_MAP_1 = 0x1A,
BMX055_ACC_INT_MAP_2 = 0x1B,
BMX055_ACC_INT_SRC = 0x1E,
BMX055_ACC_INT_OUT_CTRL = 0x20,
BMX055_ACC_INT_RST_LATCH = 0x21,
BMX055_ACC_INT_0 = 0x22,
BMX055_ACC_INT_1 = 0x23,
BMX055_ACC_INT_2 = 0x24,
BMX055_ACC_INT_3 = 0x25,
BMX055_ACC_INT_4 = 0x26,
BMX055_ACC_INT_5 = 0x27,
BMX055_ACC_INT_6 = 0x28,
BMX055_ACC_INT_7 = 0x29,
BMX055_ACC_INT_8 = 0x2A,
BMX055_ACC_INT_9 = 0x2B,
BMX055_ACC_INT_A = 0x2C,
BMX055_ACC_INT_B = 0x2D,
BMX055_ACC_INT_C = 0x2E,
BMX055_ACC_INT_D = 0x2F,
BMX055_ACC_FIFO_CONFIG_0 = 0x30,
BMX055_ACC_PMU_SELF_TEST = 0x32,
BMX055_ACC_TRIM_NVM_CTRL = 0x33,
BMX055_ACC_BGW_SPI3_WDT = 0x34,
BMX055_ACC_OFC_CTRL = 0x36,
BMX055_ACC_OFC_SETTING = 0x37,
BMX055_ACC_OFC_OFFSET_X = 0x38,
BMX055_ACC_OFC_OFFSET_Y = 0x39,
BMX055_ACC_OFC_OFFSET_Z = 0x3A,
BMX055_ACC_TRIM_GPO = 0x3B,
BMX055_ACC_TRIM_GP1 = 0x3C,
BMX055_ACC_FIFO_CONFIG_1 = 0x3E,
BMX055_ACC_FIFO_DATA = 0x3F,
BMX055_GYRO_WHOAMI = 0x00,
BMX055_GYRO_RATE_X_LSB = 0x02,
BMX055_GYRO_RATE_X_MSB = 0x03,
BMX055_GYRO_RATE_Y_LSB = 0x04,
BMX055_GYRO_RATE_Y_MSB = 0x05,
BMX055_GYRO_RATE_Z_LSB = 0x06,
BMX055_GYRO_RATE_Z_MSB = 0x07,
BMX055_GYRO_INT_STATUS_0 = 0x09,
BMX055_GYRO_INT_STATUS_1 = 0x0A,
BMX055_GYRO_INT_STATUS_2 = 0x0B,
BMX055_GYRO_INT_STATUS_3 = 0x0C,
BMX055_GYRO_FIFO_STATUS = 0x0E,
BMX055_GYRO_RANGE = 0x0F,
BMX055_GYRO_BW = 0x10,
BMX055_GYRO_LPM1 = 0x11,
BMX055_GYRO_LPM2 = 0x12,
BMX055_GYRO_RATE_HBW = 0x13,
BMX055_GYRO_BGW_SOFTRESET = 0x14,
BMX055_GYRO_INT_EN_0 = 0x15,
BMX055_GYRO_INT_EN_1 = 0x16,
BMX055_GYRO_INT_MAP_0 = 0x17,
BMX055_GYRO_INT_MAP_1 = 0x18,
BMX055_GYRO_INT_MAP_2 = 0x19,
BMX055_GYRO_INT_SRC_1 = 0x1A,
BMX055_GYRO_INT_SRC_2 = 0x1B,
BMX055_GYRO_INT_SRC_3 = 0x1C,
BMX055_GYRO_FIFO_EN = 0x1E,
BMX055_GYRO_INT_RST_LATCH = 0x21,
BMX055_GYRO_HIGH_TH_X = 0x22,
BMX055_GYRO_HIGH_DUR_X = 0x23,
BMX055_GYRO_HIGH_TH_Y = 0x24,
BMX055_GYRO_HIGH_DUR_Y = 0x25,
BMX055_GYRO_HIGH_TH_Z = 0x26,
BMX055_GYRO_HIGH_DUR_Z = 0x27,
BMX055_GYRO_SOC = 0x31,
BMX055_GYRO_A_FOC = 0x32,
BMX055_GYRO_TRIM_NVM_CTRL = 0x33,
BMX055_GYRO_BGW_SPI3_WDT = 0x34,
BMX055_GYRO_OFC1 = 0x36,
BMX055_GYRO_OFC2 = 0x37,
BMX055_GYRO_OFC3 = 0x38,
BMX055_GYRO_OFC4 = 0x39,
BMX055_GYRO_TRIM_GP0 = 0x3A,
BMX055_GYRO_TRIM_GP1 = 0x3B,
BMX055_GYRO_BIST = 0x3C,
BMX055_GYRO_FIFO_CONFIG_0 = 0x3D,
BMX055_GYRO_FIFO_CONFIG_1 = 0x3E,
BMX055_MAG_WHOAMI = 0x40,
BMX055_MAG_Reserved = 0x41,
BMX055_MAG_XOUT_LSB = 0x42,
BMX055_MAG_XOUT_MSB = 0x43,
BMX055_MAG_YOUT_LSB = 0x44,
BMX055_MAG_YOUT_MSB = 0x45,
BMX055_MAG_ZOUT_LSB = 0x46,
BMX055_MAG_ZOUT_MSB = 0x47,
BMX055_MAG_ROUT_LSB = 0x48,
BMX055_MAG_ROUT_MSB = 0x49,
BMX055_MAG_INT_STATUS = 0x4A,
BMX055_MAG_PWR_CNTL1 = 0x4B,
BMX055_MAG_PWR_CNTL2 = 0x4C,
BMX055_MAG_INT_EN_1 = 0x4D,
BMX055_MAG_INT_EN_2 = 0x4E,
BMX055_MAG_LOW_THS = 0x4F,
BMX055_MAG_HIGH_THS = 0x50,
BMX055_MAG_REP_XY = 0x51,
BMX055_MAG_REP_Z = 0x52,
BMM050_DIG_X1 = 0x5D,
BMM050_DIG_Y1 = 0x5E,
BMM050_DIG_Z4_LSB = 0x62,
BMM050_DIG_Z4_MSB = 0x63,
BMM050_DIG_X2 = 0x64,
BMM050_DIG_Y2 = 0x65,
BMM050_DIG_Z2_LSB = 0x68,
BMM050_DIG_Z2_MSB = 0x69,
BMM050_DIG_Z1_LSB = 0x6A,
BMM050_DIG_Z1_MSB = 0x6B,
BMM050_DIG_XYZ1_LSB = 0x6C,
BMM050_DIG_XYZ1_MSB = 0x6D,
BMM050_DIG_Z3_LSB = 0x6E,
BMM050_DIG_Z3_MSB = 0x6F,
BMM050_DIG_XY2 = 0x70,
BMM050_DIG_XY1 = 0x71,
BMX055_ACC_ADDRESS = 0x18,
BMX055_GYRO_ADDRESS = 0x68,
BMX055_MAG_ADDRESS = 0x10,
MS5637_ADDRESS = 0x76,
AFS_2G = 0x03,
AFS_4G = 0x05,
AFS_8G = 0x08,
AFS_16G = 0x0C,
ABW_8Hz = 0,
ABW_16Hz = 1,
ABW_31Hz = 2,
ABW_63Hz = 3,
ABW_125Hz = 4,
ABW_250Hz = 5,
ABW_500Hz = 6,
ABW_100Hz = 7,
GFS_2000DPS = 0,
GFS_1000DPS = 1,
GFS_500DPS = 2,
GFS_250DPS = 3,
GFS_125DPS = 4,
G_2000Hz523Hz = 0,
G_2000Hz230Hz = 1,
G_1000Hz116Hz = 2,
G_400Hz47Hz = 3,
G_200Hz23Hz = 4,
G_100Hz12Hz = 5,
G_200Hz64Hz = 6,
G_100Hz32Hz = 7,
MODR_10Hz = 0,
MODR_2Hz = 1,
MODR_6Hz = 2,
MODR_8Hz = 3,
MODR_15Hz = 4,
MODR_20Hz = 5,
MODR_25Hz = 6,
MODR_30Hz = 7,
lowPower = 0,
Regular = 1,
enhancedRegular = 2,
highAccuracy = 3,
ADC_256 = 0x00,
ADC_512 = 0x02,
ADC_1024 = 0x04,
ADC_2048 = 0x06,
ADC_4096 = 0x08,
ADC_8192 = 0x0A,
ADC_D1 = 0x40,
ADC_D2 = 0x50,
MICROBIT_ACCEL_PITCH_ROLL_VALID = 0x02,
MICROBIT_ACCEL_ADDED_TO_IDLE = 0x04,
MMA8653_DEFAULT_ADDR = 0x3A,
MMA8653_STATUS = 0x00,
MMA8653_OUT_X_MSB = 0x01,
MMA8653_WHOAMI = 0x0D,
@ -231,6 +439,7 @@ declare const enum DAL {
MICROBIT_ACCELEROMETER_SHAKE_DAMPING = 10,
MICROBIT_ACCELEROMETER_SHAKE_RTX = 30,
MICROBIT_ACCELEROMETER_SHAKE_COUNT_THRESHOLD = 4,
// built/yt/yotta_modules/microbit-dal/inc//drivers/MicroBitAccelerometer.h
// built/yt/yotta_modules/microbit-dal/inc//drivers/MicroBitButton.h
MICROBIT_BUTTON_EVT_DOWN = 1,
MICROBIT_BUTTON_EVT_UP = 2,
@ -335,6 +544,7 @@ declare const enum DAL {
IO_STATUS_TOUCH_IN = 0x10,
IO_STATUS_EVENT_ON_EDGE = 0x20,
IO_STATUS_EVENT_PULSE_ON_EDGE = 0x40,
IO_STATUS_EVENTBUS_ENABLED = 0x80,
MICROBIT_PIN_MAX_OUTPUT = 1023,
MICROBIT_PIN_MAX_SERVO_RANGE = 180,
MICROBIT_PIN_DEFAULT_SERVO_RANGE = 2000,
@ -349,6 +559,7 @@ declare const enum DAL {
MICROBIT_PIN_EVT_PULSE_LO = 5,
PIN_CAPABILITY_DIGITAL = 0x01,
PIN_CAPABILITY_ANALOG = 0x02,
PIN_CAPABILITY_TOUCH = 0x04,
// built/yt/yotta_modules/microbit-dal/inc//drivers/MicroBitRadio.h
MICROBIT_RADIO_STATUS_INITIALISED = 0x0001,
MICROBIT_RADIO_BASE_ADDRESS = 0x75626974,

View File

@ -151,15 +151,15 @@ declare namespace input {
MICROBIT_ID_IO_P5 = 12, // MICROBIT_ID_IO_P5
MICROBIT_ID_IO_P6 = 13, // MICROBIT_ID_IO_P6
MICROBIT_ID_IO_P7 = 14, // MICROBIT_ID_IO_P7
MICROBIT_ID_IO_P8 = 15, // MICROBIT_ID_IO_P8
//MICROBIT_ID_IO_P8_ = MICROBIT_ID_IO_P8,
MICROBIT_ID_IO_P9 = 16, // MICROBIT_ID_IO_P9
MICROBIT_ID_IO_P10 = 17, // MICROBIT_ID_IO_P10
MICROBIT_ID_IO_P11 = 18, // MICROBIT_ID_IO_P11
MICROBIT_ID_IO_P12 = 19, // MICROBIT_ID_IO_P12
MICROBIT_ID_IO_P13 = 20, // MICROBIT_ID_IO_P13
MICROBIT_ID_IO_P14 = 21, // MICROBIT_ID_IO_P14
MICROBIT_ID_IO_P15 = 22, // MICROBIT_ID_IO_P15
MICROBIT_ID_IO_P16 = 23, // MICROBIT_ID_IO_P16
//MICROBIT_ID_IO_P12_ = MICROBIT_ID_IO_P12,
//MICROBIT_ID_IO_P13_ = MICROBIT_ID_IO_P13,
//MICROBIT_ID_IO_P14_ = MICROBIT_ID_IO_P14,
//MICROBIT_ID_IO_P15_ = MICROBIT_ID_IO_P15,
//MICROBIT_ID_IO_P16_ = MICROBIT_ID_IO_P16,
MICROBIT_ID_IO_P19 = 24, // MICROBIT_ID_IO_P19
MICROBIT_ID_IO_P20 = 25, // MICROBIT_ID_IO_P20
MES_DEVICE_INFO_ID = 1103, // MES_DEVICE_INFO_ID
@ -250,15 +250,15 @@ declare namespace led {
P5 = 12, // MICROBIT_ID_IO_P5
P6 = 13, // MICROBIT_ID_IO_P6
P7 = 14, // MICROBIT_ID_IO_P7
P8 = 15, // MICROBIT_ID_IO_P8
//P8 = MICROBIT_ID_IO_P8,
P9 = 16, // MICROBIT_ID_IO_P9
P10 = 17, // MICROBIT_ID_IO_P10
P11 = 18, // MICROBIT_ID_IO_P11
P12 = 19, // MICROBIT_ID_IO_P12
P13 = 20, // MICROBIT_ID_IO_P13
P14 = 21, // MICROBIT_ID_IO_P14
P15 = 22, // MICROBIT_ID_IO_P15
P16 = 23, // MICROBIT_ID_IO_P16
//P12 = MICROBIT_ID_IO_P12,
//P13 = MICROBIT_ID_IO_P13,
//P14 = MICROBIT_ID_IO_P14,
//P15 = MICROBIT_ID_IO_P15,
//P16 = MICROBIT_ID_IO_P16,
P19 = 24, // MICROBIT_ID_IO_P19
P20 = 25, // MICROBIT_ID_IO_P20
}
@ -294,12 +294,12 @@ declare namespace led {
P0 = 7, // MICROBIT_ID_IO_P0
P1 = 8, // MICROBIT_ID_IO_P1
P2 = 9, // MICROBIT_ID_IO_P2
P8 = 15, // MICROBIT_ID_IO_P8
P12 = 19, // MICROBIT_ID_IO_P12
P13 = 20, // MICROBIT_ID_IO_P13
P14 = 21, // MICROBIT_ID_IO_P14
P15 = 22, // MICROBIT_ID_IO_P15
P16 = 23, // MICROBIT_ID_IO_P16
//P8 = MICROBIT_ID_IO_P8,
//P12 = MICROBIT_ID_IO_P12,
//P13 = MICROBIT_ID_IO_P13,
//P14 = MICROBIT_ID_IO_P14,
//P15 = MICROBIT_ID_IO_P15,
//P16 = MICROBIT_ID_IO_P16
}

View File

@ -122,7 +122,7 @@ namespace input {
}
/**
* Attaches code to run when the screen is facing up.
* Do something when when a gesture is done (like shaking the micro:bit).
* @param body TODO
*/
//% help=input/on-gesture weight=84 blockGap=8
@ -199,7 +199,7 @@ namespace input {
}
/**
* Get the current compass compass heading in degrees.
* Get the current compass heading in degrees.
*/
//% help=input/compass-heading
//% weight=56 icon="\uf14e"
@ -257,7 +257,7 @@ namespace input {
}
/**
* The pitch of the device, rotation along the ``x-axis``, in degrees.
* The pitch or roll of the device, rotation along the ``x-axis`` or ``y-axis``, in degrees.
* @param kind TODO
*/
//% help=input/rotation weight=52

View File

@ -1,4 +1,5 @@
enum Note {
//% blockIdentity=music.noteFrequency
C = 262,
//% block=C#
//% blockIdentity=music.noteFrequency
@ -114,7 +115,7 @@ enum BeatFraction {
//% block="1/2"
Half = 2,
//% block="1/4"
Quater = 4,
Quarter = 4,
//% block="1/8"
Eighth = 8,
//% block="1/16"
@ -191,7 +192,7 @@ namespace music {
let beat = 60000 / beatsPerMinute;
if (fraction == BeatFraction.Whole) return beat;
else if (fraction == BeatFraction.Half) return beat / 2;
else if (fraction == BeatFraction.Quater) return beat / 4
else if (fraction == BeatFraction.Quarter) return beat / 4
else if (fraction == BeatFraction.Eighth) return beat / 8;
else return beat / 16;
}

View File

@ -9,15 +9,15 @@ enum class DigitalPin {
P5 = MICROBIT_ID_IO_P5,
P6 = MICROBIT_ID_IO_P6,
P7 = MICROBIT_ID_IO_P7,
P8 = MICROBIT_ID_IO_P8,
//P8 = MICROBIT_ID_IO_P8,
P9 = MICROBIT_ID_IO_P9,
P10 = MICROBIT_ID_IO_P10,
P11 = MICROBIT_ID_IO_P11,
P12 = MICROBIT_ID_IO_P12,
P13 = MICROBIT_ID_IO_P13,
P14 = MICROBIT_ID_IO_P14,
P15 = MICROBIT_ID_IO_P15,
P16 = MICROBIT_ID_IO_P16,
//P12 = MICROBIT_ID_IO_P12,
//P13 = MICROBIT_ID_IO_P13,
//P14 = MICROBIT_ID_IO_P14,
//P15 = MICROBIT_ID_IO_P15,
//P16 = MICROBIT_ID_IO_P16,
P19 = MICROBIT_ID_IO_P19,
P20 = MICROBIT_ID_IO_P20,
};
@ -55,15 +55,15 @@ MicroBitPin *getPin(int id) {
case MICROBIT_ID_IO_P5: return &uBit.io.P5;
case MICROBIT_ID_IO_P6: return &uBit.io.P6;
case MICROBIT_ID_IO_P7: return &uBit.io.P7;
case MICROBIT_ID_IO_P8: return &uBit.io.P8;
//case MICROBIT_ID_IO_P8: return &uBit.io.P8;
case MICROBIT_ID_IO_P9: return &uBit.io.P9;
case MICROBIT_ID_IO_P10: return &uBit.io.P10;
case MICROBIT_ID_IO_P11: return &uBit.io.P11;
case MICROBIT_ID_IO_P12: return &uBit.io.P12;
case MICROBIT_ID_IO_P13: return &uBit.io.P13;
case MICROBIT_ID_IO_P14: return &uBit.io.P14;
case MICROBIT_ID_IO_P15: return &uBit.io.P15;
case MICROBIT_ID_IO_P16: return &uBit.io.P16;
//case MICROBIT_ID_IO_P12: return &uBit.io.P12;
//case MICROBIT_ID_IO_P13: return &uBit.io.P13;
//case MICROBIT_ID_IO_P14: return &uBit.io.P14;
//case MICROBIT_ID_IO_P15: return &uBit.io.P15;
//case MICROBIT_ID_IO_P16: return &uBit.io.P16;
case MICROBIT_ID_IO_P19: return &uBit.io.P19;
case MICROBIT_ID_IO_P20: return &uBit.io.P20;
default: return NULL;

View File

@ -14,6 +14,7 @@
"helpers.ts",
"images.cpp",
"basic.cpp",
"basic.ts",
"input.cpp",
"input.ts",
"control.ts",

View File

@ -4,12 +4,12 @@ enum class SerialPin {
P0 = MICROBIT_ID_IO_P0,
P1 = MICROBIT_ID_IO_P1,
P2 = MICROBIT_ID_IO_P2,
P8 = MICROBIT_ID_IO_P8,
P12 = MICROBIT_ID_IO_P12,
P13 = MICROBIT_ID_IO_P13,
P14 = MICROBIT_ID_IO_P14,
P15 = MICROBIT_ID_IO_P15,
P16 = MICROBIT_ID_IO_P16
//P8 = MICROBIT_ID_IO_P8,
//P12 = MICROBIT_ID_IO_P12,
//P13 = MICROBIT_ID_IO_P13,
//P14 = MICROBIT_ID_IO_P14,
//P15 = MICROBIT_ID_IO_P15,
//P16 = MICROBIT_ID_IO_P16
};
enum class BaudRate {

View File

@ -224,7 +224,7 @@ declare namespace input {
function onButtonPressed(button: Button, body: () => void): void;
/**
* Attaches code to run when the screen is facing up.
* Do something when when a gesture is done (like shaking the micro:bit).
* @param body TODO
*/
//% help=input/on-gesture weight=84 blockGap=8
@ -270,7 +270,7 @@ declare namespace input {
function pinIsPressed(name: TouchPin): boolean;
/**
* Get the current compass compass heading in degrees.
* Get the current compass heading in degrees.
*/
//% help=input/compass-heading
//% weight=56 icon="\uf14e"
@ -305,7 +305,7 @@ declare namespace input {
function lightLevel(): number;
/**
* The pitch of the device, rotation along the ``x-axis``, in degrees.
* The pitch or roll of the device, rotation along the ``x-axis`` or ``y-axis``, in degrees.
* @param kind TODO
*/
//% help=input/rotation weight=52

View File

@ -1,7 +1,7 @@
{
"name": "pxt-microbit",
"version": "0.4.13",
"description": "micro:bit target for PXT",
"name": "pxt-calliope",
"version": "0.4.22",
"description": "calliope target for PXT",
"keywords": [
"JavaScript",
"education",
@ -9,11 +9,11 @@
],
"repository": {
"type": "git",
"url": "git+https://github.com/Microsoft/pxt-microbit.git"
"url": "git+https://github.com/Microsoft/pxt-calliope.git"
},
"author": "",
"license": "MIT",
"homepage": "https://github.com/Microsoft/pxt-microbit#readme",
"homepage": "https://github.com/Microsoft/pxt-calliope#readme",
"files": [
"README.md",
"pxtarget.json",
@ -29,6 +29,6 @@
"typescript": "^1.8.7"
},
"dependencies": {
"pxt-core": "0.4.17"
"pxt-core": "0.4.39"
}
}

View File

@ -1,8 +1,8 @@
{
"id": "microbit",
"name": "code the micro:bit",
"title": "code the micro:bit - Blocks / Javascript editor",
"description": "A Blocks / JavaScript code editor for the micro:bit.",
"id": "calliope",
"name": " calliope",
"title": "calliope - Blocks / Javascript editor",
"description": "A Blocks / JavaScript code editor for the calliope.",
"corepkg": "microbit",
"bundleddirs": [
"libs/microbit",
@ -14,10 +14,6 @@
"workspace": false,
"packages": true,
"preferredPackages": [
"Microsoft/pxt-neopixel",
"Microsoft/pxt-sonar",
"Microsoft/pxt-max6675",
"Microsoft/pxt-i2c-fram"
]
},
"blocksprj": {
@ -63,9 +59,9 @@
"compile": {
"isNative": false,
"hasHex": true,
"deployDrives": "(MICROBIT|MBED)",
"driveName": "MICROBIT",
"hexMimeType": "application/x-microbit-hex"
"deployDrives": "MINI",
"driveName": "MINI",
"hexMimeType": "application/x-calliope-hex"
},
"runtime": {
"mathBlocks": true,
@ -76,7 +72,7 @@
"simulator": {
"autoRun": true,
"streams": true,
"aspectRatio": 1.22,
"aspectRatio": 1.08,
"parts": true,
"partsAspectRatio": 0.69,
"builtinParts": {
@ -86,10 +82,11 @@
"speaker": true,
"bluetooth": true,
"thermometer": true,
"compass": true
"compass": true,
"headphone": true
},
"boardDefinition": {
"visual": "microbit",
"visual": "calliope",
"gpioPinBlocks": [
[
"P0"
@ -165,9 +162,16 @@
],
"attachPowerOnRight": true,
"onboardComponents": [
"accelerometer",
"buttonpair",
"ledmatrix",
"speaker"
"speaker",
"bluetooth",
"thermometer",
"compass",
"speaker",
"microphone",
"rgbled"
],
"useCrocClips": true,
"marginWhenBreadboarding": [
@ -180,10 +184,10 @@
},
"compileService": {
"yottaTarget": "bbc-microbit-classic-gcc",
"yottaCorePackage": "pxt-microbit-core",
"githubCorePackage": "microsoft/pxt-microbit-core",
"gittag": "v0.5.0",
"serviceId": "ws"
"yottaCorePackage": "pxt-calliope-core",
"githubCorePackage": "microsoft/pxt-calliope-core",
"gittag": "v0.5.2",
"serviceId": "calliope"
},
"serial": {
"manufacturerFilter": "^mbed$",
@ -192,19 +196,18 @@
},
"appTheme": {
"accentColor": "#5C005C",
"logoUrl": "https://codethemicrobit.com/about",
"logo": "./static/microbit.simplified.svg",
"docsLogo": "./static/microbit.simplified.svg",
"portraitLogo": "./static/microbit.simplified.svg",
"footerLogo": "./static/microbit.simplified.svg",
"logoUrl": "https://calliope.cc/about",
"logo": "./static/Logo_Calliope_Woman.svg",
"docsLogo": "./static/Logo_Calliope_Woman.svg",
"portraitLogo": "./static/Logo_Calliope_Woman.svg",
"footerLogo": "./static/Logo_Calliope_Woman.svg",
"cardLogo": "https://az851932.vo.msecnd.net/pub/drbwxcth",
"appLogo": "https://az851932.vo.msecnd.net/pub/tbhemtig",
"organizationLogo": "./static/Microsoft-logo_rgb_c-gray.png",
"homeUrl": "https://codethemicrobit.com/",
"embedUrl": "https://codethemicrobit.com/",
"homeUrl": "https://calliope.cc/",
"privacyUrl": "https://go.microsoft.com/fwlink/?LinkId=521839",
"termsOfUseUrl": "https://go.microsoft.com/fwlink/?LinkID=206977",
"githubUrl": "https://github.com/Microsoft/pxt-microbit",
"githubUrl": "https://github.com/Microsoft/pxt-calliope",
"browserSupport": [
{
"name": "unsupported",
@ -323,9 +326,5 @@
"path": "/static/mb/device/usb-windows-sendto.jpg"
}
]
},
"analytics": {
"userVoiceApiKey": "WEkkIGaj1WtJnSUF59iwaA",
"userVoiceForumId": 402381
}
}

View File

@ -13,6 +13,7 @@ namespace pxsim {
buttonPairState: ButtonPairState;
radioState: RadioState;
neopixelState: NeoPixelState;
rgbLedState: number;
constructor() {
super()
@ -36,19 +37,19 @@ namespace pxsim {
DAL.MICROBIT_ID_IO_P5,
DAL.MICROBIT_ID_IO_P6,
DAL.MICROBIT_ID_IO_P7,
DAL.MICROBIT_ID_IO_P8,
0, //DAL.MICROBIT_ID_IO_P8,
DAL.MICROBIT_ID_IO_P9,
DAL.MICROBIT_ID_IO_P10,
DAL.MICROBIT_ID_IO_P11,
DAL.MICROBIT_ID_IO_P12,
DAL.MICROBIT_ID_IO_P13,
DAL.MICROBIT_ID_IO_P14,
DAL.MICROBIT_ID_IO_P15,
DAL.MICROBIT_ID_IO_P16,
0, //DAL.MICROBIT_ID_IO_P12,
0, //DAL.MICROBIT_ID_IO_P13,
0, //DAL.MICROBIT_ID_IO_P14,
0, //DAL.MICROBIT_ID_IO_P15,
0, //DAL.MICROBIT_ID_IO_P16,
0,
0,
DAL.MICROBIT_ID_IO_P19,
DAL.MICROBIT_ID_IO_P20
DAL.MICROBIT_ID_IO_P20
]
});
this.builtinParts["radio"] = this.radioState = new RadioState(runtime);
@ -61,11 +62,11 @@ namespace pxsim {
this.builtinVisuals["buttonpair"] = () => new visuals.ButtonPairView();
this.builtinVisuals["ledmatrix"] = () => new visuals.LedMatrixView();
this.builtinVisuals["neopixel"] = () => new visuals.NeoPixelView();
this.builtinVisuals["neopixel"] = () => new visuals.NeoPixelView();
this.builtinPartVisuals["buttonpair"] = (xy: visuals.Coord) => visuals.mkBtnSvg(xy);
this.builtinPartVisuals["ledmatrix"] = (xy: visuals.Coord) => visuals.mkLedMatrixSvg(xy, 8, 8);
this.builtinPartVisuals["neopixel"] = (xy: visuals.Coord) => visuals.mkNeoPixelPart(xy);
this.builtinPartVisuals["neopixel"] = (xy: visuals.Coord) => visuals.mkNeoPixelPart(xy);
}
receiveMessage(msg: SimulatorMessage) {
@ -97,7 +98,7 @@ namespace pxsim {
const cmpDefs = msg.partDefinitions || {};
const fnArgs = msg.fnArgs;
const opts : visuals.BoardHostOpts = {
const opts: visuals.BoardHostOpts = {
state: this,
boardDef: boardDef,
partsList: cmpsList,
@ -106,7 +107,9 @@ namespace pxsim {
maxWidth: "100%",
maxHeight: "100%",
};
const viewHost = new visuals.BoardHost(pxsim.visuals.mkBoardView(opts), opts);
const viewHost = new visuals.BoardHost(pxsim.visuals.mkBoardView({
visual: boardDef.visual
}), opts);
document.body.innerHTML = ""; // clear children
document.body.appendChild(viewHost.getView());

View File

@ -8,575 +8,33 @@ import pxtrunner = pxt.runner;
import pxtdocs = pxt.docs;
namespace pxsim.instructions {
const LOC_LBL_SIZE = 10;
const QUANT_LBL_SIZE = 30;
const QUANT_LBL = (q: number) => `${q}x`;
const WIRE_QUANT_LBL_SIZE = 20;
const LBL_VERT_PAD = 3;
const LBL_RIGHT_PAD = 5;
const LBL_LEFT_PAD = 5;
const REQ_WIRE_HEIGHT = 45;
const REQ_CMP_HEIGHT = 55;
const REQ_CMP_SCALE = 0.5 * 3;
type Orientation = "landscape" | "portrait";
const ORIENTATION: Orientation = "portrait";
const PPI = 96.0;
const PAGE_SCALAR = 0.95;
const [FULL_PAGE_WIDTH, FULL_PAGE_HEIGHT]
= (ORIENTATION == "portrait" ? [PPI * 8.5 * PAGE_SCALAR, PPI * 11.0 * PAGE_SCALAR] : [PPI * 11.0 * PAGE_SCALAR, PPI * 8.5 * PAGE_SCALAR]);
const PAGE_MARGIN = PPI * 0.45;
const PAGE_WIDTH = FULL_PAGE_WIDTH - PAGE_MARGIN * 2;
const PAGE_HEIGHT = FULL_PAGE_HEIGHT - PAGE_MARGIN * 2;
const BORDER_COLOR = "gray";
const BORDER_RADIUS = 5 * 4;
const BORDER_WIDTH = 2 * 2;
const [PANEL_ROWS, PANEL_COLS] = [1, 1];
const PANEL_MARGIN = 20;
const PANEL_PADDING = 8 * 3;
const PANEL_WIDTH = PAGE_WIDTH / PANEL_COLS - (PANEL_MARGIN + PANEL_PADDING + BORDER_WIDTH) * PANEL_COLS;
const PANEL_HEIGHT = PAGE_HEIGHT / PANEL_ROWS - (PANEL_MARGIN + PANEL_PADDING + BORDER_WIDTH) * PANEL_ROWS;
const BOARD_WIDTH = 465;
const BOARD_LEFT = (PANEL_WIDTH - BOARD_WIDTH) / 2.0 + PANEL_PADDING;
const BOARD_BOT = PANEL_PADDING;
const NUM_BOX_SIZE = 120;
const NUM_FONT = 80;
const NUM_MARGIN = 10;
const FRONT_PAGE_BOARD_WIDTH = 400;
const PART_SCALAR = 2.3
const PARTS_BOARD_SCALE = 0.17;
const PARTS_BB_SCALE = 0.25;
const PARTS_CMP_SCALE = 0.3;
const PARTS_WIRE_SCALE = 0.23;
const BACK_PAGE_BOARD_WIDTH = PANEL_WIDTH - PANEL_PADDING * 1.5;
const STYLE = `
.instr-panel {
margin: ${PANEL_MARGIN}px;
padding: ${PANEL_PADDING}px;
border-width: ${BORDER_WIDTH}px;
border-color: ${BORDER_COLOR};
border-style: solid;
border-radius: ${BORDER_RADIUS}px;
display: inline-block;
width: ${PANEL_WIDTH}px;
height: ${PANEL_HEIGHT}px;
position: relative;
overflow: hidden;
page-break-inside: avoid;
}
.board-svg {
margin: 0 auto;
display: block;
position: absolute;
bottom: ${BOARD_BOT}px;
left: ${BOARD_LEFT}px;
}
.panel-num-outer {
position: absolute;
left: ${-BORDER_WIDTH}px;
top: ${-BORDER_WIDTH}px;
width: ${NUM_BOX_SIZE}px;
height: ${NUM_BOX_SIZE}px;
border-width: ${BORDER_WIDTH}px;
border-style: solid;
border-color: ${BORDER_COLOR};
border-radius: ${BORDER_RADIUS}px 0 ${BORDER_RADIUS}px 0;
}
.panel-num {
margin: ${NUM_MARGIN}px 0;
text-align: center;
font-size: ${NUM_FONT}px;
}
.cmp-div {
display: inline-block;
}
.reqs-div {
margin-left: ${PANEL_PADDING + NUM_BOX_SIZE}px;
margin-top: 5px;
}
.partslist-wire,
.partslist-cmp {
margin: 10px;
}
.partslist-wire {
display: inline-block;
}
`;
function addClass(el: HTMLElement, cls: string) {
//TODO move to library
if (el.classList) el.classList.add(cls);
//BUG: won't work if element has class that is prefix of new class
//TODO: make github issue (same issue exists svg.addClass)
else if (!el.className.indexOf(cls)) el.className += " " + cls;
}
function mkTxt(p: [number, number], txt: string, size: number) {
let el = svg.elt("text")
let [x, y] = p;
svg.hydrate(el, { x: x, y: y, style: `font-size:${size}px;` });
el.textContent = txt;
return el;
}
type mkCmpDivOpts = {
top?: string,
topSize?: number,
right?: string,
rightSize?: number,
left?: string,
leftSize?: number,
bot?: string,
botSize?: number,
wireClr?: string,
cmpWidth?: number,
cmpHeight?: number,
cmpScale?: number,
crocClips?: boolean
};
function mkBoardImgSvg(def: string | BoardImageDefinition): visuals.SVGElAndSize {
let boardView: visuals.BoardView;
if (def === "microbit") {
boardView = new visuals.MicrobitBoardSvg({
theme: visuals.randomTheme()
})
} else {
boardView = new visuals.GenericBoardSvg({
visualDef: <BoardImageDefinition>def
})
}
return boardView.getView();
}
function mkBBSvg(): visuals.SVGElAndSize {
let bb = new visuals.Breadboard({});
return bb.getSVGAndSize();
}
function wrapSvg(el: visuals.SVGElAndSize, opts: mkCmpDivOpts): HTMLElement {
//TODO: Refactor this function; it is too complicated. There is a lot of error-prone math being done
// to scale and place all elements which could be simplified with more forethought.
let svgEl = <SVGSVGElement>document.createElementNS("http://www.w3.org/2000/svg", "svg");
let dims = { l: 0, t: 0, w: 0, h: 0 };
let cmpSvgEl = <SVGSVGElement>document.createElementNS("http://www.w3.org/2000/svg", "svg");
svgEl.appendChild(cmpSvgEl);
cmpSvgEl.appendChild(el.el);
let cmpSvgAtts = {
"viewBox": `${el.x} ${el.y} ${el.w} ${el.h}`,
"preserveAspectRatio": "xMidYMid",
};
dims.w = el.w;
dims.h = el.h;
let scale = (scaler: number) => {
dims.h *= scaler;
dims.w *= scaler;
(<any>cmpSvgAtts).width = dims.w;
(<any>cmpSvgAtts).height = dims.h;
}
if (opts.cmpScale) {
scale(opts.cmpScale)
}
if (opts.cmpWidth && opts.cmpWidth < dims.w) {
scale(opts.cmpWidth / dims.w);
} else if (opts.cmpHeight && opts.cmpHeight < dims.h) {
scale(opts.cmpHeight / dims.h)
}
svg.hydrate(cmpSvgEl, cmpSvgAtts);
let elDims = { l: dims.l, t: dims.t, w: dims.w, h: dims.h };
let updateL = (newL: number) => {
if (newL < dims.l) {
let extraW = dims.l - newL;
dims.l = newL;
dims.w += extraW;
}
}
let updateR = (newR: number) => {
let oldR = dims.l + dims.w;
if (oldR < newR) {
let extraW = newR - oldR;
dims.w += extraW;
}
}
let updateT = (newT: number) => {
if (newT < dims.t) {
let extraH = dims.t - newT;
dims.t = newT;
dims.h += extraH;
}
}
let updateB = (newB: number) => {
let oldB = dims.t + dims.h;
if (oldB < newB) {
let extraH = newB - oldB;
dims.h += extraH;
}
}
//labels
let [xOff, yOff] = [-0.3, 0.3]; //HACK: these constants tweak the way "mkTxt" knows how to center the text
const txtAspectRatio = [1.4, 1.0];
if (opts && opts.top) {
let size = opts.topSize;
let txtW = size / txtAspectRatio[0];
let txtH = size / txtAspectRatio[1];
let [cx, y] = [elDims.l + elDims.w / 2, elDims.t - LBL_VERT_PAD - txtH / 2];
let lbl = visuals.mkTxt(cx, y, size, 0, opts.top, xOff, yOff);
svg.addClass(lbl, "cmp-lbl");
svgEl.appendChild(lbl);
let len = txtW * opts.top.length;
updateT(y - txtH / 2);
updateL(cx - len / 2);
updateR(cx + len / 2);
}
if (opts && opts.bot) {
let size = opts.botSize;
let txtW = size / txtAspectRatio[0];
let txtH = size / txtAspectRatio[1];
let [cx, y] = [elDims.l + elDims.w / 2, elDims.t + elDims.h + LBL_VERT_PAD + txtH / 2];
let lbl = visuals.mkTxt(cx, y, size, 0, opts.bot, xOff, yOff);
svg.addClass(lbl, "cmp-lbl");
svgEl.appendChild(lbl);
let len = txtW * opts.bot.length;
updateB(y + txtH / 2);
updateL(cx - len / 2);
updateR(cx + len / 2);
}
if (opts && opts.right) {
let size = opts.rightSize;
let txtW = size / txtAspectRatio[0];
let txtH = size / txtAspectRatio[1];
let len = txtW * opts.right.length;
let [cx, cy] = [elDims.l + elDims.w + LBL_RIGHT_PAD + len / 2, elDims.t + elDims.h / 2];
let lbl = visuals.mkTxt(cx, cy, size, 0, opts.right, xOff, yOff);
svg.addClass(lbl, "cmp-lbl");
svgEl.appendChild(lbl);
updateT(cy - txtH / 2);
updateR(cx + len / 2);
updateB(cy + txtH / 2);
}
if (opts && opts.left) {
let size = opts.leftSize;
let txtW = size / txtAspectRatio[0];
let txtH = size / txtAspectRatio[1];
let len = txtW * opts.left.length;
let [cx, cy] = [elDims.l - LBL_LEFT_PAD - len / 2, elDims.t + elDims.h / 2];
let lbl = visuals.mkTxt(cx, cy, size, 0, opts.left, xOff, yOff);
svg.addClass(lbl, "cmp-lbl");
svgEl.appendChild(lbl);
updateT(cy - txtH / 2);
updateL(cx - len / 2);
updateB(cy + txtH / 2);
}
let svgAtts = {
"viewBox": `${dims.l} ${dims.t} ${dims.w} ${dims.h}`,
"width": dims.w * PART_SCALAR,
"height": dims.h * PART_SCALAR,
"preserveAspectRatio": "xMidYMid",
};
svg.hydrate(svgEl, svgAtts);
let div = document.createElement("div");
div.appendChild(svgEl);
return div;
}
function mkCmpDiv(cmp: "wire" | PartVisualDefinition, opts: mkCmpDivOpts): HTMLElement {
let state = runtime.board as pxsim.CoreBoard;
let el: visuals.SVGElAndSize;
if (cmp == "wire") {
el = visuals.mkWirePart([0, 0], opts.wireClr || "red", opts.crocClips);
} else {
let partVis = <PartVisualDefinition>cmp;
if (typeof partVis.builtIn == "string") {
let cnstr = state.builtinPartVisuals[partVis.builtIn];
el = cnstr([0, 0]);
} else {
el = visuals.mkGenericPartSVG(partVis);
}
}
return wrapSvg(el, opts);
}
type BoardProps = {
boardDef: BoardDefinition,
cmpDefs: Map<PartDefinition>,
fnArgs: any,
allAlloc: AllocatorResult,
stepToWires: WireInst[][],
stepToCmps: PartInst[][]
allWires: WireInst[],
allCmps: PartInst[],
lastStep: number,
colorToWires: Map<WireInst[]>,
allWireColors: string[],
};
function mkBoardProps(allocOpts: AllocatorOpts): BoardProps {
let allocRes = allocateDefinitions(allocOpts);
let stepToWires: WireInst[][] = [];
let stepToCmps: PartInst[][] = [];
let stepOffset = 0;
allocRes.partsAndWires.forEach(cAndWs => {
let part = cAndWs.part;
let wires = cAndWs.wires;
cAndWs.assembly.forEach((step, idx) => {
if (step.part && part)
stepToCmps[stepOffset + idx] = [part]
if (step.wireIndices && step.wireIndices.length > 0 && wires)
stepToWires[stepOffset + idx] = step.wireIndices.map(i => wires[i])
})
stepOffset += cAndWs.assembly.length;
});
let numSteps = stepOffset;
let lastStep = numSteps - 1;
let allCmps = allocRes.partsAndWires.map(r => r.part).filter(p => !!p);
let allWires = allocRes.partsAndWires.map(r => r.wires || []).reduce((p, n) => p.concat(n), []);
let colorToWires: Map<WireInst[]> = {}
let allWireColors: string[] = [];
allWires.forEach(w => {
if (!colorToWires[w.color]) {
colorToWires[w.color] = [];
allWireColors.push(w.color);
}
colorToWires[w.color].push(w);
});
return {
boardDef: allocOpts.boardDef,
cmpDefs: allocOpts.partDefs,
fnArgs: allocOpts.fnArgs,
allAlloc: allocRes,
stepToWires: stepToWires,
stepToCmps: stepToCmps,
allWires: allWires,
allCmps: allCmps,
lastStep: lastStep,
colorToWires: colorToWires,
allWireColors: allWireColors,
};
}
function mkBlankBoardAndBreadboard(boardDef: BoardDefinition, cmpDefs: Map<PartDefinition>, fnArgs: any, width: number, buildMode: boolean = false): visuals.BoardHost {
const state = runtime.board as pxsim.CoreBoard;
const opts : visuals.BoardHostOpts = {
state: state,
boardDef: boardDef,
forceBreadboard: true,
partDefs: cmpDefs,
maxWidth: `${width}px`,
fnArgs: fnArgs,
wireframe: buildMode,
};
let boardHost = new visuals.BoardHost(pxsim.visuals.mkBoardView(opts), opts);
let view = boardHost.getView();
svg.addClass(view, "board-svg");
//set smiley
//HACK
// let img = board.board.displayCmp.image;
// img.set(1, 0, 255);
// img.set(3, 0, 255);
// img.set(0, 2, 255);
// img.set(1, 3, 255);
// img.set(2, 3, 255);
// img.set(3, 3, 255);
// img.set(4, 2, 255);
// board.updateState();
return boardHost;
}
function drawSteps(board: visuals.BoardHost, step: number, props: BoardProps) {
let view = board.getView();
if (step > 0) {
svg.addClass(view, "grayed");
}
for (let i = 0; i <= step; i++) {
let cmps = props.stepToCmps[i];
if (cmps) {
cmps.forEach(partInst => {
let cmp = board.addPart(partInst)
//last step
if (i === step) {
//highlight locations pins
partInst.breadboardConnections.forEach(bbLoc => board.highlightBreadboardPin(bbLoc));
svg.addClass(cmp.element, "notgrayed");
}
});
}
let wires = props.stepToWires[i];
if (wires) {
wires.forEach(w => {
let wire = board.addWire(w)
//last step
if (i === step) {
//location highlights
if (w.start.type == "breadboard") {
let lbls = board.highlightBreadboardPin((<BBLoc>w.start));
} else {
board.highlightBoardPin((<BoardLoc>w.start).pin);
}
if (w.end.type == "breadboard") {
let lbls = board.highlightBreadboardPin((<BBLoc>w.end));
} else {
board.highlightBoardPin((<BoardLoc>w.end).pin);
}
//highlight wire
board.highlightWire(wire);
}
});
}
}
}
function mkPanel() {
//panel
let panel = document.createElement("div");
addClass(panel, "instr-panel");
return panel;
}
function mkPartsPanel(props: BoardProps) {
let panel = mkPanel();
// board and breadboard
let boardImg = mkBoardImgSvg(props.boardDef.visual);
let board = wrapSvg(boardImg, { left: QUANT_LBL(1), leftSize: QUANT_LBL_SIZE, cmpScale: PARTS_BOARD_SCALE });
panel.appendChild(board);
let bbRaw = mkBBSvg();
let bb = wrapSvg(bbRaw, { left: QUANT_LBL(1), leftSize: QUANT_LBL_SIZE, cmpScale: PARTS_BB_SCALE });
panel.appendChild(bb);
// components
let cmps = props.allCmps;
cmps.forEach(c => {
let quant = 1;
// TODO: don't special case this
if (c.visual.builtIn === "buttonpair") {
quant = 2;
}
let cmp = mkCmpDiv(c.visual, {
left: QUANT_LBL(quant),
leftSize: QUANT_LBL_SIZE,
cmpScale: PARTS_CMP_SCALE,
});
addClass(cmp, "partslist-cmp");
panel.appendChild(cmp);
});
// wires
props.allWireColors.forEach(clr => {
let quant = props.colorToWires[clr].length;
let cmp = mkCmpDiv("wire", {
left: QUANT_LBL(quant),
leftSize: WIRE_QUANT_LBL_SIZE,
wireClr: clr,
cmpScale: PARTS_WIRE_SCALE,
crocClips: props.boardDef.useCrocClips
})
addClass(cmp, "partslist-wire");
panel.appendChild(cmp);
})
return panel;
}
function mkStepPanel(step: number, props: BoardProps) {
let panel = mkPanel();
//board
let board = mkBlankBoardAndBreadboard(props.boardDef, props.cmpDefs, props.fnArgs, BOARD_WIDTH, true)
drawSteps(board, step, props);
panel.appendChild(board.getView());
//number
let numDiv = document.createElement("div");
addClass(numDiv, "panel-num-outer");
addClass(numDiv, "noselect");
panel.appendChild(numDiv)
let num = document.createElement("div");
addClass(num, "panel-num");
num.textContent = (step + 1) + "";
numDiv.appendChild(num)
// add requirements
let reqsDiv = document.createElement("div");
addClass(reqsDiv, "reqs-div")
panel.appendChild(reqsDiv);
let wires = (props.stepToWires[step] || []);
let mkLabel = (loc: Loc) => {
if (loc.type === "breadboard") {
let {row, col} = (<BBLoc>loc);
return `(${row},${col})`
} else
return (<BoardLoc>loc).pin;
};
wires.forEach(w => {
let cmp = mkCmpDiv("wire", {
top: mkLabel(w.end),
topSize: LOC_LBL_SIZE,
bot: mkLabel(w.start),
botSize: LOC_LBL_SIZE,
wireClr: w.color,
cmpHeight: REQ_WIRE_HEIGHT,
crocClips: props.boardDef.useCrocClips
})
addClass(cmp, "cmp-div");
reqsDiv.appendChild(cmp);
});
let cmps = (props.stepToCmps[step] || []);
cmps.forEach(c => {
let locs: BBLoc[];
if (c.visual.builtIn === "buttonpair") {
//TODO: don't special case this
locs = [c.breadboardConnections[0], c.breadboardConnections[2]]
} else {
locs = [c.breadboardConnections[0]];
}
locs.forEach((l, i) => {
let topLbl: string;
if (l) {
let {row, col} = l;
topLbl = `(${row},${col})`;
} else {
topLbl = "";
}
let cmp = mkCmpDiv(c.visual, {
top: topLbl,
topSize: LOC_LBL_SIZE,
cmpHeight: REQ_CMP_HEIGHT,
cmpScale: REQ_CMP_SCALE
})
addClass(cmp, "cmp-div");
reqsDiv.appendChild(cmp);
});
});
return panel;
}
function updateFrontPanel(props: BoardProps): [HTMLElement, BoardProps] {
let panel = document.getElementById("front-panel");
let board = mkBlankBoardAndBreadboard(props.boardDef, props.cmpDefs, props.fnArgs, FRONT_PAGE_BOARD_WIDTH, false);
board.addAll(props.allAlloc);
panel.appendChild(board.getView());
return [panel, props];
}
function mkFinalPanel(props: BoardProps) {
let panel = mkPanel();
addClass(panel, "back-panel");
let board = mkBlankBoardAndBreadboard(props.boardDef, props.cmpDefs, props.fnArgs, BACK_PAGE_BOARD_WIDTH, false)
board.addAll(props.allAlloc);
panel.appendChild(board.getView());
return panel;
}
export function drawInstructions() {
pxsim.visuals.mkBoardView = (opts: pxsim.visuals.BoardViewOptions): pxsim.visuals.BoardView => {
return new visuals.MicrobitBoardSvg({
runtime: runtime,
theme: visuals.randomTheme(),
disableTilt: false,
wireframe: opts.wireframe,
});
}
let getQsVal = parseQueryString();
//project name
let name = getQsVal("name") || "Untitled";
if (name) {
$("#proj-title").text(name);
}
// board def
const boardDef = JSON.parse(getQsVal("board")) as pxsim.BoardDefinition;
//parts list
let parts = (getQsVal("parts") || "").split(" ");
parts.sort();
// parts definitions
let partDefinitions = JSON.parse(getQsVal("partdefs") || "{}") as pxsim.Map<PartDefinition>
//fn args
let fnArgs = JSON.parse((getQsVal("fnArgs") || "{}"));
//project code
let tsCode = getQsVal("code");
@ -615,62 +73,20 @@ ${tsPackage}
});
}
// board def
const boardDef = JSON.parse(getQsVal("board")) as pxsim.BoardDefinition;
//parts list
let parts = (getQsVal("parts") || "").split(" ");
parts.sort();
// parts definitions
let partDefinitions = JSON.parse(getQsVal("partdefs") || "{}") as pxsim.Map<PartDefinition>
//fn args
let fnArgs = JSON.parse((getQsVal("fnArgs") || "{}"));
if (name)
$("#proj-title").text(name);
//init runtime
const COMP_CODE = "";
if (!pxsim.initCurrentRuntime)
pxsim.initCurrentRuntime = initRuntimeWithDalBoard;
pxsim.runtime = new Runtime(COMP_CODE);
pxsim.runtime.board = null;
pxsim.initCurrentRuntime();
let style = document.createElement("style");
document.head.appendChild(style);
style.textContent += STYLE;
const cmpDefs = partDefinitions;
//props
let dummyBreadboard = new visuals.Breadboard({});
let onboardCmps = boardDef.onboardComponents || [];
let activeComponents = (parts || []).filter(c => onboardCmps.indexOf(c) < 0);
activeComponents.sort();
let props = mkBoardProps({
boardDef: boardDef,
partDefs: cmpDefs,
partsList: activeComponents,
fnArgs: fnArgs,
getBBCoord: dummyBreadboard.getCoord.bind(dummyBreadboard)
});
//front page
let frontPanel = updateFrontPanel(props);
//all required parts
let partsPanel = mkPartsPanel(props);
document.body.appendChild(partsPanel);
//steps
for (let s = 0; s <= props.lastStep; s++) {
let p = mkStepPanel(s, props);
document.body.appendChild(p);
}
//final
let finalPanel = mkFinalPanel(props);
document.body.appendChild(finalPanel);
renderParts({
name,
boardDef,
parts,
partDefinitions,
fnArgs
})
}
}

5
sim/state/rgbled.ts Normal file
View File

@ -0,0 +1,5 @@
namespace pxsim.basic {
export function setLedColor(c: number) {
board().rgbLedState = c;
}
}

View File

@ -1,19 +1,10 @@
namespace pxsim.visuals {
export function mkBoardView(opts: BoardHostOpts): BoardView {
if (opts.boardDef.visual === "microbit") {
return new visuals.MicrobitBoardSvg({
runtime: runtime,
theme: visuals.randomTheme(),
disableTilt: false,
wireframe: opts.wireframe,
});
} else {
let boardVis = opts.boardDef.visual as BoardImageDefinition;
return new visuals.GenericBoardSvg({
visualDef: boardVis,
wireframe: opts.wireframe,
});
}
mkBoardView = (opts: BoardViewOptions): BoardView => {
return new visuals.MicrobitBoardSvg({
runtime: runtime,
theme: visuals.randomTheme(),
disableTilt: false,
wireframe: opts.wireframe,
});
}
}

File diff suppressed because one or more lines are too long