Compare commits
181 Commits
Author | SHA1 | Date | |
---|---|---|---|
4ad229cb37 | |||
170ee33848 | |||
162e437527 | |||
ab13cb9047 | |||
80454f55c7 | |||
30e576345b | |||
dfc4c83718 | |||
e25d273765 | |||
903e98ca22 | |||
8a64085288 | |||
22ab1cba8d | |||
1865ced312 | |||
b940befe85 | |||
c6bae5e17b | |||
83e4898eab | |||
7bdb9683c9 | |||
3c675892aa | |||
3d29c5e323 | |||
15d59269d4 | |||
73b5e7dc3f | |||
a92edcffee | |||
305a650125 | |||
34a5aeb7d2 | |||
32f524ddd8 | |||
b690c1634b | |||
8089841892 | |||
3d8c697586 | |||
e365e3d1be | |||
4ed41adb6a | |||
39b7f99741 | |||
ad17191ae2 | |||
4a8633f506 | |||
3690f409b0 | |||
97663d2b83 | |||
4d2b7ced71 | |||
5676103052 | |||
cb8c14fbb1 | |||
815d438d86 | |||
da8de1e31e | |||
b028916025 | |||
b9be74bad8 | |||
7e502b1749 | |||
f22edac84d | |||
ef2807a84e | |||
580b40876c | |||
b57ae5d588 | |||
71479d0caa | |||
7e39cdde9d | |||
85ca6b3698 | |||
2c89848fda | |||
ed1c187514 | |||
52816e6de7 | |||
60ac3a9d00 | |||
d2c7a5ace0 | |||
79fcd1c01e | |||
2d48725c63 | |||
802c3db0ba | |||
4a7e8c5fa8 | |||
0ebffd8549 | |||
988a2b638b | |||
fb743dea74 | |||
e400637ba1 | |||
b2768b1099 | |||
3a5885b28e | |||
b602b52f7d | |||
90afb60cc4 | |||
c936c16c33 | |||
ead69e3c6e | |||
d100026d5c | |||
41c2899feb | |||
9437873427 | |||
dab281a9cb | |||
f27fb4d93c | |||
11fb82eba9 | |||
170e6b700b | |||
387ad763f8 | |||
0e61f162bb | |||
400f01a6be | |||
afcbe69c44 | |||
9165fe09fc | |||
08f36fbb94 | |||
afca2aa4d1 | |||
3c6c766412 | |||
329a1e15ea | |||
16a025f3a0 | |||
26b975b5f2 | |||
79b9bce904 | |||
d3d9fa6ca0 | |||
8f5c930f76 | |||
a082807455 | |||
3469f51b7b | |||
e8e31e6aa7 | |||
2df90152fe | |||
e25590539e | |||
a7795302fc | |||
480d89ba8e | |||
9487d324fd | |||
bfc95e075e | |||
7d4ba9b2b2 | |||
71b83040e6 | |||
1976534da0 | |||
ebbbe6e86c | |||
c4a9b4a381 | |||
c7d36a5e82 | |||
c8c45be057 | |||
a8a7267851 | |||
9cdb4081fd | |||
dcb398d3d5 | |||
f6e350cf9f | |||
c085094394 | |||
7c2ea7c406 | |||
84b98a2788 | |||
4e99cd3ef1 | |||
57647318c4 | |||
2720698864 | |||
dfe2fe3cff | |||
18fefa2a44 | |||
c0bab4877a | |||
d2a1d10ada | |||
bcb68d937d | |||
05a8395028 | |||
3a1601a419 | |||
712c2178d2 | |||
12cdad72c8 | |||
95076f8f24 | |||
6391620373 | |||
86212e2153 | |||
98e430f3c1 | |||
5c7e856e7b | |||
a47988913e | |||
ea72dba6c7 | |||
215e846a54 | |||
21b34cb459 | |||
282134f5dc | |||
6b44352839 | |||
9a883d5672 | |||
59ce4338d3 | |||
90560050b8 | |||
2c72173bfe | |||
1a5992408b | |||
0e1a3b7e6b | |||
ea6bfa03bd | |||
20d584db2b | |||
0e4e0d8899 | |||
a18a690417 | |||
c9d57c5e8d | |||
7e9d42a571 | |||
1b51320edb | |||
4f44238237 | |||
c8ffa0ded7 | |||
6b07d5f716 | |||
8784e23b60 | |||
4b8409fbc0 | |||
3237978cba | |||
33c8902050 | |||
fa6c81cf80 | |||
46175fc7db | |||
e6ef86101f | |||
c4d3d7634e | |||
b0380fbef8 | |||
c85c68ab68 | |||
334d5aca9a | |||
1330a0fb82 | |||
005447ce44 | |||
60d5271de2 | |||
e3ab6ace55 | |||
5f4488dea7 | |||
07dc3bdae1 | |||
5d5d78ced0 | |||
fe46461c4c | |||
ccda971fd1 | |||
8fa6cf41ca | |||
aa3c6d5fc0 | |||
6a719e7718 | |||
b18b8333d0 | |||
84d80131d4 | |||
4977358718 | |||
15b2ef6c92 | |||
e0288ed741 | |||
df1caf9741 | |||
a755420d06 |
1
.gitignore
vendored
@ -31,3 +31,4 @@ videos/**
|
|||||||
lib/
|
lib/
|
||||||
.vscode/
|
.vscode/
|
||||||
bin
|
bin
|
||||||
|
scripts/out.*
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
# LEGO Mindstorms EV3 target for PXT
|
# LEGO Mindstorms EV3 target for PXT
|
||||||
|
|
||||||
[](https://ci2.dot.net/job/Private/job/pxt_project_pink/job/master/job/pxt-ev3_Push/)
|
[](https://ci2.dot.net/job/Private/job/pxt_project_rainbow/job/master/job/pxt-ev3_Push/)
|
||||||
|
|
||||||
This repo contains the editor target hosted at https://d541eec2-1e96-4b7b-a223-da9d01d0337a.pxt.io/
|
This repo contains the editor target hosted at https://d541eec2-1e96-4b7b-a223-da9d01d0337a.pxt.io/
|
||||||
|
|
||||||
|
Issue tracker: https://src.education.lego.com/groups/ev3-makecode
|
||||||
|
|
||||||
## Local Dev setup
|
## Local Dev setup
|
||||||
|
|
||||||
These instructions assume familiarity with dev tools and languages.
|
These instructions assume familiarity with dev tools and languages.
|
||||||
@ -14,7 +16,7 @@ These instructions assume familiarity with dev tools and languages.
|
|||||||
|
|
||||||
In a common folder,
|
In a common folder,
|
||||||
|
|
||||||
* clone https://github.com/Microsoft/pxt to ``pxt`` folder (currently, build against `freshcoat` branch)
|
* clone https://github.com/Microsoft/pxt to ``pxt`` folder
|
||||||
* clone https://github.com/Microsoft/pxt-common-packages to ``pxt-common-packages`` folder
|
* clone https://github.com/Microsoft/pxt-common-packages to ``pxt-common-packages`` folder
|
||||||
* clone https://github.com/Microsoft/pxt-ev3 to ``pxt-ev3`` folder
|
* clone https://github.com/Microsoft/pxt-ev3 to ``pxt-ev3`` folder
|
||||||
* go to ``pxt`` and run
|
* go to ``pxt`` and run
|
||||||
|
@ -3,9 +3,3 @@
|
|||||||
## Reference #reference
|
## Reference #reference
|
||||||
|
|
||||||
* [Reference](/reference)
|
* [Reference](/reference)
|
||||||
* [input](/reference/input)
|
|
||||||
* [light](/reference/light)
|
|
||||||
* [music](/reference/music)
|
|
||||||
* [pins](/reference/pins)
|
|
||||||
* [control](/reference/control)
|
|
||||||
* [serial](/reference/serial)
|
|
||||||
|
@ -4,5 +4,12 @@ Here are some fun programs for your @boardname@!
|
|||||||
|
|
||||||
## Fun stuff
|
## Fun stuff
|
||||||
|
|
||||||
|
```codecard
|
||||||
Coming soon.
|
[
|
||||||
|
{
|
||||||
|
"name": "Happy unhappy",
|
||||||
|
"description": "Keep your brick entertained and happy",
|
||||||
|
"url":"/examples/happy-unhappy",
|
||||||
|
"cardType": "example"
|
||||||
|
}]
|
||||||
|
```
|
12
docs/examples/happy-unhappy.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# Happy unhappy
|
||||||
|
|
||||||
|
Use a touch sensor to make the brick happy.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
sensors.touchSensor1.onEvent(TouchSensorEvent.Pressed, function () {
|
||||||
|
brick.showImage(images.expressionsBigSmile)
|
||||||
|
})
|
||||||
|
sensors.touchSensor1.onEvent(TouchSensorEvent.Released, function () {
|
||||||
|
brick.showImage(images.expressionsSick)
|
||||||
|
})
|
||||||
|
```
|
47
docs/maker.md
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
# Maker Activites
|
||||||
|
|
||||||
|
These six activities require the LEGO® MINDSTORMS® Education EV3 Core Set (45544). Supporting materials for teachers and middle school students are provided, offering everything teachers and students need to explore their inner makers as they follow the design process to solve open-ended, themed challenges...
|
||||||
|
|
||||||
|
* [Download Curriculum Materials](https://education.lego.com/en-us/downloads/mindstorms-ev3)
|
||||||
|
|
||||||
|
## Activites
|
||||||
|
|
||||||
|
```codecard
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"name": "Sound Machine",
|
||||||
|
"description": "Create instruments with your EV3 Brick!",
|
||||||
|
"url":"/maker/sound-machine",
|
||||||
|
"cardType": "example",
|
||||||
|
"imageUrl": "/static/maker/sound-machine.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Sound Of Color",
|
||||||
|
"description": "Play different sounds based on the color",
|
||||||
|
"url":"/maker/sound-of-color",
|
||||||
|
"cardType": "example",
|
||||||
|
"imageUrl": "/static/maker/sound-of-color.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Security Gadget",
|
||||||
|
"description": "Raise the alarm when your brick is lifted!",
|
||||||
|
"url":"/maker/security-gadget",
|
||||||
|
"cardType": "example",
|
||||||
|
"imageUrl": "/static/maker/security-gadget.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Intruder Detector",
|
||||||
|
"description": "Raise the alarm when an intruder sneaks in",
|
||||||
|
"url":"/maker/intruder-detector",
|
||||||
|
"cardType": "example",
|
||||||
|
"imageUrl": "/static/maker/intruder-detector.png"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Puppet",
|
||||||
|
"description": "Build an automated puppet",
|
||||||
|
"url":"/maker/puppet",
|
||||||
|
"cardType": "example",
|
||||||
|
"imageUrl": "/static/maker/puppet.png"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
```
|
11
docs/maker/intruder-detector.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Intruder Detector
|
||||||
|
|
||||||
|
This program will activate an alarm when an object moves in front of the Ultrasonic Sensor.
|
||||||
|
|
||||||
|
TODO support for event when value changes
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
input.ultrasonic4.onObjectNear(function () {
|
||||||
|
music.playSoundUntilDone(music.sounds(Sounds.PowerUp))
|
||||||
|
})
|
||||||
|
```
|
17
docs/maker/puppet.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# Puppet
|
||||||
|
|
||||||
|
Use this program with the Programmable Brick and Large Motor.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
loops.forever(function () {
|
||||||
|
output.largeMotorA.setPower(30)
|
||||||
|
output.largeMotorA.on(true)
|
||||||
|
loops.pause(100)
|
||||||
|
output.largeMotorA.on(false)
|
||||||
|
music.playSoundUntilDone(music.sounds(Sounds.PowerUp))
|
||||||
|
output.largeMotorA.setPower(-30)
|
||||||
|
output.largeMotorA.on(true)
|
||||||
|
loops.pause(100)
|
||||||
|
output.largeMotorA.on(false)
|
||||||
|
})
|
||||||
|
```
|
9
docs/maker/security-gadget.md
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# Security Gadget
|
||||||
|
|
||||||
|
This program will activate an alarm when an object is lifted from the Touch Sensor.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
input.touchSensor1.onEvent(TouchSensorEvent.Released, function () {
|
||||||
|
music.playSoundUntilDone(music.sounds(Sounds.PowerUp))
|
||||||
|
})
|
||||||
|
```
|
12
docs/maker/sound-machine.md
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# Sound Machine
|
||||||
|
|
||||||
|
This example program combined with the small model will make a beat and rhythm on any surface when the program is run.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
loops.forever(function () {
|
||||||
|
output.motorA.on(50)
|
||||||
|
loops.pause(200)
|
||||||
|
output.motorA.on(100)
|
||||||
|
loops.pause(200)
|
||||||
|
})
|
||||||
|
```
|
15
docs/maker/sound-of-color.md
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# Sound Of Color
|
||||||
|
|
||||||
|
This program will play different sounds when the wheel is rotated. The sound is determined by which color is placed in front of the color Sensor.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
input.color3.onColorDetected(ColorSensorColor.Blue, function () {
|
||||||
|
music.playTone(Note.G4, music.beat(BeatFraction.Half))
|
||||||
|
})
|
||||||
|
input.color3.onColorDetected(ColorSensorColor.Red, function () {
|
||||||
|
music.playTone(Note.C5, music.beat(BeatFraction.Half))
|
||||||
|
})
|
||||||
|
input.color3.onColorDetected(ColorSensorColor.Green, function () {
|
||||||
|
music.playTone(Note.D5, music.beat(BeatFraction.Half))
|
||||||
|
})
|
||||||
|
```
|
@ -1,19 +1,8 @@
|
|||||||
# Reference
|
# Reference
|
||||||
|
|
||||||
```namespaces
|
|
||||||
input.onGesture(Gesture.Shake, () => {})
|
|
||||||
light.showRing('red red red red red red red red red red')
|
|
||||||
music.playTone(0, 0)
|
|
||||||
pins.pulseDuration()
|
|
||||||
control.runInBackground(() => {})
|
|
||||||
serial.writeLine("");
|
|
||||||
```
|
|
||||||
|
|
||||||
## See Also
|
## See Also
|
||||||
|
|
||||||
[blocks](/blocks), [JavaScript](/javascript), [input](/reference/input), [light](/reference/light), [music](/reference/music),
|
[touch sensor](/reference/sensors/touch-sensor),
|
||||||
[control](/reference/control), [pins](/reference/pins), [serial](/reference/serial)
|
[color sensor](/reference/sensors/color-sensor)
|
||||||
|
|
||||||
```package
|
|
||||||
circuit-playground
|
|
||||||
```
|
|
BIN
docs/static/hero.png
vendored
Normal file
After Width: | Height: | Size: 40 KiB |
74
docs/static/lego-logo.svg
vendored
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 16.0.3, 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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
version="1.1"
|
||||||
|
id="Layer_1"
|
||||||
|
x="0px"
|
||||||
|
y="0px"
|
||||||
|
width="141.73"
|
||||||
|
height="141.731"
|
||||||
|
viewBox="0 0 141.73 141.73101"
|
||||||
|
enable-background="new 0 0 265.365 141.732"
|
||||||
|
xml:space="preserve"
|
||||||
|
inkscape:version="0.91 r13725"
|
||||||
|
sodipodi:docname="lego-logo.svg"><metadata
|
||||||
|
id="metadata26"><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="defs24" /><sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1199"
|
||||||
|
inkscape:window-height="604"
|
||||||
|
id="namedview22"
|
||||||
|
showgrid="false"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0"
|
||||||
|
inkscape:zoom="1.6520876"
|
||||||
|
inkscape:cx="101.03204"
|
||||||
|
inkscape:cy="98.819336"
|
||||||
|
inkscape:window-x="372"
|
||||||
|
inkscape:window-y="149"
|
||||||
|
inkscape:window-maximized="0"
|
||||||
|
inkscape:current-layer="g6" /><g
|
||||||
|
id="product_logo" /><g
|
||||||
|
id="guides" /><g
|
||||||
|
id="LEGO_LOGO_SMALL_RGB"><g
|
||||||
|
id="g6"><path
|
||||||
|
d="m 0.961,0.948 0,139.839 139.84,0 0,-139.839 -139.84,0 z"
|
||||||
|
id="path8"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#ffffff" /><path
|
||||||
|
d="m 0.961,0.948 0,139.839 139.84,0 0,-139.839 -139.84,0 z m 130.536,58.127 c -0.23,4.356 -1.617,9.786 -2.839,13.414 -4.917,14.609 -10.618,23.666 -23.821,23.666 -3.887,0 -10.783,-1.031 -13.324,-7.947 l -0.602,-1.641 -1.082,1.371 C 85.7,93.168 79.564,96.186 72.998,96.217 67.96,96.24 63.912,94.553 61.293,91.334 l -0.718,-0.883 -0.765,0.844 c -2.797,3.088 -7.668,4.859 -13.364,4.859 -4.473,0 -8.335,-1.521 -10.876,-4.277 l -0.692,-0.752 -0.72,0.727 c -2.825,2.852 -7.276,4.289 -12.873,4.158 -6.79,-0.162 -10.924,-3.951 -11.058,-10.141 -0.205,-9.543 9.031,-29.622 12.854,-35.727 2.482,-4.078 5.895,-6.055 10.438,-6.055 3.092,0 5.207,0.646 6.463,1.977 1.144,1.211 1.37,2.232 1.472,4.688 l 0.131,3.175 1.676,-2.7 c 4.054,-6.532 10.773,-7.434 17.43,-7.434 4.628,0 8.667,1.702 10.289,4.336 l 0.599,0.971 0.866,-0.737 c 3.431,-2.916 8.271,-4.521 13.629,-4.521 5.849,0 10.099,1.454 12.634,4.322 0.576,0.651 0.957,1.106 1.486,2.219 l 0.651,1.366 0.977,-1.155 c 3.712,-4.39 8.779,-6.615 15.067,-6.615 4.98,0 8.761,1.324 11.235,3.935 3.104,3.271 3.547,7.875 3.373,11.161 z"
|
||||||
|
id="path10"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#f6ec36" /><path
|
||||||
|
d="m 0.961,0.948 0,139.839 139.84,0 0,-139.839 -139.84,0 z M 135.435,64.44 c -0.633,5.089 -4.072,14.518 -5.899,18.286 -4.903,10.102 -11.453,17.863 -24.074,17.863 -6.742,0 -12.288,-2.15 -15.531,-6.283 -4.749,4.162 -10.627,6.342 -16.956,6.342 -4.876,0 -9.185,-1.408 -12.471,-4.012 -3.626,2.555 -8.52,3.98 -13.943,3.98 -4.53,0 -8.606,-1.244 -11.796,-3.543 -3.529,2.342 -8.154,3.506 -13.583,3.377 C 12.149,100.237 5.912,94.507 5.733,86.188 5.497,75.137 14.803,54.911 19.189,47.907 c 3.282,-5.392 8.292,-8.293 14.431,-8.293 6.663,0 9.078,1.903 10.267,4.326 5.141,-4.366 11.956,-4.617 16.808,-4.617 5.356,0 8.717,1.422 11.575,3.697 3.948,-2.368 8.477,-3.599 13.871,-3.599 6.897,0 12.021,1.604 15.595,5.137 4.168,-3.469 9.388,-5.05 15.23,-5.05 7.725,0 12.808,2.786 15.793,6.94 4.203,5.859 3.451,11.757 2.676,17.992 z"
|
||||||
|
id="path12"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#d01012" /><path
|
||||||
|
d="m 0,0 0,141.731 141.73,0 L 141.73,0 0,0 Z m 139.781,1.952 0,137.832 -137.83,0 0,-137.832 137.83,0 z"
|
||||||
|
id="path14"
|
||||||
|
inkscape:connector-curvature="0" /><path
|
||||||
|
d="m 134.752,42.53 0,-0.965 0.655,0 c 0.479,0 0.728,0.168 0.728,0.479 0,0.247 -0.16,0.486 -0.647,0.486 l -0.736,0 z m 2.351,2.002 -0.408,-0.708 c -0.354,-0.619 -0.452,-0.717 -0.755,-0.823 l 0,-0.019 c 0.596,-0.07 0.95,-0.453 0.95,-0.983 0,-0.56 -0.354,-0.984 -1.109,-0.984 l -1.754,0 0,3.519 0.727,0 0,-1.441 0.133,0 c 0.311,0 0.435,0.035 0.576,0.176 0.142,0.144 0.354,0.443 0.479,0.69 l 0.284,0.575 0.877,-0.002 0,0 z m -1.731,-4.497 c 1.51,0 2.737,1.218 2.737,2.726 0,1.508 -1.229,2.731 -2.737,2.731 -1.506,0 -2.72,-1.225 -2.72,-2.731 0,-1.506 1.214,-2.726 2.72,-2.726 z m 0,-0.67 c -1.877,0 -3.392,1.516 -3.392,3.396 0,1.879 1.515,3.394 3.392,3.394 1.883,0 3.397,-1.515 3.397,-3.394 0.002,-1.882 -1.514,-3.396 -3.397,-3.396 z"
|
||||||
|
id="path16"
|
||||||
|
inkscape:connector-curvature="0" /><path
|
||||||
|
d="m 116.889,43.002 c -7.325,0 -12.386,2.904 -15.812,6.961 -0.579,-1.214 -1.019,-1.746 -1.638,-2.447 -2.805,-3.17 -7.313,-4.649 -13.364,-4.649 -5.912,0 -10.841,1.846 -14.263,4.754 -1.777,-2.89 -6.013,-4.803 -11.121,-4.803 -6.674,0 -13.946,0.944 -18.261,7.896 -0.104,-2.503 -0.33,-3.828 -1.737,-5.317 -1.71,-1.81 -4.477,-2.282 -7.173,-2.282 -4.912,0 -8.605,2.146 -11.266,6.515 -3.859,6.163 -13.212,26.441 -13.001,36.263 0.137,6.344 4.393,10.916 12.01,11.096 5.952,0.143 10.62,-1.449 13.59,-4.447 2.665,2.896 6.731,4.594 11.596,4.594 5.417,0 10.868,-1.627 14.088,-5.182 2.712,3.332 6.979,5.271 12.468,5.244 7.175,-0.035 13.477,-3.438 17.593,-8.652 2.259,6.148 7.985,8.59 14.241,8.59 13.709,0 19.729,-9.428 24.748,-24.332 1.13,-3.357 2.639,-8.963 2.889,-13.672 0.413,-7.839 -2.903,-16.13 -15.587,-16.13 z M 25.672,80.477 c 7.093,-1.232 8.876,1.332 8.653,3.707 -0.669,7.109 -7.191,8.699 -12.854,8.566 -4.107,-0.1 -7.8,-1.98 -7.903,-6.748 -0.18,-8.342 8.328,-27.641 12.333,-34.038 1.85,-3.037 4.104,-4.539 7.698,-4.539 3.406,0 4.25,1.749 4.2,3.844 -0.134,5.589 -9.164,22.574 -12.127,29.208 z M 48.77,73.925 c -0.469,1.27 -1.357,3.93 -2.076,6.75 2.328,-0.582 4.074,-0.986 7.065,-0.914 3.408,0.084 5.586,1.496 5.586,4.314 0,6.832 -7.551,8.838 -12.789,8.838 -5.751,0 -10.803,-3.275 -10.803,-9.564 0,-7.373 3.997,-18.553 7.748,-26.001 4.606,-9.146 9.312,-10.362 17.419,-10.362 3.562,0 7.667,1.524 7.667,4.888 0,4.662 -3.95,6.44 -7.866,6.665 -1.672,0.096 -4.246,0.188 -5.786,0.079 0,0 -1.303,1.985 -2.688,5.523 7.252,-1.021 10.327,0.625 9.103,4.82 -1.657,5.667 -6.567,6.04 -12.58,4.964 z M 84.438,56.293 c -1.961,0 -3.244,1.242 -4.198,2.583 -2.102,2.952 -6.656,14.781 -7.365,19.64 -0.486,3.328 0.951,4.006 2.522,4.006 2.52,0 5.345,-2.666 6.309,-7.064 0,0 -4.797,-0.117 -3.475,-4.371 1.285,-4.128 3.723,-5.022 7.764,-5.188 7.961,-0.325 7.175,5.553 6.538,8.688 -2.069,10.18 -9.314,18.355 -19.562,18.355 -7.016,0 -11.371,-3.881 -11.371,-11.035 0,-5.098 2.529,-13.101 4.534,-17.784 4.267,-9.968 8.742,-16.944 20.143,-16.944 6.84,0 12.235,2.458 11.444,8.866 -0.58,4.703 -2.934,7.465 -7.21,7.799 -1.196,0.093 -6.089,-0.031 -4.466,-4.66 0.565,-1.619 0.799,-2.891 -1.607,-2.891 z m 43.057,8.413 c -1.205,6.002 -3.916,13.101 -6.859,18.392 -4.801,8.633 -10.633,9.842 -15.723,9.781 -5.093,-0.061 -10.83,-1.941 -10.874,-9.795 -0.031,-5.639 2.401,-13.598 4.466,-18.815 3.599,-9.458 7.277,-17.17 18.904,-17.031 13.559,0.161 11.141,12.219 10.086,17.468 z M 115.993,56.49 c -1.164,-0.016 -2.18,0.212 -3.093,1.62 -2.051,2.657 -8.047,19.042 -7.941,22.31 0.038,1.174 0.687,2.201 2.133,2.201 1.659,0.002 2.581,-1.145 3.396,-2.529 1.887,-3.193 7.193,-17.676 7.339,-21.297 0.043,-1.055 -0.133,-2.284 -1.834,-2.305 z"
|
||||||
|
id="path18"
|
||||||
|
inkscape:connector-curvature="0" /></g></g></svg>
|
After Width: | Height: | Size: 7.7 KiB |
BIN
docs/static/lego_education_logo.png
vendored
Normal file
After Width: | Height: | Size: 8.1 KiB |
BIN
docs/static/maker/intruder-detector.png
vendored
Normal file
After Width: | Height: | Size: 96 KiB |
BIN
docs/static/maker/puppet.png
vendored
Normal file
After Width: | Height: | Size: 377 KiB |
BIN
docs/static/maker/security-gadget.png
vendored
Normal file
After Width: | Height: | Size: 38 KiB |
BIN
docs/static/maker/sound-machine.png
vendored
Normal file
After Width: | Height: | Size: 141 KiB |
BIN
docs/static/maker/sound-of-color.png
vendored
Normal file
After Width: | Height: | Size: 159 KiB |
@ -9,6 +9,13 @@ eval("if (typeof process === 'object' && process + '' === '[object process]') px
|
|||||||
namespace pxt.editor {
|
namespace pxt.editor {
|
||||||
import UF2 = pxtc.UF2;
|
import UF2 = pxtc.UF2;
|
||||||
|
|
||||||
|
export let ev3: Ev3Wrapper
|
||||||
|
|
||||||
|
export function debug() {
|
||||||
|
return initAsync()
|
||||||
|
.then(w => w.downloadFileAsync("/tmp/dmesg.txt", v => console.log(pxt.Util.uint8ArrayToString(v))))
|
||||||
|
}
|
||||||
|
|
||||||
// this comes from aux/pxt.lms
|
// this comes from aux/pxt.lms
|
||||||
const rbfTemplate = `
|
const rbfTemplate = `
|
||||||
4c45474f580000006d000100000000001c000000000000000e000000821b038405018130813e8053
|
4c45474f580000006d000100000000001c000000000000000e000000821b038405018130813e8053
|
||||||
@ -19,6 +26,7 @@ namespace pxt.editor {
|
|||||||
return pxt.HF2.mkPacketIOAsync()
|
return pxt.HF2.mkPacketIOAsync()
|
||||||
.then(h => {
|
.then(h => {
|
||||||
let w = new Ev3Wrapper(h)
|
let w = new Ev3Wrapper(h)
|
||||||
|
ev3 = w
|
||||||
return w.reconnectAsync(true)
|
return w.reconnectAsync(true)
|
||||||
.then(() => w)
|
.then(() => w)
|
||||||
})
|
})
|
||||||
|
@ -252,6 +252,13 @@ namespace pxt.editor {
|
|||||||
return loop()
|
return loop()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
downloadFileAsync(path: string, cb: (d: Uint8Array) => void) {
|
||||||
|
return this.lock.enqueue("file", () =>
|
||||||
|
this.streamFileOnceAsync(path, cb))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private initAsync() {
|
private initAsync() {
|
||||||
return Promise.resolve()
|
return Promise.resolve()
|
||||||
}
|
}
|
||||||
|
73
legoresources/Blocks_Implemented_In_Swift_Playgrounds.md
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
# Functions for measuring in Swift Playgrounds "EV3 Animal Rescue" (Miranda)
|
||||||
|
|
||||||
|
## Sensors
|
||||||
|
|
||||||
|
* Ultrasonic (cm, inches)
|
||||||
|
* Gyro (angle, rate)
|
||||||
|
* Reset Gyro
|
||||||
|
* Touch (count, on/off)
|
||||||
|
* Light (color, reflection, ambience)
|
||||||
|
* IR (proximity, seek)
|
||||||
|
|
||||||
|
## Motor Sensors
|
||||||
|
|
||||||
|
* Motor (degrees, rotations, power)
|
||||||
|
|
||||||
|
#### Wait for
|
||||||
|
|
||||||
|
All sensor methods have a `waitFor` version that waits for the sensor value to be >= or <=. We don't use '=' equality because it is non-sensical for floating point data.
|
||||||
|
|
||||||
|
All sensors also have a `waitForIncrease`, `waitForDecrease` version.
|
||||||
|
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
# Output Functions
|
||||||
|
|
||||||
|
* Move tank ( for seconds, for degrees, for rotations, indefinitely )
|
||||||
|
* Stop Move (stops 2 motors)
|
||||||
|
* Motor off
|
||||||
|
* Motor on (for seconds, for degrees, for rotations, indefinitely)
|
||||||
|
* Reset motor (resets all counters related to the motor)
|
||||||
|
|
||||||
|
|
||||||
|
# Brick Functions
|
||||||
|
|
||||||
|
* Brick light on (color + mode: flashing, on, or pulsating)
|
||||||
|
* Brick light off
|
||||||
|
* Play sound (wait for completion, play once, play repeating)
|
||||||
|
- Parameters:
|
||||||
|
- file: Takes an input conforming to enum `SoundFile`. One of the following:
|
||||||
|
- `.hello`
|
||||||
|
- `.goodbye`
|
||||||
|
- `.fanfare`
|
||||||
|
- `.errorAlarm`
|
||||||
|
- `.start`
|
||||||
|
- `.stop`
|
||||||
|
- `.object`
|
||||||
|
- `.ouch`
|
||||||
|
- `.blip`
|
||||||
|
- `.arm`
|
||||||
|
- `.snap`
|
||||||
|
- `.laser`
|
||||||
|
* Play sound frequency (for seconds, can either wait for completion or continue while playing)
|
||||||
|
* Play sound note (in range `C4-D#9`) (for seconds, can either wait for completion or continue while playing)
|
||||||
|
* Stopsound (stops all sounds playing)
|
||||||
|
* Wait for seconds
|
||||||
|
* Display text
|
||||||
|
* Display text at `(x,y)` with color`(black, white)`, font`(bold, normal, large)` with option to clear screen
|
||||||
|
* Display line from `(x1,y1)` to `(x2,y2)` with color `(black, white)` option to clear screen
|
||||||
|
* Display rectangle at `(x,y)` with `(width, height)`, with fill or no fill, with color `(black, white)`, option to clear screen
|
||||||
|
* Display image at `(x,y)`, option to clear screen.
|
||||||
|
takes an input conforming to enum `ImageName`. One of the following:
|
||||||
|
- `.neutral`
|
||||||
|
- `.pinchRight`
|
||||||
|
- `.awake`
|
||||||
|
- `.hurt`
|
||||||
|
- `.accept`
|
||||||
|
- `.decline`
|
||||||
|
- `.questionMark`
|
||||||
|
- `.warning`
|
||||||
|
- `.stop`
|
||||||
|
- `.pirate`
|
||||||
|
- `.boom`
|
||||||
|
- `.ev3Icon`
|
1370
legoresources/RobotAPI.swift
Normal file
BIN
legoresources/SVGassets/.DS_Store
vendored
Normal file
246
legoresources/SVGassets/Color Sensor.svg
Normal file
@ -0,0 +1,246 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
viewBox="1925.358 6183.438 36.101 36.101003"
|
||||||
|
version="1.1"
|
||||||
|
id="svg41"
|
||||||
|
sodipodi:docname="Color Sensor.svg"
|
||||||
|
inkscape:export-filename="C:\gh\pxt-ev3\libs\core\jres\icons\colorSensor-icon.png"
|
||||||
|
inkscape:export-xdpi="319.10471"
|
||||||
|
inkscape:export-ydpi="319.10471"
|
||||||
|
width="36.101002"
|
||||||
|
height="36.101002"
|
||||||
|
inkscape:version="0.92.1 r15371">
|
||||||
|
<metadata
|
||||||
|
id="metadata45">
|
||||||
|
<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>
|
||||||
|
<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="namedview43"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="7.072009"
|
||||||
|
inkscape:cx="18.050501"
|
||||||
|
inkscape:cy="16.685499"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg41" />
|
||||||
|
<defs
|
||||||
|
id="defs22">
|
||||||
|
<style
|
||||||
|
id="style2">
|
||||||
|
.cls-1 {
|
||||||
|
fill: #a8a9a8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-2 {
|
||||||
|
clip-path: url(#clip-path);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-3 {
|
||||||
|
fill: url(#linear-gradient);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-4 {
|
||||||
|
fill: #b72b1c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-5 {
|
||||||
|
fill: #f2f2f2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-6 {
|
||||||
|
filter: url(#Path_1);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<clipPath
|
||||||
|
id="clip-path">
|
||||||
|
<path
|
||||||
|
id="Union_5"
|
||||||
|
data-name="Union 5"
|
||||||
|
class="cls-1"
|
||||||
|
d="m 3.907,33.37 c -1.069,0 -1.935,-0.617 -1.935,-1.377 V 27.606 H 0.758 A 0.758,0.758 0 0 1 0,26.848 V 7.129 A 0.758,0.758 0 0 1 0.758,6.371 H 1.972 V 1.377 C 1.972,0.617 2.838,0 3.907,0 h 28.287 c 1.069,0 1.935,0.617 1.935,1.377 v 4.994 h 1.213 a 0.758,0.758 0 0 1 0.759,0.758 v 19.719 a 0.758,0.758 0 0 1 -0.759,0.758 h -1.213 v 4.387 c 0,0.761 -0.867,1.377 -1.935,1.377 z"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#a8a9a8" />
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient
|
||||||
|
id="linear-gradient"
|
||||||
|
x1="16.378942"
|
||||||
|
y1="29.514856"
|
||||||
|
x2="16.378942"
|
||||||
|
y2="34.98542"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="scale(0.98165674,1.018686)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#a8a9a8"
|
||||||
|
id="stop6" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#545554"
|
||||||
|
id="stop8" />
|
||||||
|
</linearGradient>
|
||||||
|
<filter
|
||||||
|
id="Path_1"
|
||||||
|
x="1918.33"
|
||||||
|
y="6177.438"
|
||||||
|
width="50.157001"
|
||||||
|
height="51.370998"
|
||||||
|
filterUnits="userSpaceOnUse">
|
||||||
|
<feOffset
|
||||||
|
dy="3"
|
||||||
|
input="SourceAlpha"
|
||||||
|
id="feOffset11" />
|
||||||
|
<feGaussianBlur
|
||||||
|
stdDeviation="3"
|
||||||
|
result="blur"
|
||||||
|
id="feGaussianBlur13" />
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0.502"
|
||||||
|
id="feFlood15" />
|
||||||
|
<feComposite
|
||||||
|
operator="in"
|
||||||
|
in2="blur"
|
||||||
|
id="feComposite17"
|
||||||
|
result="result1" />
|
||||||
|
<feComposite
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="result1"
|
||||||
|
id="feComposite19" />
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="Color_Sensor"
|
||||||
|
data-name="Color Sensor"
|
||||||
|
transform="translate(1346,5555.3645)">
|
||||||
|
<g
|
||||||
|
id="Mask_Group_5"
|
||||||
|
data-name="Mask Group 5"
|
||||||
|
class="cls-2"
|
||||||
|
transform="translate(579.358,629.439)"
|
||||||
|
clip-path="url(#clip-path)">
|
||||||
|
<g
|
||||||
|
id="Group_4"
|
||||||
|
data-name="Group 4">
|
||||||
|
<g
|
||||||
|
id="Group_2"
|
||||||
|
data-name="Group 2">
|
||||||
|
<path
|
||||||
|
id="Path_28"
|
||||||
|
data-name="Path 28"
|
||||||
|
class="cls-1"
|
||||||
|
d="M 0.758,0 H 35.342 A 0.758,0.758 0 0 1 36.1,0.758 v 19.719 a 0.758,0.758 0 0 1 -0.758,0.758 H 0.758 A 0.758,0.758 0 0 1 0,20.477 V 0.758 A 0.758,0.758 0 0 1 0.758,0 Z"
|
||||||
|
transform="translate(0,6.371)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#a8a9a8" />
|
||||||
|
<g
|
||||||
|
class="cls-6"
|
||||||
|
transform="translate(-1925.36,-6183.44)"
|
||||||
|
id="g26"
|
||||||
|
style="filter:url(#Path_1)">
|
||||||
|
<path
|
||||||
|
id="Path_1-2"
|
||||||
|
data-name="Path 1"
|
||||||
|
class="cls-3"
|
||||||
|
d="m 1.935,0 h 28.287 c 1.069,0 1.935,0.617 1.935,1.377 v 30.616 c 0,0.761 -0.866,1.377 -1.935,1.377 H 1.935 C 0.866,33.371 0,32.754 0,31.993 V 1.377 C 0,0.617 0.866,0 1.935,0 Z"
|
||||||
|
transform="translate(1927.33,6183.44)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:url(#linear-gradient)" />
|
||||||
|
</g>
|
||||||
|
<rect
|
||||||
|
id="Rectangle_2"
|
||||||
|
data-name="Rectangle 2"
|
||||||
|
width="0.75800002"
|
||||||
|
height="6.0669999"
|
||||||
|
transform="translate(34.584,9.404)"
|
||||||
|
x="0"
|
||||||
|
y="0" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_5"
|
||||||
|
data-name="Rectangle 5"
|
||||||
|
width="0.75800002"
|
||||||
|
height="6.0669999"
|
||||||
|
transform="translate(0.91,9.404)"
|
||||||
|
x="0"
|
||||||
|
y="0" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_3"
|
||||||
|
data-name="Rectangle 3"
|
||||||
|
width="0.75800002"
|
||||||
|
height="6.0669999"
|
||||||
|
transform="translate(34.584,18.05)"
|
||||||
|
x="0"
|
||||||
|
y="0" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_4"
|
||||||
|
data-name="Rectangle 4"
|
||||||
|
width="0.75800002"
|
||||||
|
height="6.0669999"
|
||||||
|
transform="translate(0.91,18.05)"
|
||||||
|
x="0"
|
||||||
|
y="0" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
id="Union_1"
|
||||||
|
data-name="Union 1"
|
||||||
|
class="cls-4"
|
||||||
|
d="m 2.579,17.747 a 7,7 0 0 1 0.16,-1.494 9.556,9.556 0 1 1 13.634,0 6.978,6.978 0 1 1 -13.794,1.494 z"
|
||||||
|
transform="translate(8.494,4.096)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#b72b1c" />
|
||||||
|
<path
|
||||||
|
id="Union_2"
|
||||||
|
data-name="Union 2"
|
||||||
|
d="M 2.67,16.308 A 5.374,5.374 0 0 1 3.042,14.337 8.039,8.039 0 1 1 13.064,14.315 5.388,5.388 0 1 1 2.67,16.308 Z"
|
||||||
|
transform="translate(10.011,5.534)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
<g
|
||||||
|
id="Group_3"
|
||||||
|
data-name="Group 3"
|
||||||
|
transform="translate(14.41,10.163)">
|
||||||
|
<circle
|
||||||
|
id="Ellipse_5"
|
||||||
|
data-name="Ellipse 5"
|
||||||
|
class="cls-5"
|
||||||
|
cx="3.6400001"
|
||||||
|
cy="3.6400001"
|
||||||
|
r="3.6400001"
|
||||||
|
style="fill:#f2f2f2" />
|
||||||
|
<circle
|
||||||
|
id="Ellipse_6"
|
||||||
|
data-name="Ellipse 6"
|
||||||
|
class="cls-5"
|
||||||
|
cx="1.972"
|
||||||
|
cy="1.972"
|
||||||
|
transform="translate(1.669,9.556)"
|
||||||
|
r="1.972"
|
||||||
|
style="fill:#f2f2f2" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 7.2 KiB |
146
legoresources/SVGassets/EV3.svg
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="1549 6115.496 110.729 170.038">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1 {
|
||||||
|
fill: url(#linear-gradient);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-2 {
|
||||||
|
fill: #f2f2f2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-3 {
|
||||||
|
fill: url(#linear-gradient-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-4 {
|
||||||
|
fill: #3c3c3c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-5 {
|
||||||
|
fill: #a0b5a6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-6 {
|
||||||
|
fill: url(#linear-gradient-3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-7 {
|
||||||
|
fill: #6a6a6a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-8 {
|
||||||
|
fill: url(#linear-gradient-4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-9 {
|
||||||
|
fill: #a8a9a8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-10 {
|
||||||
|
fill: #9a9a9a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-11 {
|
||||||
|
fill: url(#linear-gradient-5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-12 {
|
||||||
|
fill: gray;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-13 {
|
||||||
|
fill: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-14 {
|
||||||
|
clip-path: url(#clip-path);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-15 {
|
||||||
|
fill: #ffed00;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-16 {
|
||||||
|
fill: #b72b1c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-17 {
|
||||||
|
fill: #1d1d1b;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<linearGradient id="linear-gradient" x1="0.5" y1="0.942" x2="0.5" y2="1.018" gradientUnits="objectBoundingBox">
|
||||||
|
<stop offset="0" stop-color="#f2f2f2"/>
|
||||||
|
<stop offset="1" stop-color="#797979"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="linear-gradient-2" x1="0.5" y1="0.924" x2="0.5" y2="0.948" gradientUnits="objectBoundingBox">
|
||||||
|
<stop offset="0" stop-color="#a8a9a8"/>
|
||||||
|
<stop offset="1" stop-color="gray"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="linear-gradient-3" x1="0.5" y1="0.807" x2="0.5" y2="1" gradientUnits="objectBoundingBox">
|
||||||
|
<stop offset="0" stop-color="#a8a9a8"/>
|
||||||
|
<stop offset="1" stop-color="#545554"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="linear-gradient-4" x1="0.5" y1="0.948" x2="0.5" y2="0.059" gradientUnits="objectBoundingBox">
|
||||||
|
<stop offset="0" stop-color="#6a6a6a"/>
|
||||||
|
<stop offset="0.522" stop-color="#8ce300"/>
|
||||||
|
<stop offset="1" stop-color="#6a6a6a"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="linear-gradient-5" x1="0.5" y1="0.363" x2="0.5" gradientUnits="objectBoundingBox">
|
||||||
|
<stop offset="0" stop-color="#747474"/>
|
||||||
|
<stop offset="1" stop-color="#3c3c3c"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clip-path">
|
||||||
|
<rect id="Rectangle_32" data-name="Rectangle 32" width="12.383" height="12.383"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
<g id="EV3" transform="translate(1346 5554)">
|
||||||
|
<g id="brick" transform="translate(203 561.496)">
|
||||||
|
<path id="Path_19" data-name="Path 19" class="cls-1" d="M1.972,0H108.758a1.972,1.972,0,0,1,1.972,1.972V104.965a1.972,1.972,0,0,1-1.972,1.972H1.972A1.972,1.972,0,0,1,0,104.965V1.972A1.972,1.972,0,0,1,1.972,0Z" transform="translate(0 31.702)"/>
|
||||||
|
<path id="Path_20" data-name="Path 20" class="cls-2" d="M1.972,0H96.319a1.972,1.972,0,0,1,1.972,1.972V40.5a1.972,1.972,0,0,1-1.972,1.972H1.972A1.972,1.972,0,0,1,0,40.5V1.972A1.972,1.972,0,0,1,1.972,0Z" transform="translate(6.219 127.566)"/>
|
||||||
|
<path id="Path_18" data-name="Path 18" class="cls-3" d="M1.972,0H98.14a1.972,1.972,0,0,1,1.972,1.972V77.207a1.972,1.972,0,0,1-1.972,1.972H1.972A1.972,1.972,0,0,1,0,77.207V1.972A1.972,1.972,0,0,1,1.972,0Z" transform="translate(5.309)"/>
|
||||||
|
<path id="Path_17" data-name="Path 17" class="cls-4" d="M3.792,0H78.269a3.792,3.792,0,0,1,3.792,3.792V45.657a3.792,3.792,0,0,1-3.792,3.792H3.792A3.792,3.792,0,0,1,0,45.657V3.792A3.792,3.792,0,0,1,3.792,0Z" transform="translate(14.41 10.466)"/>
|
||||||
|
<path id="Path_16" data-name="Path 16" class="cls-5" d="M2.73,0H65.983a2.73,2.73,0,0,1,2.73,2.73V43.078a2.73,2.73,0,0,1-2.73,2.73H2.73A2.73,2.73,0,0,1,0,43.078V2.73A2.73,2.73,0,0,1,2.73,0Z" transform="translate(21.236 12.438)"/>
|
||||||
|
<path id="Path_21" data-name="Path 21" class="cls-6" d="M0,0H98.291V21.387a1.972,1.972,0,0,1-1.972,1.972H1.972A1.972,1.972,0,0,1,0,21.387Z" transform="translate(6.219 146.679)"/>
|
||||||
|
</g>
|
||||||
|
<g id="buttons" transform="translate(216.197 621.259)">
|
||||||
|
<path id="Union_4" data-name="Union 4" class="cls-7" d="M25.938,48.842c-5.585-5.391-14.259-14.258-14.259-14.258V32.764H8.267a8.266,8.266,0,1,1,0-16.533h3.413V14.41L25.786,0H39.893C46.282,6.511,54,14.107,54,14.107v2.124h3.261a8.266,8.266,0,0,1,0,16.533H54v1.821c-7.514,7.729-13.955,14.258-13.955,14.258Z" transform="translate(9.556 25.331)"/>
|
||||||
|
<path id="light" class="cls-8" d="M25.938,48.842c-5.585-5.391-14.259-14.258-14.259-14.258V32.764H8.267a8.266,8.266,0,1,1,0-16.533h3.413V14.41L25.787,0H39.893C46.282,6.511,54,14.107,54,14.107v2.124h3.261a8.266,8.266,0,0,1,0,16.533H54v1.821c-7.514,7.729-13.955,14.258-13.955,14.258Z" transform="translate(9.556 25.331)"/>
|
||||||
|
<path id="Rectangle_23" data-name="Rectangle 23" class="cls-9" d="M6.143,0h10.39a0,0,0,0,1,0,0V12.286a0,0,0,0,1,0,0H6.143A6.143,6.143,0,0,1,0,6.143v0A6.143,6.143,0,0,1,6.143,0Z" transform="translate(11.528 43.533)"/>
|
||||||
|
<path id="Rectangle_24" data-name="Rectangle 24" class="cls-9" d="M6.143,0h10.39a0,0,0,0,1,0,0V12.286a0,0,0,0,1,0,0H6.143A6.143,6.143,0,0,1,0,6.143v0A6.143,6.143,0,0,1,6.143,0Z" transform="translate(72.96 55.82) rotate(180)"/>
|
||||||
|
<path id="Path_42" data-name="Path 42" class="cls-4" d="M.455,0H12.438a.455.455,0,0,1,.455.455V11.831a.455.455,0,0,1-.455.455H.455A.455.455,0,0,1,0,11.831V.455A.455.455,0,0,1,.455,0Z" transform="translate(35.797 43.533)"/>
|
||||||
|
<path id="Path_15" data-name="Path 15" class="cls-9" d="M-98.892-1598.849l12.741-.152,9.556,9.859-3.944,3.944v7.129h-3.64v-4.1a3.058,3.058,0,0,0-3.034-3.034c-2.961-.047-11.073,0-11.073,0a2.468,2.468,0,0,0-2.579,2.578v4.551h-3.64v-7.129l-3.944-3.944Z" transform="translate(134.841 1626.455)"/>
|
||||||
|
<path id="Path_16-2" data-name="Path 16" class="cls-9" d="M9.624.095,22.286,0l9.582,9.851-4,3.907v7.17h-3.6V16.815a3.065,3.065,0,0,0-3.026-3.058c-2.961-.047-11.011,0-11.011,0a2.6,2.6,0,0,0-2.65,2.65v4.521H3.907v-7.17L0,9.851Z" transform="translate(58.26 71.876) rotate(180)"/>
|
||||||
|
<rect id="Rectangle_26" data-name="Rectangle 26" class="cls-4" width="3.034" height="13.803" transform="translate(40.803)"/>
|
||||||
|
<rect id="Rectangle_10" data-name="Rectangle 10" class="cls-10" width="3.034" height="6.067" transform="translate(40.803 13.197)"/>
|
||||||
|
<rect id="Rectangle_12" data-name="Rectangle 12" class="cls-11" width="3.034" height="6.219" transform="translate(40.803 13.197)"/>
|
||||||
|
<rect id="Rectangle_11" data-name="Rectangle 11" class="cls-12" width="3.034" height="5.916" transform="translate(40.803 19.416)"/>
|
||||||
|
<path id="Path_15-2" data-name="Path 15" class="cls-9" d="M0,0H23.663V5.714c-2.618,2.638-5.976,5.965-5.976,5.965H1.972A1.972,1.972,0,0,1,0,9.708Z" transform="translate(0 19.416)"/>
|
||||||
|
</g>
|
||||||
|
<g id="LEGO_logo" data-name="LEGO logo" transform="translate(289.475 711.071)">
|
||||||
|
<rect id="Rectangle_31" data-name="Rectangle 31" class="cls-13" width="12.208" height="12.208" transform="translate(0.087 0.087)"/>
|
||||||
|
<g id="Group_15" data-name="Group 15">
|
||||||
|
<g id="Group_10" data-name="Group 10" class="cls-14">
|
||||||
|
<path id="Path_18-2" data-name="Path 18" class="cls-15" d="M.4,12.608H12.608V.4H.4ZM11.8,5.467a5.136,5.136,0,0,1-.24,1.179c-.437,1.267-.917,2.075-2.075,2.075a1.131,1.131,0,0,1-1.157-.7l-.044-.153L8.2,7.978A1.873,1.873,0,0,1,6.733,8.7a1.287,1.287,0,0,1-1.026-.437l-.066-.087-.066.066a1.589,1.589,0,0,1-1.157.415,1.317,1.317,0,0,1-.961-.371L3.37,8.262,3.3,8.327A1.556,1.556,0,0,1,2.191,8.7a.878.878,0,0,1-.961-.9A8.05,8.05,0,0,1,2.322,4.7a1.027,1.027,0,0,1,.917-.524.8.8,0,0,1,.568.175c.109.109.109.2.131.415l.022.284.153-.24a1.611,1.611,0,0,1,1.529-.655,1.05,1.05,0,0,1,.9.371l.044.087.066-.066a1.808,1.808,0,0,1,1.2-.393,1.52,1.52,0,0,1,1.114.371.762.762,0,0,1,.131.2l.066.109.087-.109a1.6,1.6,0,0,1,1.31-.568,1.258,1.258,0,0,1,.983.349,1.352,1.352,0,0,1,.262.961" transform="translate(-0.313 -0.313)"/>
|
||||||
|
</g>
|
||||||
|
<g id="Group_11" data-name="Group 11" class="cls-14">
|
||||||
|
<path id="Path_19-2" data-name="Path 19" class="cls-16" d="M.4,12.608H12.608V.4H.4ZM12.149,5.947a6.83,6.83,0,0,1-.524,1.594,2.28,2.28,0,0,1-2.1,1.551,1.694,1.694,0,0,1-1.354-.546,2.194,2.194,0,0,1-1.485.546A1.764,1.764,0,0,1,5.6,8.742a2.182,2.182,0,0,1-1.223.349,1.781,1.781,0,0,1-1.026-.306,2.2,2.2,0,0,1-1.179.306A1.285,1.285,0,0,1,.815,7.847,8.327,8.327,0,0,1,1.994,4.506a1.407,1.407,0,0,1,1.245-.743c.59,0,.786.175.9.371A2.259,2.259,0,0,1,5.6,3.741a1.5,1.5,0,0,1,1,.328,2.393,2.393,0,0,1,1.2-.306,1.731,1.731,0,0,1,1.354.459,2.039,2.039,0,0,1,1.332-.437,1.566,1.566,0,0,1,1.376.611,1.8,1.8,0,0,1,.284,1.551" transform="translate(-0.313 -0.313)"/>
|
||||||
|
</g>
|
||||||
|
<g id="Group_12" data-name="Group 12" class="cls-14">
|
||||||
|
<path id="Path_20-2" data-name="Path 20" class="cls-17" d="M0,12.383H12.383V0H0Zm12.208-.175H.175V.175H12.208Z"/>
|
||||||
|
</g>
|
||||||
|
<g id="Group_13" data-name="Group 13" class="cls-14">
|
||||||
|
<path id="Path_21-2" data-name="Path 21" class="cls-17" d="M52.962,15.984V15.9h.066c.044,0,.066.022.066.044s-.022.044-.066.044Zm.2.175-.044-.066q-.033-.066-.066-.066h0a.094.094,0,0,0,.087-.087.08.08,0,0,0-.087-.087H52.9v.306h.066v-.131h.022c.022,0,.044,0,.044.022.022.022.022.044.044.066l.022.044Zm-.153-.393a.24.24,0,1,1-.24.24.258.258,0,0,1,.24-.24m0-.066a.306.306,0,1,0,.306.306.312.312,0,0,0-.306-.306" transform="translate(-41.191 -12.271)"/>
|
||||||
|
</g>
|
||||||
|
<g id="Group_14" data-name="Group 14" class="cls-14">
|
||||||
|
<path id="Path_22" data-name="Path 22" class="cls-17" d="M13.189,17.122a1.713,1.713,0,0,0-1.376.611.557.557,0,0,0-.153-.218A1.442,1.442,0,0,0,10.5,17.1a1.858,1.858,0,0,0-1.245.415A1.089,1.089,0,0,0,8.3,17.1a1.68,1.68,0,0,0-1.594.7.539.539,0,0,0-.153-.459.883.883,0,0,0-.633-.2,1.1,1.1,0,0,0-.983.568A8.8,8.8,0,0,0,3.8,20.878a.966.966,0,0,0,1.048.961,1.516,1.516,0,0,0,1.179-.393,1.316,1.316,0,0,0,1,.393,1.582,1.582,0,0,0,1.223-.459,1.378,1.378,0,0,0,1.092.459,1.913,1.913,0,0,0,1.529-.764,1.2,1.2,0,0,0,1.245.743c1.2,0,1.725-.83,2.162-2.118a4.449,4.449,0,0,0,.262-1.2,1.207,1.207,0,0,0-1.354-1.376M5.218,20.4c.611-.109.786.109.764.328-.066.611-.633.764-1.114.743a.626.626,0,0,1-.7-.59,8.208,8.208,0,0,1,1.07-2.97.709.709,0,0,1,.677-.393c.306,0,.371.153.371.328A14.253,14.253,0,0,1,5.218,20.4m2.009-.568c-.044.109-.109.349-.175.59a2.42,2.42,0,0,1,.611-.087c.306,0,.48.131.48.371,0,.59-.655.764-1.114.764a.845.845,0,0,1-.939-.83,6.135,6.135,0,0,1,.677-2.271,1.372,1.372,0,0,1,1.529-.9c.306,0,.677.131.677.437,0,.415-.349.568-.677.59a3.851,3.851,0,0,1-.5,0,3.871,3.871,0,0,0-.24.48c.633-.087.9.044.786.415-.153.5-.59.524-1.114.437m3.123-1.551a.472.472,0,0,0-.371.218,6.165,6.165,0,0,0-.633,1.725c-.044.284.087.349.218.349.218,0,.459-.24.546-.611,0,0-.415,0-.306-.371s.328-.437.677-.459c.7-.022.633.48.568.764a1.8,1.8,0,0,1-1.7,1.594.89.89,0,0,1-.983-.961,4.914,4.914,0,0,1,.393-1.551c.371-.874.764-1.485,1.769-1.485.59,0,1.07.218,1,.764a.658.658,0,0,1-.633.677c-.109,0-.524,0-.393-.415.022-.131.044-.24-.153-.24m3.756.743a7.171,7.171,0,0,1-.59,1.616,1.409,1.409,0,0,1-1.376.852c-.437,0-.939-.175-.939-.852A5.286,5.286,0,0,1,11.595,19c.306-.83.633-1.507,1.66-1.485,1.157,0,.939,1.048.852,1.507m-.852-.524a9.808,9.808,0,0,1-.633,1.856.328.328,0,0,1-.306.218c-.131,0-.175-.087-.2-.2a7.657,7.657,0,0,1,.7-1.944c.087-.131.175-.153.262-.131.175,0,.175.109.175.2" transform="translate(-2.969 -13.366)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="EV3_logo" data-name="EV3 logo" transform="translate(215.286 714.697)">
|
||||||
|
<path id="Path_12" data-name="Path 12" class="cls-2" d="M72.066,1.849a.183.183,0,0,1,.191.164h0v.847A.153.153,0,0,1,72.094,3H70.071a.366.366,0,0,0-.383.328V4.473a.346.346,0,0,0,.383.3h2.023c.191,0,.164.137.164.137v.82c0,.082-.055.137-.164.137H68.677a.187.187,0,0,1-.191-.191V5.621a.391.391,0,0,0-.383-.383H66.983a.391.391,0,0,0-.383.383v1.64a.366.366,0,0,0,.383.328h6.751a.346.346,0,0,0,.383-.3V.4a.346.346,0,0,0-.383-.3H67.01a.346.346,0,0,0-.383.3V2.068a.387.387,0,0,0,.355.383H68.1a.362.362,0,0,0,.355-.355V2.041a.173.173,0,0,1,.191-.191h3.417Z" transform="translate(-48.397 -0.073)"/>
|
||||||
|
<path id="Path_13" data-name="Path 13" class="cls-2" d="M39.03,0H37.445c-.246,0-.328.164-.437.383L35.067,4.756a.23.23,0,0,1-.191.109.206.206,0,0,1-.191-.137L32.744.383C32.635.164,32.525,0,32.279,0H30.667c-.355,0-.41.191-.3.41l3.2,6.724c.164.328.273.383.574.383h1.421a.546.546,0,0,0,.574-.383L39.358.41c.109-.219.027-.41-.328-.41" transform="translate(-22.029)"/>
|
||||||
|
<path id="Path_14" data-name="Path 14" class="cls-2" d="M7.106,2.97a.346.346,0,0,1,.383.3V4.446a.346.346,0,0,1-.383.3H2.05c-.109,0-.191.055-.191.137h0V5.7h0c0,.082.082.137.191.137H7.106a.346.346,0,0,1,.383.3V7.288a.336.336,0,0,1-.355.3H.383A.346.346,0,0,1,0,7.288V.4A.346.346,0,0,1,.383.1H7.134a.319.319,0,0,1,.355.3V1.549a.319.319,0,0,1-.355.3H2.077c-.109,0-.219.027-.219.137v.847c0,.082.082.137.191.137Z" transform="translate(0 -0.073)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 12 KiB |
BIN
legoresources/SVGassets/Large Motor.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
650
legoresources/SVGassets/Large Motor.svg
Normal file
@ -0,0 +1,650 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
viewBox="2135.306 6140.141 153.634 153.634"
|
||||||
|
version="1.1"
|
||||||
|
id="svg7024"
|
||||||
|
sodipodi:docname="Large Motor.svg"
|
||||||
|
width="153.634"
|
||||||
|
height="153.634"
|
||||||
|
inkscape:version="0.92.1 r15371"
|
||||||
|
inkscape:export-filename="C:\gh\pxt-ev3\libs\core\jres\icons\motorLarge-icon.png"
|
||||||
|
inkscape:export-xdpi="74.983398"
|
||||||
|
inkscape:export-ydpi="74.983398">
|
||||||
|
<metadata
|
||||||
|
id="metadata7028">
|
||||||
|
<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>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1600"
|
||||||
|
inkscape:window-height="837"
|
||||||
|
id="namedview7026"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="1.5361183"
|
||||||
|
inkscape:cx="39.260502"
|
||||||
|
inkscape:cy="76.817001"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg7024" />
|
||||||
|
<defs
|
||||||
|
id="defs6971">
|
||||||
|
<style
|
||||||
|
id="style6897">
|
||||||
|
.cls-1 {
|
||||||
|
fill: #a8a9a8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-2 {
|
||||||
|
clip-path: url(#clip-path);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-3 {
|
||||||
|
fill: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-4 {
|
||||||
|
clip-path: url(#clip-path-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-5 {
|
||||||
|
fill: #f2f2f2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-6 {
|
||||||
|
clip-path: url(#clip-path-3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-7 {
|
||||||
|
fill: #6a6a6a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-8 {
|
||||||
|
fill: #9a9a9a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-9 {
|
||||||
|
fill: #b72b1c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-10 {
|
||||||
|
fill: #3c3c3c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-11 {
|
||||||
|
fill: #242424;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-12 {
|
||||||
|
filter: url(#rød);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-13 {
|
||||||
|
filter: url(#Path_4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-14 {
|
||||||
|
filter: url(#Path_1-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-15 {
|
||||||
|
filter: url(#Path_2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-16 {
|
||||||
|
filter: url(#Path_1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-17 {
|
||||||
|
filter: url(#Path_34);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<clipPath
|
||||||
|
id="clip-path">
|
||||||
|
<path
|
||||||
|
id="Union_6"
|
||||||
|
data-name="Union 6"
|
||||||
|
class="cls-1"
|
||||||
|
d="M 0,136.571 A 17.07,17.07 0 0 1 14.122,119.759 L 13.757,119.371 13.747,83.6 c 0,-0.419 0.142,-0.4 0.392,-0.673 L 25.043,72.4 V 62.372 l -0.75,-0.775 V 60.8 H 17.5 a 4,4 0 0 1 -4,-4 V 30.978 a 4,4 0 0 1 4,-4 h 6.793 V 18.8 a 5.784,5.784 0 0 1 5.784,-5.784 h 6.508 V 5.446 A 4,4 0 0 1 39.477,1.6 v -1 A 0.607,0.607 0 0 1 40.084,0 h 26.262 a 0.607,0.607 0 0 1 0.607,0.607 v 1.282 a 4,4 0 0 1 2.169,3.557 v 7.569 h 3.615 A 5.784,5.784 0 0 1 78.521,18.8 V 48.44 C 68.153,62.5 60.394,72.305 60.394,72.305 H 59.8 c 0,0 -7.092,-0.053 -13.682,-0.1 l 0.034,11.8 h 6.882 a 4,4 0 0 1 4,4 v 25.826 a 4,4 0 0 1 -4,4 h -6.785 l 0.034,11.775 c 0,0.838 -0.155,0.838 -0.462,1.137 l -10.415,10.099 -0.212,0.191 A 1.518,1.518 0 0 1 33.6,140.8 17.067,17.067 0 0 1 0,136.571 Z"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#a8a9a8" />
|
||||||
|
</clipPath>
|
||||||
|
<filter
|
||||||
|
id="Path_34"
|
||||||
|
x="2168.8911"
|
||||||
|
y="6138.5869"
|
||||||
|
width="38.536999"
|
||||||
|
height="21.907"
|
||||||
|
filterUnits="userSpaceOnUse">
|
||||||
|
<feOffset
|
||||||
|
input="SourceAlpha"
|
||||||
|
id="feOffset6901" />
|
||||||
|
<feGaussianBlur
|
||||||
|
stdDeviation="1"
|
||||||
|
result="blur"
|
||||||
|
id="feGaussianBlur6903" />
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0.502"
|
||||||
|
id="feFlood6905" />
|
||||||
|
<feComposite
|
||||||
|
operator="in"
|
||||||
|
in2="blur"
|
||||||
|
id="feComposite6907"
|
||||||
|
result="result1" />
|
||||||
|
<feComposite
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="result1"
|
||||||
|
id="feComposite6909" />
|
||||||
|
</filter>
|
||||||
|
<filter
|
||||||
|
id="Path_1"
|
||||||
|
x="2146.053"
|
||||||
|
y="6207.1338"
|
||||||
|
width="38.536999"
|
||||||
|
height="77.177002"
|
||||||
|
filterUnits="userSpaceOnUse">
|
||||||
|
<feOffset
|
||||||
|
input="SourceAlpha"
|
||||||
|
id="feOffset6912" />
|
||||||
|
<feGaussianBlur
|
||||||
|
stdDeviation="1"
|
||||||
|
result="blur-2"
|
||||||
|
id="feGaussianBlur6914" />
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0.502"
|
||||||
|
id="feFlood6916" />
|
||||||
|
<feComposite
|
||||||
|
operator="in"
|
||||||
|
in2="blur-2"
|
||||||
|
id="feComposite6918"
|
||||||
|
result="result1" />
|
||||||
|
<feComposite
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="result1"
|
||||||
|
id="feComposite6920" />
|
||||||
|
</filter>
|
||||||
|
<filter
|
||||||
|
id="Path_2"
|
||||||
|
x="2157.3491"
|
||||||
|
y="6198.8062"
|
||||||
|
width="27.028999"
|
||||||
|
height="28.403"
|
||||||
|
filterUnits="userSpaceOnUse">
|
||||||
|
<feOffset
|
||||||
|
input="SourceAlpha"
|
||||||
|
id="feOffset6923" />
|
||||||
|
<feGaussianBlur
|
||||||
|
stdDeviation="1"
|
||||||
|
result="blur-3"
|
||||||
|
id="feGaussianBlur6925" />
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0.502"
|
||||||
|
id="feFlood6927" />
|
||||||
|
<feComposite
|
||||||
|
operator="in"
|
||||||
|
in2="blur-3"
|
||||||
|
id="feComposite6929"
|
||||||
|
result="result1" />
|
||||||
|
<feComposite
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="result1"
|
||||||
|
id="feComposite6931" />
|
||||||
|
</filter>
|
||||||
|
<filter
|
||||||
|
id="Path_1-2"
|
||||||
|
x="2156.6001"
|
||||||
|
y="6150.1548"
|
||||||
|
width="60.229"
|
||||||
|
height="65.290001"
|
||||||
|
filterUnits="userSpaceOnUse">
|
||||||
|
<feOffset
|
||||||
|
input="SourceAlpha"
|
||||||
|
id="feOffset6934" />
|
||||||
|
<feGaussianBlur
|
||||||
|
stdDeviation="1"
|
||||||
|
result="blur-4"
|
||||||
|
id="feGaussianBlur6936" />
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0.502"
|
||||||
|
id="feFlood6938" />
|
||||||
|
<feComposite
|
||||||
|
operator="in"
|
||||||
|
in2="blur-4"
|
||||||
|
id="feComposite6940"
|
||||||
|
result="result1" />
|
||||||
|
<feComposite
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="result1"
|
||||||
|
id="feComposite6942" />
|
||||||
|
</filter>
|
||||||
|
<clipPath
|
||||||
|
id="clip-path-2">
|
||||||
|
<path
|
||||||
|
id="Path_9"
|
||||||
|
data-name="Path 9"
|
||||||
|
class="cls-1"
|
||||||
|
d="m 5.784,0 h 42.66 a 5.784,5.784 0 0 1 5.784,5.784 v 29.64 C 43.86,49.487 36.1,59.29 36.1,59.29 h -0.595 c 0,0 -19.462,-0.147 -23.864,-0.147 A 2.28,2.28 0 0 1 9.263,58.158 L 0,48.582 V 5.784 A 5.784,5.784 0 0 1 5.784,0 Z"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#a8a9a8" />
|
||||||
|
</clipPath>
|
||||||
|
<filter
|
||||||
|
id="Path_4"
|
||||||
|
x="2162.384"
|
||||||
|
y="6155.2168"
|
||||||
|
width="48.66"
|
||||||
|
height="54.444"
|
||||||
|
filterUnits="userSpaceOnUse">
|
||||||
|
<feOffset
|
||||||
|
input="SourceAlpha"
|
||||||
|
id="feOffset6947" />
|
||||||
|
<feGaussianBlur
|
||||||
|
stdDeviation="1"
|
||||||
|
result="blur-5"
|
||||||
|
id="feGaussianBlur6949" />
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0.502"
|
||||||
|
id="feFlood6951" />
|
||||||
|
<feComposite
|
||||||
|
operator="in"
|
||||||
|
in2="blur-5"
|
||||||
|
id="feComposite6953"
|
||||||
|
result="result1" />
|
||||||
|
<feComposite
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="result1"
|
||||||
|
id="feComposite6955" />
|
||||||
|
</filter>
|
||||||
|
<clipPath
|
||||||
|
id="clip-path-3">
|
||||||
|
<path
|
||||||
|
id="Path_10"
|
||||||
|
data-name="Path 10"
|
||||||
|
class="cls-1"
|
||||||
|
d="M 5.784,0 H 36.875 A 5.784,5.784 0 0 1 42.66,5.784 V 28.032 C 34.013,39.3 27.1,48.444 27.1,48.444 H 5.784 A 5.784,5.784 0 0 1 0,42.66 V 5.784 A 5.784,5.784 0 0 1 5.784,0 Z"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#a8a9a8" />
|
||||||
|
</clipPath>
|
||||||
|
<filter
|
||||||
|
id="rød"
|
||||||
|
x="2132.3059"
|
||||||
|
y="6256.646"
|
||||||
|
width="40.129002"
|
||||||
|
height="40.129002"
|
||||||
|
filterUnits="userSpaceOnUse">
|
||||||
|
<feOffset
|
||||||
|
input="SourceAlpha"
|
||||||
|
id="feOffset6960" />
|
||||||
|
<feGaussianBlur
|
||||||
|
stdDeviation="1"
|
||||||
|
result="blur-6"
|
||||||
|
id="feGaussianBlur6962" />
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0.502"
|
||||||
|
id="feFlood6964" />
|
||||||
|
<feComposite
|
||||||
|
operator="in"
|
||||||
|
in2="blur-6"
|
||||||
|
id="feComposite6966"
|
||||||
|
result="result1" />
|
||||||
|
<feComposite
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="result1"
|
||||||
|
id="feComposite6968" />
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="Large_Motor"
|
||||||
|
data-name="Large Motor"
|
||||||
|
transform="translate(1383.553,5554.0014)">
|
||||||
|
<g
|
||||||
|
id="Mask_Group_6"
|
||||||
|
data-name="Mask Group 6"
|
||||||
|
class="cls-2"
|
||||||
|
transform="translate(789.306,586.141)"
|
||||||
|
clip-path="url(#clip-path)">
|
||||||
|
<g
|
||||||
|
id="Large_motor-2"
|
||||||
|
data-name="Large motor"
|
||||||
|
transform="translate(-1.623)">
|
||||||
|
<path
|
||||||
|
id="Path_45"
|
||||||
|
data-name="Path 45"
|
||||||
|
class="cls-1"
|
||||||
|
d="m 5.461,0 h 5.612 a 5.461,5.461 0 0 1 5.461,5.461 v 22.9 a 5.461,5.461 0 0 1 -5.461,5.461 H 5.461 A 5.461,5.461 0 0 1 0,28.365 V 5.461 A 5.461,5.461 0 0 1 5.461,0 Z"
|
||||||
|
transform="translate(42.123,84.012)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#a8a9a8" />
|
||||||
|
<circle
|
||||||
|
id="Ellipse_2"
|
||||||
|
data-name="Ellipse 2"
|
||||||
|
class="cls-3"
|
||||||
|
cx="3.7920001"
|
||||||
|
cy="3.7920001"
|
||||||
|
transform="translate(49.555,85.528)"
|
||||||
|
r="3.7920001"
|
||||||
|
style="fill:#ffffff" />
|
||||||
|
<circle
|
||||||
|
id="Ellipse_1"
|
||||||
|
data-name="Ellipse 1"
|
||||||
|
class="cls-3"
|
||||||
|
cx="3.7920001"
|
||||||
|
cy="3.7920001"
|
||||||
|
transform="translate(49.555,108.736)"
|
||||||
|
r="3.7920001"
|
||||||
|
style="fill:#ffffff" />
|
||||||
|
<path
|
||||||
|
id="Path_36"
|
||||||
|
data-name="Path 36"
|
||||||
|
class="cls-1"
|
||||||
|
d="m 0.607,0 h 26.262 a 0.607,0.607 0 0 1 0.607,0.607 V 5.9 A 0.607,0.607 0 0 1 26.869,6.507 H 0.607 A 0.607,0.607 0 0 1 0,5.9 V 0.607 A 0.607,0.607 0 0 1 0.607,0 Z"
|
||||||
|
transform="translate(41.1)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#a8a9a8" />
|
||||||
|
<g
|
||||||
|
class="cls-17"
|
||||||
|
transform="translate(-2133.68,-6140.14)"
|
||||||
|
id="g6978"
|
||||||
|
style="filter:url(#Path_34)">
|
||||||
|
<path
|
||||||
|
id="Path_34-2"
|
||||||
|
data-name="Path 34"
|
||||||
|
class="cls-1"
|
||||||
|
d="M 0.607,0 H 31.93 a 0.607,0.607 0 0 1 0.607,0.607 V 15.3 A 0.607,0.607 0 0 1 31.93,15.907 H 0.607 A 0.607,0.607 0 0 1 0,15.3 V 0.607 A 0.607,0.607 0 0 1 0.607,0 Z"
|
||||||
|
transform="translate(2171.89,6141.59)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#a8a9a8" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
id="Path_2-2"
|
||||||
|
data-name="Path 2"
|
||||||
|
class="cls-3"
|
||||||
|
d="m 5610.158,939.234 a 4.151,4.151 0 0 1 -2.342,0.705 5.131,5.131 0 0 1 -2.988,-0.705 c -1.257,-0.931 -1.229,0.1 -1.229,0.1 v 1.8 c 0,0.45 0.553,0.846 1.229,0.459 0.676,-0.387 1,-0.581 1,-0.581 0,0 0.361,-0.184 0.361,0.335 v 2.62 c 0,0 0.021,0.786 -0.73,0.768 -0.751,-0.018 -1.38,0 -1.38,0 0,0 -0.293,0.248 -0.293,1.385 0,1.137 0.293,1.322 0.293,1.322 h 1.38 c 0,0 0.73,-0.024 0.73,0.649 v 1.3 c 0,0 0.227,0.359 1.169,0.306 a 3.6,3.6 0 0 0 1.4,-0.306 v -1.3 a 0.67,0.67 0 0 1 0.66,-0.649 c 0.631,-0.01 1.257,0 1.257,0 0,0 0.252,-0.191 0.287,-1.322 0.035,-1.131 -0.287,-1.385 -0.287,-1.385 h -1.257 c 0,0 -0.805,-0.052 -0.817,-0.768 -0.012,-0.716 0,-2.62 0,-2.62 0,0 -0.047,-0.515 0.332,-0.335 0.379,0.18 1.215,0.581 1.215,0.581 0,0 0.83,0.407 0.814,-0.459 -0.016,-0.866 0,-1.8 0,-1.8 0,0 -0.072,-0.534 -0.804,-0.1 z"
|
||||||
|
transform="translate(-5553.893,-845.301)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#ffffff" />
|
||||||
|
<path
|
||||||
|
id="Path_3"
|
||||||
|
data-name="Path 3"
|
||||||
|
class="cls-3"
|
||||||
|
d="m 5601.9,1015.336 a 0.83,0.83 0 0 1 1.2,-0.594 6.516,6.516 0 0 0 2.85,0.772 5.05,5.05 0 0 0 2.768,-0.772 c 0.829,-0.4 1.067,0.594 1.067,0.594 v 1.76 a 0.71,0.71 0 0 1 -1.067,0.561 5.791,5.791 0 0 0 -2.768,-0.837 7.06,7.06 0 0 0 -2.85,0.837 c 0,0 -1.178,0.239 -1.2,-0.561 -0.022,-0.8 0,-1.76 0,-1.76 z"
|
||||||
|
transform="translate(-5552.485,-909.604)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#ffffff" />
|
||||||
|
<g
|
||||||
|
class="cls-16"
|
||||||
|
transform="translate(-2133.68,-6140.14)"
|
||||||
|
id="g6983"
|
||||||
|
style="filter:url(#Path_1)">
|
||||||
|
<path
|
||||||
|
id="Path_1-3"
|
||||||
|
data-name="Path 1"
|
||||||
|
class="cls-1"
|
||||||
|
d="M 0.016,8.513 13.42,-4.416 31.991,-3.746 32.162,55.2 c 0,0.838 -0.155,0.838 -0.462,1.137 l -10.416,10.096 -0.212,0.19 c -0.584,0.4 -1.987,-0.115 -1.987,-0.952 L -0.364,44.961 -0.375,9.187 c 0,-0.419 0.142,-0.402 0.391,-0.674 z"
|
||||||
|
transform="translate(2149.43,6214.55)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#a8a9a8" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
class="cls-15"
|
||||||
|
transform="translate(-2133.68,-6140.14)"
|
||||||
|
id="g6986"
|
||||||
|
style="filter:url(#Path_2)">
|
||||||
|
<path
|
||||||
|
id="Path_2-3"
|
||||||
|
data-name="Path 2"
|
||||||
|
class="cls-1"
|
||||||
|
d="m 1484.037,521.285 v 17.253 c 0,0 0.019,0.845 0.3,1.121 0.281,0.276 3.516,3.626 3.516,3.626 a 1.566,1.566 0 0 0 1.157,0.4 c 0.758,-0.025 11.627,0 11.627,0 l 4.429,-4.7 v -7.963 l -10.662,-0.567 z"
|
||||||
|
transform="translate(676.31,5680.52)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#a8a9a8" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="Group_4"
|
||||||
|
data-name="Group 4"
|
||||||
|
transform="translate(15.123,26.978)">
|
||||||
|
<path
|
||||||
|
id="Path_44"
|
||||||
|
data-name="Path 44"
|
||||||
|
class="cls-1"
|
||||||
|
d="m 5.461,0 h 5.612 a 5.461,5.461 0 0 1 5.461,5.461 v 22.9 a 5.461,5.461 0 0 1 -5.461,5.461 H 5.461 A 5.461,5.461 0 0 1 0,28.365 V 5.461 A 5.461,5.461 0 0 1 5.461,0 Z"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#a8a9a8" />
|
||||||
|
<circle
|
||||||
|
id="Ellipse_3"
|
||||||
|
data-name="Ellipse 3"
|
||||||
|
class="cls-3"
|
||||||
|
cx="3.7920001"
|
||||||
|
cy="3.7920001"
|
||||||
|
transform="translate(1.062,1.517)"
|
||||||
|
r="3.7920001"
|
||||||
|
style="fill:#ffffff" />
|
||||||
|
<circle
|
||||||
|
id="Ellipse_4"
|
||||||
|
data-name="Ellipse 4"
|
||||||
|
class="cls-3"
|
||||||
|
cx="3.7920001"
|
||||||
|
cy="3.7920001"
|
||||||
|
transform="translate(1.062,24.725)"
|
||||||
|
r="3.7920001"
|
||||||
|
style="fill:#ffffff" />
|
||||||
|
<path
|
||||||
|
id="Path_5"
|
||||||
|
data-name="Path 5"
|
||||||
|
class="cls-3"
|
||||||
|
d="m 5610.158,939.234 a 4.151,4.151 0 0 1 -2.342,0.705 5.131,5.131 0 0 1 -2.988,-0.705 c -1.257,-0.931 -1.229,0.1 -1.229,0.1 v 1.8 c 0,0.45 0.553,0.846 1.229,0.459 0.676,-0.387 1,-0.581 1,-0.581 0,0 0.361,-0.184 0.361,0.335 v 2.62 c 0,0 0.021,0.786 -0.73,0.768 -0.751,-0.018 -1.38,0 -1.38,0 0,0 -0.293,0.248 -0.293,1.385 0,1.137 0.293,1.322 0.293,1.322 h 1.38 c 0,0 0.73,-0.024 0.73,0.649 v 1.3 c 0,0 0.227,0.359 1.169,0.306 a 3.6,3.6 0 0 0 1.4,-0.306 v -1.3 a 0.67,0.67 0 0 1 0.66,-0.649 c 0.631,-0.01 1.257,0 1.257,0 0,0 0.252,-0.191 0.287,-1.322 0.035,-1.131 -0.287,-1.385 -0.287,-1.385 h -1.257 c 0,0 -0.805,-0.052 -0.817,-0.768 -0.012,-0.716 0,-2.62 0,-2.62 0,0 -0.047,-0.515 0.332,-0.335 0.379,0.18 1.215,0.581 1.215,0.581 0,0 0.83,0.407 0.814,-0.459 -0.016,-0.866 0,-1.8 0,-1.8 0,0 -0.072,-0.534 -0.804,-0.1 z"
|
||||||
|
transform="translate(-5602.386,-929.312)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#ffffff" />
|
||||||
|
<path
|
||||||
|
id="Path_6"
|
||||||
|
data-name="Path 6"
|
||||||
|
class="cls-3"
|
||||||
|
d="m 5601.9,1015.336 a 0.83,0.83 0 0 1 1.2,-0.594 6.516,6.516 0 0 0 2.85,0.772 5.05,5.05 0 0 0 2.768,-0.772 c 0.829,-0.4 1.067,0.594 1.067,0.594 v 1.76 a 0.71,0.71 0 0 1 -1.067,0.561 5.791,5.791 0 0 0 -2.768,-0.837 7.06,7.06 0 0 0 -2.85,0.837 c 0,0 -1.178,0.239 -1.2,-0.561 -0.022,-0.8 0,-1.76 0,-1.76 z"
|
||||||
|
transform="translate(-5600.979,-993.616)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#ffffff" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
class="cls-14"
|
||||||
|
transform="translate(-2133.68,-6140.14)"
|
||||||
|
id="g6995"
|
||||||
|
style="filter:url(#Path_1-2)">
|
||||||
|
<path
|
||||||
|
id="Path_1-4"
|
||||||
|
data-name="Path 1"
|
||||||
|
class="cls-1"
|
||||||
|
d="m 5.784,0 h 42.66 a 5.784,5.784 0 0 1 5.784,5.784 v 29.64 C 43.86,49.487 36.1,59.29 36.1,59.29 h -0.595 c 0,0 -19.462,-0.147 -23.864,-0.147 A 2.28,2.28 0 0 1 9.263,58.158 L 0,48.582 V 5.784 A 5.784,5.784 0 0 1 5.784,0 Z"
|
||||||
|
transform="translate(2159.6,6153.16)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#a8a9a8" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="hvid"
|
||||||
|
transform="translate(25.916,13.015)">
|
||||||
|
<g
|
||||||
|
id="Mask_Group_1"
|
||||||
|
data-name="Mask Group 1"
|
||||||
|
class="cls-4"
|
||||||
|
clip-path="url(#clip-path-2)">
|
||||||
|
<path
|
||||||
|
id="hvid-2"
|
||||||
|
data-name="hvid"
|
||||||
|
class="cls-5"
|
||||||
|
d="m 1498.578,449.051 7.155,7.37 23.789,31.08 v 14.857 l 13.063,-16.131 v -31.221 l -0.993,-7.691 z"
|
||||||
|
transform="translate(-1487.315,-449.455)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#f2f2f2" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
class="cls-13"
|
||||||
|
transform="translate(-2133.68,-6140.14)"
|
||||||
|
id="g7001"
|
||||||
|
style="filter:url(#Path_4)">
|
||||||
|
<path
|
||||||
|
id="Path_4-2"
|
||||||
|
data-name="Path 4"
|
||||||
|
class="cls-1"
|
||||||
|
d="M 5.784,0 H 36.875 A 5.784,5.784 0 0 1 42.66,5.784 V 28.032 C 34.013,39.3 27.1,48.444 27.1,48.444 H 5.784 A 5.784,5.784 0 0 1 0,42.66 V 5.784 A 5.784,5.784 0 0 1 5.784,0 Z"
|
||||||
|
transform="translate(2165.38,6158.22)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#a8a9a8" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="Group_3"
|
||||||
|
data-name="Group 3"
|
||||||
|
transform="translate(31.7,18.38)">
|
||||||
|
<g
|
||||||
|
id="Mask_Group_2"
|
||||||
|
data-name="Mask Group 2"
|
||||||
|
class="cls-6"
|
||||||
|
clip-path="url(#clip-path-3)">
|
||||||
|
<path
|
||||||
|
id="Union_1"
|
||||||
|
data-name="Union 1"
|
||||||
|
class="cls-7"
|
||||||
|
d="M 14.461,28.56 V 1.085 a 1.085,1.085 0 1 1 2.169,0 V 28.56 a 1.085,1.085 0 1 1 -2.169,0 z m -3.615,0 V 1.085 a 1.085,1.085 0 1 1 2.169,0 V 28.56 a 1.085,1.085 0 1 1 -2.169,0 z m -3.615,0 V 1.085 a 1.085,1.085 0 1 1 2.169,0 V 28.56 a 1.085,1.085 0 1 1 -2.169,0 z m -3.615,0 V 1.085 a 1.085,1.085 0 1 1 2.169,0 V 28.56 a 1.085,1.085 0 1 1 -2.169,0 z M 0,28.56 V 1.085 a 1.085,1.085 0 1 1 2.169,0 V 28.56 A 1.085,1.085 0 1 1 0,28.56 Z"
|
||||||
|
transform="translate(15.907,-5.365)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#6a6a6a" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<circle
|
||||||
|
id="Ellipse_1-2"
|
||||||
|
data-name="Ellipse 1"
|
||||||
|
class="cls-8"
|
||||||
|
cx="2.2449999"
|
||||||
|
cy="2.2449999"
|
||||||
|
transform="translate(29.076,16.175)"
|
||||||
|
r="2.2449999"
|
||||||
|
style="fill:#9a9a9a" />
|
||||||
|
<circle
|
||||||
|
id="Ellipse_2-2"
|
||||||
|
data-name="Ellipse 2"
|
||||||
|
class="cls-8"
|
||||||
|
cx="2.2449999"
|
||||||
|
cy="2.2449999"
|
||||||
|
transform="translate(57.744,66.686)"
|
||||||
|
r="2.2449999"
|
||||||
|
style="fill:#9a9a9a" />
|
||||||
|
<g
|
||||||
|
class="cls-12"
|
||||||
|
transform="translate(-2133.68,-6140.14)"
|
||||||
|
id="g7009">
|
||||||
|
<circle
|
||||||
|
id="rød-2"
|
||||||
|
data-name="rød"
|
||||||
|
class="cls-9"
|
||||||
|
cx="17.063999"
|
||||||
|
cy="17.063999"
|
||||||
|
transform="translate(2135.31,6259.65)"
|
||||||
|
r="17.063999"
|
||||||
|
style="fill:#b72b1c" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="Group_2"
|
||||||
|
data-name="Group 2"
|
||||||
|
transform="matrix(0.966,0.259,-0.259,0.966,7.93,117.883)">
|
||||||
|
<circle
|
||||||
|
id="Ellipse_4-2"
|
||||||
|
data-name="Ellipse 4"
|
||||||
|
class="cls-10"
|
||||||
|
cx="3.7920001"
|
||||||
|
cy="3.7920001"
|
||||||
|
transform="translate(11.528)"
|
||||||
|
r="3.7920001"
|
||||||
|
style="fill:#3c3c3c" />
|
||||||
|
<circle
|
||||||
|
id="Ellipse_7"
|
||||||
|
data-name="Ellipse 7"
|
||||||
|
class="cls-10"
|
||||||
|
cx="3.7920001"
|
||||||
|
cy="3.7920001"
|
||||||
|
transform="translate(23.056,11.528)"
|
||||||
|
r="3.7920001"
|
||||||
|
style="fill:#3c3c3c" />
|
||||||
|
<circle
|
||||||
|
id="Ellipse_5"
|
||||||
|
data-name="Ellipse 5"
|
||||||
|
class="cls-10"
|
||||||
|
cx="3.7920001"
|
||||||
|
cy="3.7920001"
|
||||||
|
transform="translate(11.528,23.056)"
|
||||||
|
r="3.7920001"
|
||||||
|
style="fill:#3c3c3c" />
|
||||||
|
<circle
|
||||||
|
id="Ellipse_6"
|
||||||
|
data-name="Ellipse 6"
|
||||||
|
class="cls-10"
|
||||||
|
cx="3.7920001"
|
||||||
|
cy="3.7920001"
|
||||||
|
transform="translate(0,11.528)"
|
||||||
|
r="3.7920001"
|
||||||
|
style="fill:#3c3c3c" />
|
||||||
|
<path
|
||||||
|
id="Path_4-3"
|
||||||
|
data-name="Path 4"
|
||||||
|
class="cls-11"
|
||||||
|
d="m 2.4,1.566 c 0,0 0.021,0.786 -0.73,0.768 -0.751,-0.018 -1.38,0 -1.38,0 0,0 -0.29,0.248 -0.29,1.385 0,1.137 0.294,1.322 0.294,1.322 h 1.38 c 0,0 0.73,-0.024 0.73,0.649 0,0.673 0,1.3 0,1.3 0,0 0.227,0.359 1.17,0.306 a 3.594,3.594 0 0 0 1.4,-0.306 v -1.3 a 0.67,0.67 0 0 1 0.66,-0.649 c 0.631,-0.01 1.257,0 1.257,0 0,0 0.253,-0.191 0.287,-1.322 C 7.212,2.588 6.891,2.333 6.891,2.333 H 5.638 c 0,0 -0.806,-0.052 -0.818,-0.768 A 12.478,12.478 0 0 1 4.884,0.305 2.9,2.9 0 0 0 2.529,0.213 C 2.45,0.819 2.4,1.566 2.4,1.566 Z"
|
||||||
|
transform="rotate(-90,15.2715,3.5915)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#242424" />
|
||||||
|
<path
|
||||||
|
id="Path_5-2"
|
||||||
|
data-name="Path 5"
|
||||||
|
class="cls-10"
|
||||||
|
d="M 0.455,0.155 2.016,0 3.64,0.155 A 0.455,0.455 0 0 1 4.1,0.61 V 2.734 A 0.455,0.455 0 0 1 3.645,3.189 L 2.094,2.979 0.46,3.189 A 0.455,0.455 0 0 1 0,2.734 V 0.61 A 0.455,0.455 0 0 1 0.455,0.155 Z"
|
||||||
|
transform="translate(13.241,8.084)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#3c3c3c" />
|
||||||
|
<path
|
||||||
|
id="Path_7"
|
||||||
|
data-name="Path 7"
|
||||||
|
class="cls-10"
|
||||||
|
d="M 0.455,0.155 2.016,0 3.64,0.155 A 0.455,0.455 0 0 1 4.1,0.61 V 2.734 A 0.455,0.455 0 0 1 3.645,3.189 L 2.094,2.979 0.46,3.189 A 0.455,0.455 0 0 1 0,2.734 V 0.61 A 0.455,0.455 0 0 1 0.455,0.155 Z"
|
||||||
|
transform="rotate(-90,12.71,4.628)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#3c3c3c" />
|
||||||
|
<path
|
||||||
|
id="Path_6-2"
|
||||||
|
data-name="Path 6"
|
||||||
|
class="cls-10"
|
||||||
|
d="M 0.455,0.155 2.016,0 3.64,0.155 A 0.455,0.455 0 0 1 4.1,0.61 V 2.734 A 0.455,0.455 0 0 1 3.645,3.189 L 2.094,2.979 0.46,3.189 A 0.455,0.455 0 0 1 0,2.734 V 0.61 A 0.455,0.455 0 0 1 0.455,0.155 Z"
|
||||||
|
transform="rotate(180,8.668,11.2485)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#3c3c3c" />
|
||||||
|
<path
|
||||||
|
id="Path_8"
|
||||||
|
data-name="Path 8"
|
||||||
|
class="cls-10"
|
||||||
|
d="M 0.455,0.155 2.016,0 3.64,0.155 A 0.455,0.455 0 0 1 4.1,0.61 V 2.734 A 0.455,0.455 0 0 1 3.645,3.189 L 2.094,2.979 0.46,3.189 A 0.455,0.455 0 0 1 0,2.734 V 0.61 A 0.455,0.455 0 0 1 0.455,0.155 Z"
|
||||||
|
transform="rotate(90,4.6265,17.8685)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#3c3c3c" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 23 KiB |
220
legoresources/SVGassets/Medium Motor.svg
Normal file
@ -0,0 +1,220 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
viewBox="1719.858 6177.276 47.14 47.14"
|
||||||
|
version="1.1"
|
||||||
|
id="svg7610"
|
||||||
|
sodipodi:docname="Medium Motor.svg"
|
||||||
|
inkscape:export-filename="C:\gh\pxt-ev3\libs\core\jres\icons\motorMedium-icon.png"
|
||||||
|
inkscape:export-xdpi="244.37845"
|
||||||
|
inkscape:export-ydpi="244.37845"
|
||||||
|
inkscape:version="0.92.1 r15371">
|
||||||
|
<metadata
|
||||||
|
id="metadata7614">
|
||||||
|
<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>
|
||||||
|
<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="namedview7612"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="5.0063641"
|
||||||
|
inkscape:cx="23.57"
|
||||||
|
inkscape:cy="23.57"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg7610" />
|
||||||
|
<defs
|
||||||
|
id="defs7591">
|
||||||
|
<style
|
||||||
|
id="style7573">
|
||||||
|
.cls-1 {
|
||||||
|
fill: url(#linear-gradient);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-2 {
|
||||||
|
fill: #a8a9a8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-3 {
|
||||||
|
fill: #3c3c3c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-4 {
|
||||||
|
fill: #b72b1c;
|
||||||
|
stroke: #8b1104;
|
||||||
|
stroke-width: 0.25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-5 {
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-6 {
|
||||||
|
fill: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-7 {
|
||||||
|
filter: url(#Union_1);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<linearGradient
|
||||||
|
id="linear-gradient"
|
||||||
|
x1="0.5"
|
||||||
|
y1="0.919"
|
||||||
|
x2="0.5"
|
||||||
|
y2="1.077"
|
||||||
|
gradientUnits="objectBoundingBox">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#a8a9a8"
|
||||||
|
id="stop7575" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#545554"
|
||||||
|
id="stop7577" />
|
||||||
|
</linearGradient>
|
||||||
|
<filter
|
||||||
|
id="Union_1"
|
||||||
|
x="1719.858"
|
||||||
|
y="6177.276"
|
||||||
|
width="47.14"
|
||||||
|
height="47.14"
|
||||||
|
filterUnits="userSpaceOnUse">
|
||||||
|
<feOffset
|
||||||
|
input="SourceAlpha"
|
||||||
|
id="feOffset7580" />
|
||||||
|
<feGaussianBlur
|
||||||
|
stdDeviation="0.5"
|
||||||
|
result="blur"
|
||||||
|
id="feGaussianBlur7582" />
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0.322"
|
||||||
|
id="feFlood7584" />
|
||||||
|
<feComposite
|
||||||
|
operator="in"
|
||||||
|
in2="blur"
|
||||||
|
id="feComposite7586"
|
||||||
|
result="result1" />
|
||||||
|
<feComposite
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="result1"
|
||||||
|
id="feComposite7588" />
|
||||||
|
</filter>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="Medium_Motor"
|
||||||
|
data-name="Medium Motor"
|
||||||
|
transform="translate(1346 5554)">
|
||||||
|
<g
|
||||||
|
id="Group_4"
|
||||||
|
data-name="Group 4"
|
||||||
|
transform="translate(375.358 624.776)">
|
||||||
|
<path
|
||||||
|
id="Path_1"
|
||||||
|
data-name="Path 1"
|
||||||
|
class="cls-1"
|
||||||
|
d="M3.281-.287h39a2.357,2.357,0,0,1,2.57,1.972V42.033c0,1-1.1,1.82-2.57,1.82h-39c-1.473,0-2.57-.815-2.57-1.82V1.685A2.357,2.357,0,0,1,3.281-.287Z"
|
||||||
|
transform="translate(-0.711 0.287)" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="Group_7"
|
||||||
|
data-name="Group 7"
|
||||||
|
transform="translate(419.498 624.776) rotate(90)">
|
||||||
|
<g
|
||||||
|
class="cls-7"
|
||||||
|
transform="matrix(0, -1, 1, 0, -6178.78, 1765.5)"
|
||||||
|
id="g7596">
|
||||||
|
<path
|
||||||
|
id="Union_1-2"
|
||||||
|
data-name="Union 1"
|
||||||
|
class="cls-2"
|
||||||
|
d="M21.236,44.14a6.219,6.219,0,0,1-6.219-6.219v-8.8h-8.8A6.219,6.219,0,0,1,0,22.9V21.236a6.219,6.219,0,0,1,6.219-6.219h8.8v-8.8A6.219,6.219,0,0,1,21.236,0H22.9a6.219,6.219,0,0,1,6.219,6.219v8.8h8.8a6.219,6.219,0,0,1,6.219,6.219V22.9a6.219,6.219,0,0,1-6.219,6.219h-8.8v8.8A6.219,6.219,0,0,1,22.9,44.14Z"
|
||||||
|
transform="translate(1765.5 6178.78) rotate(90)" />
|
||||||
|
</g>
|
||||||
|
<ellipse
|
||||||
|
id="Ellipse_1"
|
||||||
|
data-name="Ellipse 1"
|
||||||
|
class="cls-3"
|
||||||
|
cx="4.854"
|
||||||
|
cy="4.854"
|
||||||
|
rx="4.854"
|
||||||
|
ry="4.854"
|
||||||
|
transform="translate(17.292 1.517)" />
|
||||||
|
<ellipse
|
||||||
|
id="Ellipse_2"
|
||||||
|
data-name="Ellipse 2"
|
||||||
|
class="cls-3"
|
||||||
|
cx="4.854"
|
||||||
|
cy="4.854"
|
||||||
|
rx="4.854"
|
||||||
|
ry="4.854"
|
||||||
|
transform="translate(17.292 32.915)" />
|
||||||
|
<ellipse
|
||||||
|
id="Ellipse_1-2"
|
||||||
|
data-name="Ellipse 1"
|
||||||
|
class="cls-3"
|
||||||
|
cx="4.854"
|
||||||
|
cy="4.854"
|
||||||
|
rx="4.854"
|
||||||
|
ry="4.854"
|
||||||
|
transform="translate(1.517 26.848) rotate(-90)" />
|
||||||
|
<ellipse
|
||||||
|
id="Ellipse_2-2"
|
||||||
|
data-name="Ellipse 2"
|
||||||
|
class="cls-3"
|
||||||
|
cx="4.854"
|
||||||
|
cy="4.854"
|
||||||
|
rx="4.854"
|
||||||
|
ry="4.854"
|
||||||
|
transform="translate(32.915 26.848) rotate(-90)" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="Ellipse_4"
|
||||||
|
data-name="Ellipse 4"
|
||||||
|
class="cls-4"
|
||||||
|
transform="translate(390.903 640.17)">
|
||||||
|
<ellipse
|
||||||
|
class="cls-5"
|
||||||
|
cx="6.752"
|
||||||
|
cy="6.752"
|
||||||
|
rx="6.752"
|
||||||
|
ry="6.752"
|
||||||
|
id="ellipse7603" />
|
||||||
|
<ellipse
|
||||||
|
class="cls-6"
|
||||||
|
cx="6.752"
|
||||||
|
cy="6.752"
|
||||||
|
rx="6.627"
|
||||||
|
ry="6.627"
|
||||||
|
id="ellipse7605" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
id="Hole"
|
||||||
|
d="M5606.437,962.413s-.054,1.021-.769,1.029-1.461,0-1.461,0a2.363,2.363,0,0,0-.455,1.691c0,1.266.357,1.6.357,1.6h1.628a.645.645,0,0,1,.7.7V969.1a3.882,3.882,0,0,0,1.766.287,6.459,6.459,0,0,0,1.676-.287v-1.667a.73.73,0,0,1,.734-.7,10.674,10.674,0,0,0,1.444-.14s.4-.374.434-1.632-.353-1.644-.353-1.644h-1.693a.641.641,0,0,1-.762-.678,11.41,11.41,0,0,1,0-1.643,4.815,4.815,0,0,0-3.246,0C5606.42,961.694,5606.437,962.413,5606.437,962.413Z"
|
||||||
|
transform="translate(-5210.486 -318.186)" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 6.0 KiB |
347
legoresources/SVGassets/Touch sensor.svg
Normal file
@ -0,0 +1,347 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns: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"
|
||||||
|
viewBox="1827.391 6183.664 36.101 36.101003"
|
||||||
|
version="1.1"
|
||||||
|
id="svg4572"
|
||||||
|
sodipodi:docname="Touch sensor.svg"
|
||||||
|
width="36.101002"
|
||||||
|
height="36.101002"
|
||||||
|
inkscape:version="0.92.1 r15371"
|
||||||
|
inkscape:export-filename="C:\gh\pxt-ev3\libs\core\jres\icons\touchSensor-icon.png"
|
||||||
|
inkscape:export-xdpi="319.10471"
|
||||||
|
inkscape:export-ydpi="319.10471">
|
||||||
|
<metadata
|
||||||
|
id="metadata4576">
|
||||||
|
<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>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1600"
|
||||||
|
inkscape:window-height="837"
|
||||||
|
id="namedview4574"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="7.0722208"
|
||||||
|
inkscape:cx="18.050501"
|
||||||
|
inkscape:cy="16.684999"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg4572" />
|
||||||
|
<defs
|
||||||
|
id="defs4547">
|
||||||
|
<style
|
||||||
|
id="style4522">
|
||||||
|
.cls-1 {
|
||||||
|
fill: #a8a9a8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-2 {
|
||||||
|
clip-path: url(#clip-path);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-3 {
|
||||||
|
fill: url(#linear-gradient);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-4 {
|
||||||
|
fill: url(#linear-gradient-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-5 {
|
||||||
|
fill: #b72b1c;
|
||||||
|
stroke: #8b1104;
|
||||||
|
stroke-width: 0.25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-6 {
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-7 {
|
||||||
|
fill: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-8 {
|
||||||
|
filter: url(#Path_1);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<clipPath
|
||||||
|
id="clip-path">
|
||||||
|
<path
|
||||||
|
id="Union_3"
|
||||||
|
data-name="Union 3"
|
||||||
|
class="cls-1"
|
||||||
|
d="m 3.944,33.37 c -1.069,0 -1.972,-0.6 -1.972,-1.365 v -4.4 H 1 a 1,1 0 0 1 -1,-1 V 7.371 a 1,1 0 0 1 1,-1 H 1.972 V 1.365 C 1.972,0.6 2.875,0 3.944,0 h 10.769 v 1.365 h 6.371 V 0 h 11.073 c 1.069,0 1.972,0.6 1.972,1.365 V 6.371 H 35.1 a 1,1 0 0 1 1,1 v 19.236 a 1,1 0 0 1 -1,1 H 34.128 V 32 c 0,0.761 -0.9,1.365 -1.972,1.365 z"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#a8a9a8" />
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient
|
||||||
|
id="linear-gradient"
|
||||||
|
x1="16.378942"
|
||||||
|
y1="29.809677"
|
||||||
|
x2="16.378942"
|
||||||
|
y2="34.264748"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="scale(0.98165674,1.018686)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#a8a9a8"
|
||||||
|
id="stop4526" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#545554"
|
||||||
|
id="stop4528" />
|
||||||
|
</linearGradient>
|
||||||
|
<filter
|
||||||
|
id="Path_1"
|
||||||
|
x="1826.363"
|
||||||
|
y="6180.6641"
|
||||||
|
width="38.157001"
|
||||||
|
height="39.370998"
|
||||||
|
filterUnits="userSpaceOnUse">
|
||||||
|
<feOffset
|
||||||
|
input="SourceAlpha"
|
||||||
|
id="feOffset4531" />
|
||||||
|
<feGaussianBlur
|
||||||
|
stdDeviation="1"
|
||||||
|
result="blur"
|
||||||
|
id="feGaussianBlur4533" />
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0.502"
|
||||||
|
id="feFlood4535" />
|
||||||
|
<feComposite
|
||||||
|
operator="in"
|
||||||
|
in2="blur"
|
||||||
|
id="feComposite4537"
|
||||||
|
result="result1" />
|
||||||
|
<feComposite
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="result1"
|
||||||
|
id="feComposite4539" />
|
||||||
|
</filter>
|
||||||
|
<linearGradient
|
||||||
|
id="linear-gradient-2"
|
||||||
|
x1="0.949"
|
||||||
|
y1="0.5"
|
||||||
|
x2="0.056000002"
|
||||||
|
y2="0.5"
|
||||||
|
gradientUnits="objectBoundingBox">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#b72b1c"
|
||||||
|
id="stop4542" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#8b1104"
|
||||||
|
id="stop4544" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linear-gradient-2"
|
||||||
|
id="linearGradient5121"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="7.315846"
|
||||||
|
y1="3.8545027"
|
||||||
|
x2="0.43170431"
|
||||||
|
y2="3.8545027"
|
||||||
|
gradientTransform="scale(1.2395892,0.80671886)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linear-gradient-2"
|
||||||
|
id="linearGradient5123"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="7.315846"
|
||||||
|
y1="3.8545027"
|
||||||
|
x2="0.43170431"
|
||||||
|
y2="3.8545027"
|
||||||
|
gradientTransform="scale(1.2395892,0.80671886)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linear-gradient-2"
|
||||||
|
id="linearGradient5125"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="7.315846"
|
||||||
|
y1="3.8545027"
|
||||||
|
x2="0.43170431"
|
||||||
|
y2="3.8545027"
|
||||||
|
gradientTransform="scale(1.2395892,0.80671886)" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linear-gradient-2"
|
||||||
|
id="linearGradient5127"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="7.315846"
|
||||||
|
y1="3.8545027"
|
||||||
|
x2="0.43170431"
|
||||||
|
y2="3.8545027"
|
||||||
|
gradientTransform="scale(1.2395892,0.80671886)" />
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="Touch_sensor"
|
||||||
|
data-name="Touch sensor"
|
||||||
|
transform="translate(1346,5555.3655)">
|
||||||
|
<g
|
||||||
|
id="Group_8"
|
||||||
|
data-name="Group 8"
|
||||||
|
transform="translate(481.391,629.664)">
|
||||||
|
<g
|
||||||
|
id="Mask_Group_3"
|
||||||
|
data-name="Mask Group 3"
|
||||||
|
class="cls-2"
|
||||||
|
clip-path="url(#clip-path)">
|
||||||
|
<g
|
||||||
|
id="Group_2"
|
||||||
|
data-name="Group 2">
|
||||||
|
<path
|
||||||
|
id="Path_27"
|
||||||
|
data-name="Path 27"
|
||||||
|
class="cls-1"
|
||||||
|
d="M 0.758,0 H 35.342 A 0.758,0.758 0 0 1 36.1,0.758 v 19.719 a 0.758,0.758 0 0 1 -0.758,0.758 H 0.758 A 0.758,0.758 0 0 1 0,20.477 V 0.758 A 0.758,0.758 0 0 1 0.758,0 Z"
|
||||||
|
transform="translate(0,6.371)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#a8a9a8" />
|
||||||
|
<g
|
||||||
|
class="cls-8"
|
||||||
|
transform="translate(-1827.39,-6183.66)"
|
||||||
|
id="g4551"
|
||||||
|
style="filter:url(#Path_1)">
|
||||||
|
<path
|
||||||
|
id="Path_1-2"
|
||||||
|
data-name="Path 1"
|
||||||
|
class="cls-3"
|
||||||
|
d="m 1.972,0 h 10.77 v 1.365 h 6.371 V 0 h 11.072 c 1.069,0 1.972,0.6 1.972,1.365 v 30.64 c 0,0.761 -0.9,1.365 -1.972,1.365 H 1.972 C 0.9,33.371 0,32.766 0,32.005 V 1.365 C 0,0.6 0.9,0 1.972,0 Z"
|
||||||
|
transform="translate(1829.36,6183.66)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:url(#linear-gradient)" />
|
||||||
|
</g>
|
||||||
|
<rect
|
||||||
|
id="Rectangle_2"
|
||||||
|
data-name="Rectangle 2"
|
||||||
|
width="0.75800002"
|
||||||
|
height="6.0669999"
|
||||||
|
transform="translate(34.584,9.404)"
|
||||||
|
x="0"
|
||||||
|
y="0" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_5"
|
||||||
|
data-name="Rectangle 5"
|
||||||
|
width="0.75800002"
|
||||||
|
height="6.0669999"
|
||||||
|
transform="translate(0.91,9.404)"
|
||||||
|
x="0"
|
||||||
|
y="0" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_3"
|
||||||
|
data-name="Rectangle 3"
|
||||||
|
width="0.75800002"
|
||||||
|
height="6.0669999"
|
||||||
|
transform="translate(34.584,18.05)"
|
||||||
|
x="0"
|
||||||
|
y="0" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_4"
|
||||||
|
data-name="Rectangle 4"
|
||||||
|
width="0.75800002"
|
||||||
|
height="6.0669999"
|
||||||
|
transform="translate(0.91,18.05)"
|
||||||
|
x="0"
|
||||||
|
y="0" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="Group_5"
|
||||||
|
data-name="Group 5"
|
||||||
|
transform="translate(485.942,633.835)">
|
||||||
|
<rect
|
||||||
|
id="Rectangle_6"
|
||||||
|
data-name="Rectangle 6"
|
||||||
|
class="cls-4"
|
||||||
|
width="9.5559998"
|
||||||
|
height="6.2189999"
|
||||||
|
transform="translate(0,10.542)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:url(#linearGradient5121)" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_9"
|
||||||
|
data-name="Rectangle 9"
|
||||||
|
class="cls-4"
|
||||||
|
width="9.5559998"
|
||||||
|
height="6.2189999"
|
||||||
|
transform="rotate(90,8.3045,8.3045)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:url(#linearGradient5123)" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_7"
|
||||||
|
data-name="Rectangle 7"
|
||||||
|
class="cls-4"
|
||||||
|
width="9.5559998"
|
||||||
|
height="6.2189999"
|
||||||
|
transform="rotate(180,13.5,8.3805)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:url(#linearGradient5125)" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_8"
|
||||||
|
data-name="Rectangle 8"
|
||||||
|
class="cls-4"
|
||||||
|
width="9.5559998"
|
||||||
|
height="6.2189999"
|
||||||
|
transform="rotate(-90,18.695,8.305)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:url(#linearGradient5127)" />
|
||||||
|
<g
|
||||||
|
id="Ellipse_1"
|
||||||
|
data-name="Ellipse 1"
|
||||||
|
class="cls-5"
|
||||||
|
transform="translate(7.433,7.508)"
|
||||||
|
style="fill:#b72b1c;stroke:#8b1104;stroke-width:0.25px">
|
||||||
|
<circle
|
||||||
|
class="cls-6"
|
||||||
|
cx="6.0669999"
|
||||||
|
cy="6.0669999"
|
||||||
|
id="ellipse4564"
|
||||||
|
r="6.0669999"
|
||||||
|
style="stroke:none" />
|
||||||
|
<circle
|
||||||
|
class="cls-7"
|
||||||
|
cx="6.0669999"
|
||||||
|
cy="6.0669999"
|
||||||
|
id="ellipse4566"
|
||||||
|
r="5.9419999"
|
||||||
|
style="fill:none" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
id="Hole"
|
||||||
|
d="m 5606.165,962.241 c 0,0 -0.048,0.917 -0.69,0.925 -0.642,0.008 -1.312,0 -1.312,0 a 2.123,2.123 0 0 0 -0.409,1.52 c 0,1.138 0.321,1.442 0.321,1.442 h 1.463 a 0.58,0.58 0 0 1 0.628,0.628 v 1.5 a 3.487,3.487 0 0 0 1.586,0.258 5.8,5.8 0 0 0 1.507,-0.258 v -1.5 a 0.655,0.655 0 0 1 0.66,-0.628 9.594,9.594 0 0 0 1.3,-0.126 c 0,0 0.356,-0.336 0.39,-1.467 0.034,-1.131 -0.317,-1.477 -0.317,-1.477 h -1.522 a 0.576,0.576 0 0 1 -0.685,-0.609 10.168,10.168 0 0 1 0,-1.476 4.326,4.326 0 0 0 -2.917,0 c -0.019,0.627 0,1.268 0,1.268 z"
|
||||||
|
transform="translate(-5594.196,-951.087)"
|
||||||
|
inkscape:connector-curvature="0" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 10 KiB |
138
legoresources/SVGassets/brickbuttons.svg
Normal file
@ -0,0 +1,138 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="256.68237mm"
|
||||||
|
height="256.68237mm"
|
||||||
|
viewBox="0 0 256.68237 256.68237"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8853"
|
||||||
|
inkscape:version="0.92.1 r15371"
|
||||||
|
sodipodi:docname="brickbuttons.svg"
|
||||||
|
inkscape:export-filename="C:\gh\pxt-ev3\libs\core\jres\icons\brickButtons-icon.png"
|
||||||
|
inkscape:export-xdpi="11.874598"
|
||||||
|
inkscape:export-ydpi="11.874598">
|
||||||
|
<defs
|
||||||
|
id="defs8847">
|
||||||
|
<linearGradient
|
||||||
|
id="linear-gradient-4"
|
||||||
|
x1="28.287067"
|
||||||
|
y1="53.631462"
|
||||||
|
x2="28.287067"
|
||||||
|
y2="3.3378232"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(4.5371664,0,0,3.3819467,4.7045157,7.0563355)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#6a6a6a"
|
||||||
|
id="stop8176" />
|
||||||
|
<stop
|
||||||
|
offset="0.522"
|
||||||
|
stop-color="#8ce300"
|
||||||
|
id="stop8178" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#6a6a6a"
|
||||||
|
id="stop8180" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="0.35"
|
||||||
|
inkscape:cx="-82.030812"
|
||||||
|
inkscape:cy="187.27864"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0"
|
||||||
|
inkscape:window-width="1600"
|
||||||
|
inkscape:window-height="837"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1" />
|
||||||
|
<metadata
|
||||||
|
id="metadata8850">
|
||||||
|
<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>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(-4.695057,58.29823)">
|
||||||
|
<g
|
||||||
|
id="g9431"
|
||||||
|
transform="translate(3.9780427e-6,-32.677281)">
|
||||||
|
<path
|
||||||
|
style="fill:#6a6a6a;stroke-width:3.91719985"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
d="M 106.30882,198.38022 C 84.431262,177.26258 50.453467,142.52878 50.453467,142.52878 v -7.12931 H 37.087971 a 32.381533,32.381533 0 1 1 0,-64.763062 H 50.457376 V 63.503186 L 105.71341,7.0563355 h 55.25994 c 25.02699,25.5048885 55.25994,55.2599395 55.25994,55.2599395 v 8.320133 h 12.77398 a 32.381533,32.381533 0 0 1 0,64.763062 h -12.77398 v 7.13323 c -29.43384,30.27603 -54.66454,55.85144 -54.66454,55.85144 z"
|
||||||
|
class="cls-7"
|
||||||
|
data-name="Union 4"
|
||||||
|
id="Union_4" />
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:url(#linear-gradient-4);stroke-width:3.91719985"
|
||||||
|
d="M 106.30882,198.38022 C 84.431262,177.26258 50.453467,142.52878 50.453467,142.52878 v -7.12931 H 37.087971 a 32.381533,32.381533 0 1 1 0,-64.763062 H 50.457376 V 63.503186 L 105.71731,7.0563355 h 55.25604 c 25.02699,25.5048885 55.25994,55.2599395 55.25994,55.2599395 v 8.320133 h 12.77398 a 32.381533,32.381533 0 0 1 0,64.763062 h -12.77398 v 7.13323 c -29.43384,30.27603 -54.66454,55.85144 -54.66454,55.85144 z"
|
||||||
|
class="cls-8"
|
||||||
|
id="light" />
|
||||||
|
<path
|
||||||
|
style="fill:#a8a9a8;stroke-width:3.91719985"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
d="m 36.492567,78.357208 h 40.69971 V 126.48393 H 36.492567 A 24.063359,24.063359 0 0 1 12.429199,102.42057 v 0 A 24.063359,24.063359 0 0 1 36.492567,78.357208 Z"
|
||||||
|
class="cls-9"
|
||||||
|
data-name="Rectangle 23"
|
||||||
|
id="Rectangle_23" />
|
||||||
|
<path
|
||||||
|
style="fill:#a8a9a8;stroke-width:3.91719985"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
d="M 229.00727,126.48784 H 188.30756 V 78.361126 h 40.69971 a 24.063359,24.063359 0 0 1 24.06335,24.063354 v 0 a 24.063359,24.063359 0 0 1 -24.06335,24.06336 z"
|
||||||
|
class="cls-9"
|
||||||
|
data-name="Rectangle 24"
|
||||||
|
id="Rectangle_24" />
|
||||||
|
<path
|
||||||
|
style="fill:#3c3c3c;stroke-width:3.91719985"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
d="m 109.27806,78.357208 h 46.9398 a 1.782326,1.782326 0 0 1 1.78233,1.782326 V 124.7016 a 1.782326,1.782326 0 0 1 -1.78233,1.78233 h -46.9398 a 1.782326,1.782326 0 0 1 -1.78233,-1.78233 V 80.139534 a 1.782326,1.782326 0 0 1 1.78233,-1.782326 z"
|
||||||
|
class="cls-4"
|
||||||
|
data-name="Path 42"
|
||||||
|
id="Path_42" />
|
||||||
|
<path
|
||||||
|
style="fill:#a8a9a8;stroke-width:3.91719985"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
d="m 108.09114,15.967966 49.90905,-0.59542 37.43276,38.619675 -15.44943,15.449437 V 97.367379 H 165.7249 V 81.306861 A 11.978797,11.978797 0 0 0 153.84012,69.422075 c -11.59883,-0.184102 -43.37516,0 -43.37516,0 A 9.6676495,9.6676495 0 0 0 100.36251,79.520618 V 97.347793 H 86.103905 V 69.422075 L 70.654464,53.97264 Z"
|
||||||
|
class="cls-9"
|
||||||
|
data-name="Path 15"
|
||||||
|
id="Path_15" />
|
||||||
|
<path
|
||||||
|
style="fill:#a8a9a8;stroke-width:3.91719985"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
d="M 157.78865,189.01028 108.18908,189.38233 70.654464,150.794 86.323259,135.4895 v -28.08625 h 14.101921 v 16.11144 a 12.006218,12.006218 0 0 0 11.85346,11.9788 c 11.59882,0.1841 43.13227,0 43.13227,0 a 10.18472,10.18472 0 0 0 10.38059,-10.38058 v -17.70966 h 14.39179 v 28.08632 l 15.3045,15.3045 z"
|
||||||
|
class="cls-9"
|
||||||
|
data-name="Path 16"
|
||||||
|
id="Path_16-2" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 5.8 KiB |
BIN
legoresources/SVGassets/color overview/LEGO-MakeCode-Colors.pdf
Normal file
308
legoresources/SVGassets/gyro.svg
Normal file
@ -0,0 +1,308 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns: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"
|
||||||
|
viewBox="2030.391 6170.607 60.976999 60.977"
|
||||||
|
version="1.1"
|
||||||
|
id="svg5788"
|
||||||
|
sodipodi:docname="gyro.svg"
|
||||||
|
width="60.977001"
|
||||||
|
height="60.977001"
|
||||||
|
inkscape:export-filename="C:\gh\pxt-ev3\libs\core\jres\icons\gyroSensor-icon.png"
|
||||||
|
inkscape:export-xdpi="188.92369"
|
||||||
|
inkscape:export-ydpi="188.92369"
|
||||||
|
inkscape:version="0.92.1 r15371">
|
||||||
|
<metadata
|
||||||
|
id="metadata5792">
|
||||||
|
<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>
|
||||||
|
<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="namedview5790"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="3.8703117"
|
||||||
|
inkscape:cx="17.974501"
|
||||||
|
inkscape:cy="30.488501"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg5788" />
|
||||||
|
<defs
|
||||||
|
id="defs5764">
|
||||||
|
<style
|
||||||
|
id="style5739">
|
||||||
|
.cls-1 {
|
||||||
|
fill: #a8a9a8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-2 {
|
||||||
|
clip-path: url(#clip-path);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-3, .cls-9 {
|
||||||
|
fill: #9a9a9a;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-4 {
|
||||||
|
fill: #f2f2f2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-5 {
|
||||||
|
opacity: 0.6;
|
||||||
|
fill: url(#linear-gradient);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-6 {
|
||||||
|
fill: url(#linear-gradient-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-7 {
|
||||||
|
fill: #b72b1c;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-8, .cls-9 {
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-10 {
|
||||||
|
filter: url(#Path_12);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<clipPath
|
||||||
|
id="clip-path">
|
||||||
|
<path
|
||||||
|
id="Union_7"
|
||||||
|
data-name="Union 7"
|
||||||
|
class="cls-1"
|
||||||
|
d="M 9.708,60.977 A 9.336,9.336 0 0 1 7.725,60.522 H 3.489 A 1.972,1.972 0 0 1 1.517,58.55 V 54 H 0.758 A 0.758,0.758 0 0 1 0,53.241 V 6.978 A 0.758,0.758 0 0 1 0.758,6.219 H 1.517 V 1.972 A 1.972,1.972 0 0 1 3.489,0 h 12.654 v 0.607 h 3.42 V 0 h 12.746 a 1.972,1.972 0 0 1 1.972,1.972 v 4.247 h 0.91 a 0.759,0.759 0 0 1 0.759,0.759 v 46.263 a 0.758,0.758 0 0 1 -0.759,0.758 h -0.91 v 4.551 a 1.972,1.972 0 0 1 -1.972,1.972 h -4.141 c -0.17,0.3 -1.911,0.455 -2.229,0.455 z"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#a8a9a8" />
|
||||||
|
</clipPath>
|
||||||
|
<filter
|
||||||
|
id="Path_12"
|
||||||
|
x="2030.408"
|
||||||
|
y="6169.1069"
|
||||||
|
width="35.764"
|
||||||
|
height="50.779999"
|
||||||
|
filterUnits="userSpaceOnUse">
|
||||||
|
<feOffset
|
||||||
|
input="SourceAlpha"
|
||||||
|
id="feOffset5743" />
|
||||||
|
<feGaussianBlur
|
||||||
|
stdDeviation="0.5"
|
||||||
|
result="blur"
|
||||||
|
id="feGaussianBlur5745" />
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0.502"
|
||||||
|
id="feFlood5747" />
|
||||||
|
<feComposite
|
||||||
|
operator="in"
|
||||||
|
in2="blur"
|
||||||
|
id="feComposite5749"
|
||||||
|
result="result1" />
|
||||||
|
<feComposite
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="result1"
|
||||||
|
id="feComposite5751" />
|
||||||
|
</filter>
|
||||||
|
<linearGradient
|
||||||
|
id="linear-gradient"
|
||||||
|
x1="6.4034481"
|
||||||
|
x2="6.4034481"
|
||||||
|
y2="12.806896"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="scale(2.5583092,0.39088316)"
|
||||||
|
y1="0">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#fff"
|
||||||
|
stop-opacity="0"
|
||||||
|
id="stop5754" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#404040"
|
||||||
|
id="stop5756" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linear-gradient-2"
|
||||||
|
x1="0.5"
|
||||||
|
x2="0.5"
|
||||||
|
y2="1"
|
||||||
|
gradientUnits="objectBoundingBox">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#fff"
|
||||||
|
id="stop5759" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="gray"
|
||||||
|
id="stop5761" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linear-gradient-2"
|
||||||
|
id="linearGradient6337"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="-0.54480195"
|
||||||
|
x2="-0.54480195"
|
||||||
|
y2="6.8587804"
|
||||||
|
gradientTransform="scale(3.1897429,0.31350489)"
|
||||||
|
y1="0.39872125" />
|
||||||
|
<linearGradient
|
||||||
|
inkscape:collect="always"
|
||||||
|
xlink:href="#linear-gradient-2"
|
||||||
|
id="linearGradient6339"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
x1="-0.57290149"
|
||||||
|
x2="-0.57290149"
|
||||||
|
y2="6.9009762"
|
||||||
|
gradientTransform="scale(3.0330478,0.32970136)"
|
||||||
|
y1="3.2110665e-006" />
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="gyro"
|
||||||
|
transform="translate(1358.514,5554.0004)">
|
||||||
|
<g
|
||||||
|
id="Group_16"
|
||||||
|
data-name="Group 16"
|
||||||
|
transform="translate(684.391,616.607)">
|
||||||
|
<g
|
||||||
|
id="Mask_Group_7"
|
||||||
|
data-name="Mask Group 7"
|
||||||
|
class="cls-2"
|
||||||
|
clip-path="url(#clip-path)">
|
||||||
|
<g
|
||||||
|
id="Group_9"
|
||||||
|
data-name="Group 9">
|
||||||
|
<path
|
||||||
|
id="Path_29"
|
||||||
|
data-name="Path 29"
|
||||||
|
class="cls-1"
|
||||||
|
d="m 0.758,0 h 34.433 a 0.758,0.758 0 0 1 0.758,0.758 V 47.022 A 0.758,0.758 0 0 1 35.191,47.78 H 0.758 A 0.758,0.758 0 0 1 0,47.022 V 0.758 A 0.758,0.758 0 0 1 0.758,0 Z"
|
||||||
|
transform="translate(0,6.219)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#a8a9a8" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_11"
|
||||||
|
data-name="Rectangle 11"
|
||||||
|
class="cls-3"
|
||||||
|
width="5.7639999"
|
||||||
|
height="15.775"
|
||||||
|
transform="translate(15.017,0.607)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9a9a9a" />
|
||||||
|
<g
|
||||||
|
class="cls-10"
|
||||||
|
transform="translate(-2030.39,-6170.61)"
|
||||||
|
id="g5769"
|
||||||
|
style="filter:url(#Path_12)">
|
||||||
|
<path
|
||||||
|
id="Path_12-2"
|
||||||
|
data-name="Path 12"
|
||||||
|
class="cls-1"
|
||||||
|
d="m 1.972,0 h 12.655 v 16.015 l 3.42,-0.251 V 0 h 12.745 a 1.972,1.972 0 0 1 1.972,1.972 v 43.837 a 1.972,1.972 0 0 1 -1.972,1.972 H 1.972 A 1.972,1.972 0 0 1 0,45.809 V 1.972 A 1.972,1.972 0 0 1 1.972,0 Z"
|
||||||
|
transform="translate(2031.91,6170.61)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#a8a9a8" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="hvid"
|
||||||
|
transform="translate(1.517,29.578)">
|
||||||
|
<g
|
||||||
|
id="hvid-2"
|
||||||
|
data-name="hvid">
|
||||||
|
<path
|
||||||
|
id="Path_57"
|
||||||
|
data-name="Path 57"
|
||||||
|
class="cls-4"
|
||||||
|
d="M 1.213,0 H 31.55 a 1.213,1.213 0 0 1 1.213,1.213 v 27.759 a 1.972,1.972 0 0 1 -1.972,1.972 H 1.972 A 1.972,1.972 0 0 1 0,28.972 V 1.213 A 1.213,1.213 0 0 1 1.213,0 Z"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#f2f2f2" />
|
||||||
|
<path
|
||||||
|
id="Path_59"
|
||||||
|
data-name="Path 59"
|
||||||
|
class="cls-5"
|
||||||
|
d="M 0,0 H 32.764 V 3.034 A 1.972,1.972 0 0 1 30.792,5.006 H 1.972 A 1.972,1.972 0 0 1 0,3.034 Z"
|
||||||
|
transform="translate(0,25.938)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="opacity:0.6;fill:url(#linear-gradient)" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="Path_1"
|
||||||
|
data-name="Path 1"
|
||||||
|
class="cls-6"
|
||||||
|
transform="translate(17.936,29.123)"
|
||||||
|
style="fill:url(#linearGradient6339)">
|
||||||
|
<path
|
||||||
|
class="cls-8"
|
||||||
|
d="M 6.4848423,2.1502612 H -9.7453671 c -0.1358308,0 -0.6785509,-0.09074 -1.2538699,-0.2385202 -0.648927,-0.1666809 -0.94169,-0.3052633 -1.041505,-0.3812874 l 1.249305,-1.03739253 c 0.303109,-0.25294002 0.75468,-0.36806001 1.0460699,-0.36806001 H 6.4848423 c 0.2201104,0 0.3956304,0.15657998 0.5988703,0.33788 0.052504,0.0468377 0.106761,0.0952419 0.1628327,0.14147469 L 8.5651855,1.7936107 C 8.487011,1.8440639 8.2630816,1.9419193 7.6369224,2.0377111 7.1470423,2.1126511 6.6342626,2.1502612 6.4848423,2.1502612 Z"
|
||||||
|
id="path5774"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:url(#linearGradient6337);stroke:none" />
|
||||||
|
<path
|
||||||
|
class="cls-9"
|
||||||
|
d="m 6.4848423,2.0252612 c 0.3687601,0 1.4223461,-0.1225882 1.8561678,-0.2655033 L 7.1648941,0.69904226 C 7.1077342,0.65182292 7.0532455,0.6032095 7.0005026,0.55616105 6.8163424,0.39188105 6.6573024,0.25000107 6.4848423,0.25000107 H -9.7453671 c -0.2695699,0 -0.6867699,0.10602999 -0.9662209,0.33921999 l -1.113573,0.92468484 c 0.473236,0.2207455 1.776214,0.5113553 2.0797939,0.5113553 H 6.4848423 m 0,0.25 H -9.7453671 c -0.3350909,0 -2.4577609,-0.4373601 -2.4577609,-0.7724501 l 1.33183,-1.10592004 c 0.31863,-0.26589 0.79084,-0.396890001307 1.1259309,-0.396890001307 H 6.4848423 c 0.3350902,0 0.5700002,0.284719991307 0.8433003,0.509620021307 L 8.7278528,1.771991 c 0,0.3350902 -1.9079203,0.5032702 -2.2430105,0.5032702 z"
|
||||||
|
id="path5776"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#9a9a9a;stroke:none" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="red_things"
|
||||||
|
data-name="red things"
|
||||||
|
transform="translate(4.551,8.494)">
|
||||||
|
<circle
|
||||||
|
id="red_dot"
|
||||||
|
data-name="red dot"
|
||||||
|
class="cls-7"
|
||||||
|
cx="3.0339999"
|
||||||
|
cy="3.0339999"
|
||||||
|
transform="translate(10.315,5.916)"
|
||||||
|
r="3.0339999"
|
||||||
|
style="fill:#b72b1c" />
|
||||||
|
<path
|
||||||
|
id="red_arrow_1"
|
||||||
|
data-name="red arrow 1"
|
||||||
|
class="cls-7"
|
||||||
|
d="m 3122.963,-1932.135 c 0,0 -3.9,-5.13 -0.759,-10.77 0.232,0.143 0.682,0.347 0.91,0.455 0.645,0.367 0.74,-0.309 0.607,-0.758 -0.3,-0.948 -1.214,-3.792 -1.214,-3.792 l -3.792,1.062 a 1.446,1.446 0 0 0 -0.455,0.152 c -0.2,0.125 -0.369,0.4 0,0.607 l 1.062,0.607 c 0,0 -4.526,6.652 1.062,14.258 1.598,-1.14 2.579,-1.821 2.579,-1.821 z"
|
||||||
|
transform="translate(-3117.592,1947)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#b72b1c" />
|
||||||
|
<path
|
||||||
|
id="red_arrow_2"
|
||||||
|
data-name="red arrow 2"
|
||||||
|
class="cls-7"
|
||||||
|
d="m 3118.4,-1932.135 c 0,0 3.9,-5.13 0.758,-10.77 -0.231,0.143 -0.681,0.347 -0.91,0.455 -0.645,0.367 -0.741,-0.309 -0.607,-0.758 0.3,-0.948 1.213,-3.792 1.213,-3.792 l 3.792,1.062 a 1.446,1.446 0 0 1 0.455,0.152 c 0.2,0.125 0.368,0.4 0,0.607 l -1.062,0.607 c 0,0 4.526,6.652 -1.062,14.258 -1.594,-1.14 -2.577,-1.821 -2.577,-1.821 z"
|
||||||
|
transform="translate(-3097.107,1947)"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:#b72b1c" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 11 KiB |
89
legoresources/SVGassets/icn_port.svg
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
viewBox="1447.52 6142.536 58.928002 58.928"
|
||||||
|
version="1.1"
|
||||||
|
id="svg6348"
|
||||||
|
sodipodi:docname="icn_port.svg"
|
||||||
|
width="58.928001"
|
||||||
|
height="58.928001"
|
||||||
|
inkscape:export-filename="C:\gh\pxt-ev3\libs\core\jres\icons\portB.png"
|
||||||
|
inkscape:export-xdpi="156.39424"
|
||||||
|
inkscape:export-ydpi="156.39424"
|
||||||
|
inkscape:version="0.92.1 r15371">
|
||||||
|
<metadata
|
||||||
|
id="metadata6352">
|
||||||
|
<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>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1600"
|
||||||
|
inkscape:window-height="837"
|
||||||
|
id="namedview6350"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="4.0048872"
|
||||||
|
inkscape:cx="24.98"
|
||||||
|
inkscape:cy="29.464001"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg6348" />
|
||||||
|
<defs
|
||||||
|
id="defs6343">
|
||||||
|
<style
|
||||||
|
id="style6341">
|
||||||
|
.cls-1 {
|
||||||
|
fill: #eaeaea;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-2 {
|
||||||
|
fill: #a8a9a8;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<path
|
||||||
|
style="fill:#eaeaea;stroke-width:1.08854139"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
d="m 1447.5095,6142.536 h 59.1987 v 58.928 h -59.1987 z"
|
||||||
|
class="cls-1"
|
||||||
|
data-name="Path 8"
|
||||||
|
id="Path_8" />
|
||||||
|
<path
|
||||||
|
style="fill:#a8a9a8"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
d="M 1457.257,6189.022 V 6161.2 h 17.114 v -6.912 h 4.716 v -9.159 h 12.923 v 8.814 h 5.064 v 35.08 h -8.033 v 7.43 h -2.62 v -7.51 h -1.985 v 7.507 h -2.206 v -7.507 h -2.16 v 7.507 h -2.1 v -7.507 h -1.852 v 7.507 h -2.1 v -7.507 h -1.819 v 7.507 h -2.464 v -7.507 h -1.678 v 7.507 h -2.518 v -7.457 z"
|
||||||
|
class="cls-2"
|
||||||
|
data-name="Path 9"
|
||||||
|
id="Path_9" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:40px;line-height:1.25;font-family:consolas;-inkscape-font-specification:consolas;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none"
|
||||||
|
x="1475.2291"
|
||||||
|
y="6185.2339"
|
||||||
|
id="text10060"><tspan
|
||||||
|
sodipodi:role="line"
|
||||||
|
id="tspan10058"
|
||||||
|
x="1475.2291"
|
||||||
|
y="6185.2339">B</tspan></text>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.9 KiB |
166
legoresources/SVGassets/screen.svg
Normal file
@ -0,0 +1,166 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="26.48797mm"
|
||||||
|
height="26.48797mm"
|
||||||
|
viewBox="0 0 26.48797 26.487971"
|
||||||
|
version="1.1"
|
||||||
|
id="svg9467"
|
||||||
|
inkscape:version="0.92.1 r15371"
|
||||||
|
sodipodi:docname="screen.svg">
|
||||||
|
<defs
|
||||||
|
id="defs9461">
|
||||||
|
<linearGradient
|
||||||
|
id="linear-gradient-5"
|
||||||
|
x1="2.1718912"
|
||||||
|
y1="1.576793"
|
||||||
|
x2="2.1718912"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.18480341,0,0,0.37880435,268.75789,80.522339)"
|
||||||
|
y2="0">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#747474"
|
||||||
|
id="stop8183" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="#3c3c3c"
|
||||||
|
id="stop8185" />
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient
|
||||||
|
id="linear-gradient-2"
|
||||||
|
x1="44.516197"
|
||||||
|
y1="82.265938"
|
||||||
|
x2="44.516197"
|
||||||
|
y2="84.402718"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(0.2975093,0,0,0.23530135,255.87506,61.218339)">
|
||||||
|
<stop
|
||||||
|
offset="0"
|
||||||
|
stop-color="#a8a9a8"
|
||||||
|
id="stop8166" />
|
||||||
|
<stop
|
||||||
|
offset="1"
|
||||||
|
stop-color="gray"
|
||||||
|
id="stop8168" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="2.8"
|
||||||
|
inkscape:cx="1.3096574"
|
||||||
|
inkscape:cy="-1.004129"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
showgrid="false"
|
||||||
|
fit-margin-top="0"
|
||||||
|
fit-margin-left="0"
|
||||||
|
fit-margin-right="0"
|
||||||
|
fit-margin-bottom="0"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1137"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1" />
|
||||||
|
<metadata
|
||||||
|
id="metadata9464">
|
||||||
|
<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>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(-255.87506,-58.769882)">
|
||||||
|
<g
|
||||||
|
id="g10052"
|
||||||
|
transform="translate(1.7608642e-7,-1.2242278)"
|
||||||
|
inkscape:export-xdpi="96"
|
||||||
|
inkscape:export-ydpi="96">
|
||||||
|
<path
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
style="fill:url(#linear-gradient-2);stroke-width:0.26458332"
|
||||||
|
d="m 256.39682,61.218339 h 25.44445 a 0.52175833,0.52175833 0 0 1 0.52176,0.521759 v 19.905926 a 0.52175833,0.52175833 0 0 1 -0.52176,0.521759 h -25.44445 a 0.52175833,0.52175833 0 0 1 -0.52176,-0.521759 V 61.740098 a 0.52175833,0.52175833 0 0 1 0.52176,-0.521759 z"
|
||||||
|
class="cls-3"
|
||||||
|
data-name="Path 18"
|
||||||
|
id="Path_18" />
|
||||||
|
<path
|
||||||
|
style="fill:#3c3c3c;stroke-width:0.26458332"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
d="m 259.28634,63.987468 h 19.70537 a 1.0033,1.0033 0 0 1 1.0033,1.0033 v 11.076781 a 1.0033,1.0033 0 0 1 -1.0033,1.0033 h -19.70537 a 1.0033,1.0033 0 0 1 -1.0033,-1.0033 V 64.990768 a 1.0033,1.0033 0 0 1 1.0033,-1.0033 z"
|
||||||
|
class="cls-4"
|
||||||
|
data-name="Path 17"
|
||||||
|
id="Path_17" />
|
||||||
|
<path
|
||||||
|
style="fill:#a0b5a6;stroke-width:0.26458332"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
d="m 260.8114,64.509227 h 16.73569 a 0.7223125,0.7223125 0 0 1 0.72231,0.722312 v 10.675408 a 0.7223125,0.7223125 0 0 1 -0.72231,0.722313 H 260.8114 a 0.7223125,0.7223125 0 0 1 -0.72232,-0.722313 V 65.231539 a 0.7223125,0.7223125 0 0 1 0.72232,-0.722312 z"
|
||||||
|
class="cls-5"
|
||||||
|
data-name="Path 16"
|
||||||
|
id="Path_16" />
|
||||||
|
<rect
|
||||||
|
style="fill:#3c3c3c;stroke-width:0.26458332"
|
||||||
|
y="77.030579"
|
||||||
|
x="268.7579"
|
||||||
|
height="3.6520438"
|
||||||
|
width="0.80274582"
|
||||||
|
class="cls-4"
|
||||||
|
data-name="Rectangle 26"
|
||||||
|
id="Rectangle_26" />
|
||||||
|
<rect
|
||||||
|
style="fill:#9a9a9a;stroke-width:0.26458332"
|
||||||
|
y="80.522354"
|
||||||
|
x="268.7579"
|
||||||
|
height="1.6052271"
|
||||||
|
width="0.80274582"
|
||||||
|
class="cls-10"
|
||||||
|
data-name="Rectangle 10"
|
||||||
|
id="Rectangle_10" />
|
||||||
|
<rect
|
||||||
|
y="80.522354"
|
||||||
|
x="268.7579"
|
||||||
|
style="fill:url(#linear-gradient-5);stroke-width:0.26458332"
|
||||||
|
height="1.6454437"
|
||||||
|
width="0.80274582"
|
||||||
|
class="cls-11"
|
||||||
|
data-name="Rectangle 12"
|
||||||
|
id="Rectangle_12" />
|
||||||
|
<rect
|
||||||
|
style="fill:#808080;stroke-width:0.26458332"
|
||||||
|
y="82.167732"
|
||||||
|
x="268.7579"
|
||||||
|
height="1.565275"
|
||||||
|
width="0.80274582"
|
||||||
|
class="cls-12"
|
||||||
|
data-name="Rectangle 11"
|
||||||
|
id="Rectangle_11" />
|
||||||
|
<path
|
||||||
|
style="fill:#a8a9a8;stroke-width:0.26458332"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
d="m 257.9621,82.167783 h 6.26083 v 1.511829 c -0.69268,0.697971 -1.58115,1.578239 -1.58115,1.578239 h -4.15792 a 0.52175833,0.52175833 0 0 1 -0.52176,-0.521493 z"
|
||||||
|
class="cls-9"
|
||||||
|
data-name="Path 15"
|
||||||
|
id="Path_15-2" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 5.4 KiB |
12
legoresources/SVGassets/trash.svg
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="-2186 6829.289 63 68.355">
|
||||||
|
<defs>
|
||||||
|
<style>
|
||||||
|
.cls-1 {
|
||||||
|
fill: #fff;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</defs>
|
||||||
|
<g id="trash" transform="translate(49 672)">
|
||||||
|
<path id="Subtraction_2" data-name="Subtraction 2" class="cls-1" d="M-.5-603.645H-34a9.01,9.01,0,0,1-9-9v-42h-4a2,2,0,0,1-2-2v-2a2,2,0,0,1,2-2h12.82l3.919-7.542a5.256,5.256,0,0,1,1.332-1.9,7.7,7.7,0,0,1,5.481-1.9H-10.78s.083-.005.226-.005a8.02,8.02,0,0,1,2.9.565,5.812,5.812,0,0,1,3.3,3.249c1.682,4.051,3.219,7.508,3.235,7.542H12a2,2,0,0,1,2,2v2a2,2,0,0,1-2,2H8.5v42A9.01,9.01,0,0,1-.5-603.645Zm-7-46a1.5,1.5,0,0,0-1.5,1.5v32a1.5,1.5,0,0,0,1.5,1.5h3a1.5,1.5,0,0,0,1.5-1.5v-32a1.5,1.5,0,0,0-1.5-1.5Zm-11.5,0a1.5,1.5,0,0,0-1.5,1.5v32a1.5,1.5,0,0,0,1.5,1.5h3a1.5,1.5,0,0,0,1.5-1.5v-32a1.5,1.5,0,0,0-1.5-1.5Zm-11.5,0a1.5,1.5,0,0,0-1.5,1.5v32a1.5,1.5,0,0,0,1.5,1.5h3a1.5,1.5,0,0,0,1.5-1.5v-32a1.5,1.5,0,0,0-1.5-1.5Zm5.845-16.571-3.245,5.571H-7.517l-2.437-5.571Z" transform="translate(-2186 6829.29)"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.0 KiB |
535
legoresources/SVGassets/ultra sonic.svg
Normal file
@ -0,0 +1,535 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
viewBox="2330.575 6196.231 83.275 83.274999"
|
||||||
|
version="1.1"
|
||||||
|
id="svg5190"
|
||||||
|
sodipodi:docname="ultra sonic.svg"
|
||||||
|
width="83.275002"
|
||||||
|
height="83.275002"
|
||||||
|
inkscape:version="0.92.1 r15371"
|
||||||
|
inkscape:export-filename="C:\gh\pxt-ev3\libs\core\jres\icons\ultrasonicSensor-icon.png"
|
||||||
|
inkscape:export-xdpi="138.33684"
|
||||||
|
inkscape:export-ydpi="138.33684">
|
||||||
|
<metadata
|
||||||
|
id="metadata5194">
|
||||||
|
<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>
|
||||||
|
<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="namedview5192"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="3.4103872"
|
||||||
|
inkscape:cx="41.637501"
|
||||||
|
inkscape:cy="17.443501"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg5190" />
|
||||||
|
<defs
|
||||||
|
id="defs5133">
|
||||||
|
<style
|
||||||
|
id="style5129">
|
||||||
|
.cls-1 {
|
||||||
|
fill: #f2f2f2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-2 {
|
||||||
|
fill: #292929;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-3 {
|
||||||
|
stroke: rgba(242,242,242,0.5);
|
||||||
|
stroke-width: 0.25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-4 {
|
||||||
|
fill: #931f1f;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-5 {
|
||||||
|
fill: #9d761f;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-6 {
|
||||||
|
clip-path: url(#clip-path);
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-7 {
|
||||||
|
stroke: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cls-8 {
|
||||||
|
fill: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<clipPath
|
||||||
|
id="clip-path">
|
||||||
|
<circle
|
||||||
|
id="guld"
|
||||||
|
class="cls-1"
|
||||||
|
cx="6.9770002"
|
||||||
|
cy="6.9770002"
|
||||||
|
r="6.9770002"
|
||||||
|
style="fill:#f2f2f2" />
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="ultra_sonic"
|
||||||
|
data-name="ultra sonic"
|
||||||
|
transform="translate(1222,5578.1935)">
|
||||||
|
<rect
|
||||||
|
id="Rectangle_1"
|
||||||
|
data-name="Rectangle 1"
|
||||||
|
class="cls-2"
|
||||||
|
width="43.382"
|
||||||
|
height="31.247"
|
||||||
|
transform="translate(1131.024,643.596)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#292929" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_2"
|
||||||
|
data-name="Rectangle 2"
|
||||||
|
width="25.330999"
|
||||||
|
height="17.594999"
|
||||||
|
transform="translate(1138.609,650.573)"
|
||||||
|
x="0"
|
||||||
|
y="0" />
|
||||||
|
<g
|
||||||
|
id="eye1"
|
||||||
|
transform="translate(1108.575,642.231)">
|
||||||
|
<g
|
||||||
|
id="sort"
|
||||||
|
class="cls-3"
|
||||||
|
style="stroke-width:0.25px">
|
||||||
|
<circle
|
||||||
|
class="cls-7"
|
||||||
|
cx="17.444"
|
||||||
|
cy="17.444"
|
||||||
|
id="ellipse5137"
|
||||||
|
r="17.444"
|
||||||
|
style="stroke:none" />
|
||||||
|
<circle
|
||||||
|
class="cls-8"
|
||||||
|
cx="17.444"
|
||||||
|
cy="17.444"
|
||||||
|
id="ellipse5139"
|
||||||
|
r="17.319"
|
||||||
|
style="fill:none" />
|
||||||
|
</g>
|
||||||
|
<circle
|
||||||
|
id="rød"
|
||||||
|
class="cls-4"
|
||||||
|
cx="10.77"
|
||||||
|
cy="10.77"
|
||||||
|
transform="translate(6.674,6.674)"
|
||||||
|
r="10.77"
|
||||||
|
style="fill:#931f1f" />
|
||||||
|
<circle
|
||||||
|
id="guld-3"
|
||||||
|
data-name="guld"
|
||||||
|
class="cls-5"
|
||||||
|
cx="8.0389996"
|
||||||
|
cy="8.0389996"
|
||||||
|
transform="translate(9.404,9.404)"
|
||||||
|
r="8.0389996"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<circle
|
||||||
|
id="guld-4"
|
||||||
|
data-name="guld"
|
||||||
|
class="cls-1"
|
||||||
|
cx="6.9770002"
|
||||||
|
cy="6.9770002"
|
||||||
|
transform="translate(10.466,10.466)"
|
||||||
|
r="6.9770002"
|
||||||
|
style="fill:#f2f2f2" />
|
||||||
|
<g
|
||||||
|
id="Group_5"
|
||||||
|
data-name="Group 5"
|
||||||
|
transform="translate(10.466,10.466)">
|
||||||
|
<g
|
||||||
|
id="Mask_Group_8"
|
||||||
|
data-name="Mask Group 8"
|
||||||
|
class="cls-6"
|
||||||
|
clip-path="url(#clip-path)">
|
||||||
|
<g
|
||||||
|
id="Group_17"
|
||||||
|
data-name="Group 17"
|
||||||
|
transform="rotate(-30,2.4159415,14.94335)">
|
||||||
|
<rect
|
||||||
|
id="Rectangle_84"
|
||||||
|
data-name="Rectangle 84"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.791"
|
||||||
|
transform="translate(2.048)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_91"
|
||||||
|
data-name="Rectangle 91"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.507"
|
||||||
|
transform="rotate(-90,10.049,10.049)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_85"
|
||||||
|
data-name="Rectangle 85"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.791"
|
||||||
|
transform="translate(4.93)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_97"
|
||||||
|
data-name="Rectangle 97"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.507"
|
||||||
|
transform="rotate(-90,8.608,8.608)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_86"
|
||||||
|
data-name="Rectangle 86"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.791"
|
||||||
|
transform="translate(7.812)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_96"
|
||||||
|
data-name="Rectangle 96"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.507"
|
||||||
|
transform="rotate(-90,7.167,7.167)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_87"
|
||||||
|
data-name="Rectangle 87"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.791"
|
||||||
|
transform="translate(10.694)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_95"
|
||||||
|
data-name="Rectangle 95"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.507"
|
||||||
|
transform="rotate(-90,5.726,5.726)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_88"
|
||||||
|
data-name="Rectangle 88"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.791"
|
||||||
|
transform="translate(13.576)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_94"
|
||||||
|
data-name="Rectangle 94"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.507"
|
||||||
|
transform="rotate(-90,4.285,4.285)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_89"
|
||||||
|
data-name="Rectangle 89"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.791"
|
||||||
|
transform="translate(16.458)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_93"
|
||||||
|
data-name="Rectangle 93"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.507"
|
||||||
|
transform="rotate(-90,2.844,2.844)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_90"
|
||||||
|
data-name="Rectangle 90"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.791"
|
||||||
|
transform="translate(19.34)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_92"
|
||||||
|
data-name="Rectangle 92"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.507"
|
||||||
|
transform="rotate(-90,1.403,1.403)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
id="eye2"
|
||||||
|
transform="translate(1156.962,642.231)">
|
||||||
|
<g
|
||||||
|
id="sort-2"
|
||||||
|
data-name="sort"
|
||||||
|
class="cls-3"
|
||||||
|
style="stroke-width:0.25px">
|
||||||
|
<circle
|
||||||
|
class="cls-7"
|
||||||
|
cx="17.444"
|
||||||
|
cy="17.444"
|
||||||
|
id="ellipse5163"
|
||||||
|
r="17.444"
|
||||||
|
style="stroke:none" />
|
||||||
|
<circle
|
||||||
|
class="cls-8"
|
||||||
|
cx="17.444"
|
||||||
|
cy="17.444"
|
||||||
|
id="ellipse5165"
|
||||||
|
r="17.319"
|
||||||
|
style="fill:none" />
|
||||||
|
</g>
|
||||||
|
<circle
|
||||||
|
id="rød-2"
|
||||||
|
data-name="rød"
|
||||||
|
class="cls-4"
|
||||||
|
cx="10.77"
|
||||||
|
cy="10.77"
|
||||||
|
transform="translate(6.674,6.674)"
|
||||||
|
r="10.77"
|
||||||
|
style="fill:#931f1f" />
|
||||||
|
<circle
|
||||||
|
id="guld-5"
|
||||||
|
data-name="guld"
|
||||||
|
class="cls-5"
|
||||||
|
cx="8.0389996"
|
||||||
|
cy="8.0389996"
|
||||||
|
transform="translate(9.404,9.404)"
|
||||||
|
r="8.0389996"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<circle
|
||||||
|
id="guld-6"
|
||||||
|
data-name="guld"
|
||||||
|
class="cls-1"
|
||||||
|
cx="6.9770002"
|
||||||
|
cy="6.9770002"
|
||||||
|
transform="translate(10.466,10.466)"
|
||||||
|
r="6.9770002"
|
||||||
|
style="fill:#f2f2f2" />
|
||||||
|
<g
|
||||||
|
id="Group_18"
|
||||||
|
data-name="Group 18"
|
||||||
|
transform="translate(10.466,10.466)">
|
||||||
|
<g
|
||||||
|
id="Mask_Group_8-2"
|
||||||
|
data-name="Mask Group 8"
|
||||||
|
class="cls-6"
|
||||||
|
clip-path="url(#clip-path)">
|
||||||
|
<g
|
||||||
|
id="Group_17-2"
|
||||||
|
data-name="Group 17"
|
||||||
|
transform="rotate(-30,2.4159415,14.94335)">
|
||||||
|
<rect
|
||||||
|
id="Rectangle_84-2"
|
||||||
|
data-name="Rectangle 84"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.791"
|
||||||
|
transform="translate(2.048)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_91-2"
|
||||||
|
data-name="Rectangle 91"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.507"
|
||||||
|
transform="rotate(-90,10.049,10.049)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_85-2"
|
||||||
|
data-name="Rectangle 85"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.791"
|
||||||
|
transform="translate(4.93)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_97-2"
|
||||||
|
data-name="Rectangle 97"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.507"
|
||||||
|
transform="rotate(-90,8.608,8.608)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_86-2"
|
||||||
|
data-name="Rectangle 86"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.791"
|
||||||
|
transform="translate(7.812)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_96-2"
|
||||||
|
data-name="Rectangle 96"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.507"
|
||||||
|
transform="rotate(-90,7.167,7.167)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_87-2"
|
||||||
|
data-name="Rectangle 87"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.791"
|
||||||
|
transform="translate(10.694)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_95-2"
|
||||||
|
data-name="Rectangle 95"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.507"
|
||||||
|
transform="rotate(-90,5.726,5.726)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_88-2"
|
||||||
|
data-name="Rectangle 88"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.791"
|
||||||
|
transform="translate(13.576)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_94-2"
|
||||||
|
data-name="Rectangle 94"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.507"
|
||||||
|
transform="rotate(-90,4.285,4.285)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_89-2"
|
||||||
|
data-name="Rectangle 89"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.791"
|
||||||
|
transform="translate(16.458)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_93-2"
|
||||||
|
data-name="Rectangle 93"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.507"
|
||||||
|
transform="rotate(-90,2.844,2.844)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_90-2"
|
||||||
|
data-name="Rectangle 90"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.791"
|
||||||
|
transform="translate(19.34)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
<rect
|
||||||
|
id="Rectangle_92-2"
|
||||||
|
data-name="Rectangle 92"
|
||||||
|
class="cls-5"
|
||||||
|
width="0.60699999"
|
||||||
|
height="22.507"
|
||||||
|
transform="rotate(-90,1.403,1.403)"
|
||||||
|
x="0"
|
||||||
|
y="0"
|
||||||
|
style="fill:#9d761f" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 15 KiB |
@ -31,6 +31,22 @@
|
|||||||
"Array.splice|param|deleteCount": "The number of elements to remove. eg: 0",
|
"Array.splice|param|deleteCount": "The number of elements to remove. eg: 0",
|
||||||
"Array.splice|param|start": "The zero-based location in the array from which to start removing elements. eg: 0",
|
"Array.splice|param|start": "The zero-based location in the array from which to start removing elements. eg: 0",
|
||||||
"Array.unshift": "Add one element to the beginning of an array and return the new length of the array.",
|
"Array.unshift": "Add one element to the beginning of an array and return the new length of the array.",
|
||||||
|
"Boolean.toString": "Returns a string representation of an object.",
|
||||||
|
"Buffer.fill": "Fill (a fragment) of the buffer with given value.",
|
||||||
|
"Buffer.getNumber": "Read a number in specified format from the buffer.",
|
||||||
|
"Buffer.length": "Returns the length of a Buffer object.",
|
||||||
|
"Buffer.rotate": "Rotate buffer left in place.\n\n\n\nstart. eg: -1",
|
||||||
|
"Buffer.rotate|param|length": "number of elements in buffer. If negative, length is set as the buffer length minus",
|
||||||
|
"Buffer.rotate|param|offset": "number of bytes to shift; use negative value to shift right",
|
||||||
|
"Buffer.rotate|param|start": "start offset in buffer. Default is 0.",
|
||||||
|
"Buffer.setNumber": "Write a number in specified format in the buffer.",
|
||||||
|
"Buffer.shift": "Shift buffer left in place, with zero padding.\n\n\n\nstart. eg: -1",
|
||||||
|
"Buffer.shift|param|length": "number of elements in buffer. If negative, length is set as the buffer length minus",
|
||||||
|
"Buffer.shift|param|offset": "number of bytes to shift; use negative value to shift right",
|
||||||
|
"Buffer.shift|param|start": "start offset in buffer. Default is 0.",
|
||||||
|
"Buffer.slice": "Return a copy of a fragment of a buffer.",
|
||||||
|
"Buffer.toHex": "Convert a buffer to its hexadecimal representation.",
|
||||||
|
"Buffer.write": "Write contents of `src` at `dstOffset` in current buffer.",
|
||||||
"Math": "More complex operations with numbers.",
|
"Math": "More complex operations with numbers.",
|
||||||
"Math.abs": "Returns the absolute value of a number (the value without regard to whether it is positive or negative).\nFor example, the absolute value of -5 is the same as the absolute value of 5.",
|
"Math.abs": "Returns the absolute value of a number (the value without regard to whether it is positive or negative).\nFor example, the absolute value of -5 is the same as the absolute value of 5.",
|
||||||
"Math.abs|param|x": "A numeric expression for which the absolute value is needed.",
|
"Math.abs|param|x": "A numeric expression for which the absolute value is needed.",
|
||||||
@ -91,6 +107,7 @@
|
|||||||
"Math.tan|param|x": "An angle in radians",
|
"Math.tan|param|x": "An angle in radians",
|
||||||
"Math.trunc": "Returns the number with the decimal part truncated.",
|
"Math.trunc": "Returns the number with the decimal part truncated.",
|
||||||
"Math.trunc|param|x": "A numeric expression.",
|
"Math.trunc|param|x": "A numeric expression.",
|
||||||
|
"Number.toString": "Returns a string representation of a number.",
|
||||||
"String": "Combine, split, and search text strings.\n\nCombine, split, and search text strings.",
|
"String": "Combine, split, and search text strings.\n\nCombine, split, and search text strings.",
|
||||||
"String.charAt": "Return the character at the specified index.",
|
"String.charAt": "Return the character at the specified index.",
|
||||||
"String.charAt|param|index": "The zero-based index of the desired character.",
|
"String.charAt|param|index": "The zero-based index of the desired character.",
|
||||||
@ -107,6 +124,8 @@
|
|||||||
"String.substr|param|length": "number of characters to extract",
|
"String.substr|param|length": "number of characters to extract",
|
||||||
"String.substr|param|start": "first character index; can be negative from counting from the end, eg:0",
|
"String.substr|param|start": "first character index; can be negative from counting from the end, eg:0",
|
||||||
"control": "Program controls and events.",
|
"control": "Program controls and events.",
|
||||||
|
"control.AnimationQueue.cancel": "Cancels the current running animation and clears the queue",
|
||||||
|
"control.AnimationQueue.runUntilDone": "Runs 'render' in a loop until it returns false or the 'stop' function is called",
|
||||||
"control.assert": "Display an error code and stop the program when the assertion is `false`.",
|
"control.assert": "Display an error code and stop the program when the assertion is `false`.",
|
||||||
"control.deviceSerialNumber": "Derive a unique, consistent serial number of this device from internal data.",
|
"control.deviceSerialNumber": "Derive a unique, consistent serial number of this device from internal data.",
|
||||||
"control.millis": "Gets the number of milliseconds elapsed since power on.",
|
"control.millis": "Gets the number of milliseconds elapsed since power on.",
|
||||||
@ -119,15 +138,25 @@
|
|||||||
"control.waitForEvent": "Blocks the calling thread until the specified event is raised.",
|
"control.waitForEvent": "Blocks the calling thread until the specified event is raised.",
|
||||||
"control.waitMicros": "Block the current fiber for the given microseconds",
|
"control.waitMicros": "Block the current fiber for the given microseconds",
|
||||||
"control.waitMicros|param|micros": "number of micro-seconds to wait. eg: 4",
|
"control.waitMicros|param|micros": "number of micro-seconds to wait. eg: 4",
|
||||||
|
"hex": "Tagged hex literal converter",
|
||||||
"loops.forever": "Repeats the code forever in the background. On each iteration, allows other codes to run.",
|
"loops.forever": "Repeats the code forever in the background. On each iteration, allows other codes to run.",
|
||||||
"loops.pause": "Pause for the specified time in milliseconds",
|
"loops.pause": "Pause for the specified time in milliseconds",
|
||||||
"loops.pause|param|ms": "how long to pause for, eg: 100, 200, 500, 1000, 2000",
|
"loops.pause|param|ms": "how long to pause for, eg: 100, 200, 500, 1000, 2000",
|
||||||
|
"loops.timePicker": "Get the time field editor",
|
||||||
|
"loops.timePicker|param|ms": "time duration in milliseconds, eg: 500, 1000",
|
||||||
|
"loops.waitUntil": "Busy wait for a condition to be true",
|
||||||
|
"loops.waitUntil|param|condition": "condition to test for",
|
||||||
|
"loops.waitUntil|param|timeOut": "if positive, maximum duration to wait for in milliseconds",
|
||||||
|
"loops.when": "Runs code when the condition becomes true",
|
||||||
|
"loops.when|param|condition": "condition to test",
|
||||||
|
"loops.when|param|handler": "code to run",
|
||||||
|
"parseInt": "Convert a string to an integer.",
|
||||||
"serial": "Reading and writing data over a serial connection.",
|
"serial": "Reading and writing data over a serial connection.",
|
||||||
"serial.writeBuffer": "Send a buffer across the serial connection.",
|
"serial.writeBuffer": "Send a buffer across the serial connection.",
|
||||||
"serial.writeLine": "Write a line of text to the serial port.",
|
"serial.writeLine": "Write a line of text to the serial port.",
|
||||||
"serial.writeNumber": "Write a number to the serial port.",
|
"serial.writeNumber": "Write a number to the serial port.",
|
||||||
"serial.writeString": "Write some text to the serial port.",
|
"serial.writeString": "Write some text to the serial port.",
|
||||||
"serial.writeValue": "Write a name:value pair as a line of text to the serial port.",
|
"serial.writeValue": "Write a name:value pair as a line of text to the serial port.",
|
||||||
"serial.writeValue|param|name": "name of the value stream, eg: x",
|
"serial.writeValue|param|name": "name of the value stream, eg: \"x\"",
|
||||||
"serial.writeValue|param|value": "to write"
|
"serial.writeValue|param|value": "to write"
|
||||||
}
|
}
|
@ -10,7 +10,7 @@
|
|||||||
"Array.unshift|block": "%list| insert %value| at beginning",
|
"Array.unshift|block": "%list| insert %value| at beginning",
|
||||||
"Array|block": "Array",
|
"Array|block": "Array",
|
||||||
"Math.constrain|block": "constrain %value|between %low|and %high",
|
"Math.constrain|block": "constrain %value|between %low|and %high",
|
||||||
"Math.map|block": "map %value|from %fromLow|%fromHigh|to %toLow|%toHigh",
|
"Math.map|block": "map %value|from low %fromLow|from high %fromHigh|to low %toLow|to high %toHigh",
|
||||||
"Math.randomRange|block": "pick random %min|to %limit",
|
"Math.randomRange|block": "pick random %min|to %limit",
|
||||||
"Math|block": "Math",
|
"Math|block": "Math",
|
||||||
"String.charAt|block": "char from %this=text|at %pos",
|
"String.charAt|block": "char from %this=text|at %pos",
|
||||||
@ -30,8 +30,10 @@
|
|||||||
"control.waitMicros|block": "wait (µs)%micros",
|
"control.waitMicros|block": "wait (µs)%micros",
|
||||||
"control|block": "control",
|
"control|block": "control",
|
||||||
"loops.forever|block": "forever",
|
"loops.forever|block": "forever",
|
||||||
"loops.pause|block": "pause (ms) %pause",
|
"loops.pause|block": "pause %pause=timePicker|ms",
|
||||||
|
"loops.timePicker|block": "%ms",
|
||||||
"loops|block": "loops",
|
"loops|block": "loops",
|
||||||
|
"parseInt|block": "parse to integer %text",
|
||||||
"serial.writeBuffer|block": "serial|write buffer %buffer",
|
"serial.writeBuffer|block": "serial|write buffer %buffer",
|
||||||
"serial.writeLine|block": "serial|write line %text",
|
"serial.writeLine|block": "serial|write line %text",
|
||||||
"serial.writeNumber|block": "serial|write number %value",
|
"serial.writeNumber|block": "serial|write number %value",
|
||||||
@ -40,9 +42,13 @@
|
|||||||
"serial|block": "serial",
|
"serial|block": "serial",
|
||||||
"{id:category}Array": "Array",
|
"{id:category}Array": "Array",
|
||||||
"{id:category}Arrays": "Arrays",
|
"{id:category}Arrays": "Arrays",
|
||||||
|
"{id:category}Boolean": "Boolean",
|
||||||
|
"{id:category}Buffer": "Buffer",
|
||||||
"{id:category}Control": "Control",
|
"{id:category}Control": "Control",
|
||||||
|
"{id:category}Helpers": "Helpers",
|
||||||
"{id:category}Loops": "Loops",
|
"{id:category}Loops": "Loops",
|
||||||
"{id:category}Math": "Math",
|
"{id:category}Math": "Math",
|
||||||
|
"{id:category}Number": "Number",
|
||||||
"{id:category}Serial": "Serial",
|
"{id:category}Serial": "Serial",
|
||||||
"{id:category}String": "String",
|
"{id:category}String": "String",
|
||||||
"{id:category}Text": "Text"
|
"{id:category}Text": "Text"
|
||||||
|
@ -17,7 +17,8 @@
|
|||||||
"control.cpp",
|
"control.cpp",
|
||||||
"control.ts",
|
"control.ts",
|
||||||
"serial.cpp",
|
"serial.cpp",
|
||||||
"serial.ts"
|
"serial.ts",
|
||||||
|
"loops.ts"
|
||||||
],
|
],
|
||||||
"testFiles": [
|
"testFiles": [
|
||||||
"test.ts"
|
"test.ts"
|
||||||
|
14
libs/base/shims.d.ts
vendored
@ -70,7 +70,7 @@ declare namespace loops {
|
|||||||
* Repeats the code forever in the background. On each iteration, allows other codes to run.
|
* Repeats the code forever in the background. On each iteration, allows other codes to run.
|
||||||
* @param body code to execute
|
* @param body code to execute
|
||||||
*/
|
*/
|
||||||
//% help=loops/forever weight=100 blockGap=8
|
//% help=loops/forever weight=100 afterOnStart=true
|
||||||
//% blockId=forever block="forever" blockAllowMultiple=1 shim=loops::forever
|
//% blockId=forever block="forever" blockAllowMultiple=1 shim=loops::forever
|
||||||
function forever(a: () => void): void;
|
function forever(a: () => void): void;
|
||||||
|
|
||||||
@ -79,7 +79,7 @@ declare namespace loops {
|
|||||||
* @param ms how long to pause for, eg: 100, 200, 500, 1000, 2000
|
* @param ms how long to pause for, eg: 100, 200, 500, 1000, 2000
|
||||||
*/
|
*/
|
||||||
//% help=loops/pause weight=99
|
//% help=loops/pause weight=99
|
||||||
//% async block="pause (ms) %pause"
|
//% async block="pause %pause=timePicker|ms"
|
||||||
//% blockId=device_pause shim=loops::pause
|
//% blockId=device_pause shim=loops::pause
|
||||||
function pause(ms: int32): void;
|
function pause(ms: int32): void;
|
||||||
}
|
}
|
||||||
@ -99,8 +99,8 @@ declare namespace control {
|
|||||||
*/
|
*/
|
||||||
//% weight=20 blockGap=8 blockId="control_on_event" block="on event|from %src|with value %value"
|
//% weight=20 blockGap=8 blockId="control_on_event" block="on event|from %src|with value %value"
|
||||||
//% blockExternalInputs=1
|
//% blockExternalInputs=1
|
||||||
//% help="control/on-event" shim=control::onEvent
|
//% help="control/on-event" flags.defl=16 shim=control::onEvent
|
||||||
function onEvent(src: int32, value: int32, handler: () => void): void;
|
function onEvent(src: int32, value: int32, handler: () => void, flags?: int32): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reset the device.
|
* Reset the device.
|
||||||
@ -120,7 +120,7 @@ declare namespace control {
|
|||||||
/**
|
/**
|
||||||
* Run other code in the background.
|
* Run other code in the background.
|
||||||
*/
|
*/
|
||||||
//% help=control/run-in-background blockAllowMultiple=1
|
//% help=control/run-in-background blockAllowMultiple=1 afterOnStart=true
|
||||||
//% blockId="control_run_in_background" block="run in background" blockGap=8 shim=control::runInBackground
|
//% blockId="control_run_in_background" block="run in background" blockGap=8 shim=control::runInBackground
|
||||||
function runInBackground(a: () => void): void;
|
function runInBackground(a: () => void): void;
|
||||||
|
|
||||||
@ -144,14 +144,14 @@ declare namespace serial {
|
|||||||
* Write some text to the serial port.
|
* Write some text to the serial port.
|
||||||
*/
|
*/
|
||||||
//% help=serial/write-string
|
//% help=serial/write-string
|
||||||
//% weight=87
|
//% weight=87 blockHidden=true
|
||||||
//% blockId=serial_writestring block="serial|write string %text" shim=serial::writeString
|
//% blockId=serial_writestring block="serial|write string %text" shim=serial::writeString
|
||||||
function writeString(text: string): void;
|
function writeString(text: string): void;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send a buffer across the serial connection.
|
* Send a buffer across the serial connection.
|
||||||
*/
|
*/
|
||||||
//% help=serial/write-buffer advanced=true weight=6
|
//% help=serial/write-buffer weight=6 blockHidden=true
|
||||||
//% blockId=serial_writebuffer block="serial|write buffer %buffer" shim=serial::writeBuffer
|
//% blockId=serial_writebuffer block="serial|write buffer %buffer" shim=serial::writeBuffer
|
||||||
function writeBuffer(buffer: Buffer): void;
|
function writeBuffer(buffer: Buffer): void;
|
||||||
}
|
}
|
||||||
|
3
libs/color-sensor/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# Color sensor
|
||||||
|
|
||||||
|
The library to interact with the Touch Sensor.
|
12
libs/color-sensor/_locales/color-sensor-jsdoc-strings.json
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"sensors.ColorSensor": "The color sensor is a digital sensor that can detect the color or intensity\nof light that enters the small window on the face of the sensor.",
|
||||||
|
"sensors.ColorSensor.color": "Get the current color from the color sensor.",
|
||||||
|
"sensors.ColorSensor.colorMode": "Gets the current color mode",
|
||||||
|
"sensors.ColorSensor.light": "Measures the ambient or reflected light value from 0 (darkest) to 100 (brightest).",
|
||||||
|
"sensors.ColorSensor.onColorDetected": "Registers code to run when the given color is detected.",
|
||||||
|
"sensors.ColorSensor.onColorDetected|param|color": "the color to detect, eg: ColorSensorColor.Blue",
|
||||||
|
"sensors.ColorSensor.onColorDetected|param|handler": "the code to run when detected",
|
||||||
|
"sensors.ColorSensor.onLightChanged": "Registers code to run when the ambient light changes.",
|
||||||
|
"sensors.ColorSensor.onLightChanged|param|condition": "the light condition",
|
||||||
|
"sensors.ColorSensor.onLightChanged|param|handler": "the code to run when detected"
|
||||||
|
}
|
27
libs/color-sensor/_locales/color-sensor-strings.json
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"ColorSensorColor.Black|block": "black",
|
||||||
|
"ColorSensorColor.Blue|block": "blue",
|
||||||
|
"ColorSensorColor.Brown|block": "brown",
|
||||||
|
"ColorSensorColor.Green|block": "green",
|
||||||
|
"ColorSensorColor.None|block": "none",
|
||||||
|
"ColorSensorColor.Red|block": "red",
|
||||||
|
"ColorSensorColor.White|block": "white",
|
||||||
|
"ColorSensorColor.Yellow|block": "yellow",
|
||||||
|
"ColorSensorMode.AmbientLightIntensity|block": "ambient light intensity",
|
||||||
|
"ColorSensorMode.Color|block": "color",
|
||||||
|
"ColorSensorMode.ReflectedLightIntensity|block": "reflected light intensity",
|
||||||
|
"LightCondition.Dark|block": "dark",
|
||||||
|
"LightIntensityMode.Ambient|block": "ambient light",
|
||||||
|
"LightIntensityMode.Reflected|block": "reflected light",
|
||||||
|
"sensors.ColorSensor.color|block": "`icons.colorSensor` %sensor| color",
|
||||||
|
"sensors.ColorSensor.light|block": "`icons.colorSensor` %sensor|%mode",
|
||||||
|
"sensors.ColorSensor.onColorDetected|block": "on `icons.colorSensor` %sensor|detected color %color",
|
||||||
|
"sensors.ColorSensor.onLightChanged|block": "on `icons.colorSensor` %sensor|%mode|%condition",
|
||||||
|
"sensors.color1|block": "1",
|
||||||
|
"sensors.color2|block": "2",
|
||||||
|
"sensors.color3|block": "3",
|
||||||
|
"sensors.color4|block": "4",
|
||||||
|
"sensors|block": "sensors",
|
||||||
|
"{id:category}Sensors": "Sensors",
|
||||||
|
"{id:group}Color Sensor": "Color Sensor"
|
||||||
|
}
|
193
libs/color-sensor/color.ts
Normal file
@ -0,0 +1,193 @@
|
|||||||
|
const enum ColorSensorMode {
|
||||||
|
None = -1,
|
||||||
|
//% block="reflected light intensity"
|
||||||
|
ReflectedLightIntensity = 0,
|
||||||
|
//% block="ambient light intensity"
|
||||||
|
AmbientLightIntensity = 1,
|
||||||
|
//% block="color"
|
||||||
|
Color = 2,
|
||||||
|
RefRaw = 3,
|
||||||
|
RgbRaw = 4,
|
||||||
|
ColorCal = 5,
|
||||||
|
}
|
||||||
|
|
||||||
|
enum LightIntensityMode {
|
||||||
|
//% block="reflected light"
|
||||||
|
Reflected = ColorSensorMode.ReflectedLightIntensity,
|
||||||
|
//% block="ambient light"
|
||||||
|
Ambient = ColorSensorMode.AmbientLightIntensity
|
||||||
|
}
|
||||||
|
|
||||||
|
const enum ColorSensorColor {
|
||||||
|
//% block="none"
|
||||||
|
None,
|
||||||
|
//% block="black"
|
||||||
|
Black,
|
||||||
|
//% block="blue"
|
||||||
|
Blue,
|
||||||
|
//% block="green"
|
||||||
|
Green,
|
||||||
|
//% block="yellow"
|
||||||
|
Yellow,
|
||||||
|
//% block="red"
|
||||||
|
Red,
|
||||||
|
//% block="white"
|
||||||
|
White,
|
||||||
|
//% block="brown"
|
||||||
|
Brown,
|
||||||
|
}
|
||||||
|
|
||||||
|
enum LightCondition {
|
||||||
|
//% block="dark"
|
||||||
|
Dark = sensors.internal.ThresholdState.Low,
|
||||||
|
//$ block="bright"
|
||||||
|
Bright = sensors.internal.ThresholdState.High
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace sensors {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The color sensor is a digital sensor that can detect the color or intensity
|
||||||
|
* of light that enters the small window on the face of the sensor.
|
||||||
|
*/
|
||||||
|
//% fixedInstances
|
||||||
|
export class ColorSensor extends internal.UartSensor {
|
||||||
|
thresholdDetector: sensors.internal.ThresholdDetector;
|
||||||
|
|
||||||
|
constructor(port: number) {
|
||||||
|
super(port)
|
||||||
|
this.thresholdDetector = new sensors.internal.ThresholdDetector(this.id());
|
||||||
|
}
|
||||||
|
|
||||||
|
_colorEventValue(value: number) {
|
||||||
|
return 0xff00 | value;
|
||||||
|
}
|
||||||
|
|
||||||
|
_deviceType() {
|
||||||
|
return DAL.DEVICE_TYPE_COLOR
|
||||||
|
}
|
||||||
|
|
||||||
|
setMode(m: ColorSensorMode) {
|
||||||
|
this._setMode(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the current color mode
|
||||||
|
*/
|
||||||
|
colorMode() {
|
||||||
|
return <ColorSensorMode>this.mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
_query() {
|
||||||
|
if (this.mode == ColorSensorMode.Color)
|
||||||
|
return this.getNumber(NumberFormat.UInt8LE, 0)
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
_update(prev: number, curr: number) {
|
||||||
|
if (this.mode == ColorSensorMode.Color)
|
||||||
|
control.raiseEvent(this._id, this._colorEventValue(curr));
|
||||||
|
else
|
||||||
|
this.thresholdDetector.setLevel(curr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers code to run when the given color is detected.
|
||||||
|
* @param color the color to detect, eg: ColorSensorColor.Blue
|
||||||
|
* @param handler the code to run when detected
|
||||||
|
*/
|
||||||
|
//% help=sensors/color-sensor/on-color-detected
|
||||||
|
//% block="on `icons.colorSensor` %sensor|detected color %color"
|
||||||
|
//% blockId=colorOnColorDetected
|
||||||
|
//% parts="colorsensor"
|
||||||
|
//% sensor.fieldEditor="imagedropdown"
|
||||||
|
//% sensor.fieldOptions.columns=4
|
||||||
|
//% blockNamespace=sensors
|
||||||
|
//% weight=100 blockGap=8
|
||||||
|
//% group="Color Sensor"
|
||||||
|
onColorDetected(color: ColorSensorColor, handler: () => void) {
|
||||||
|
const v = this._colorEventValue(<number>color);
|
||||||
|
control.onEvent(this._id, v, handler);
|
||||||
|
this.setMode(ColorSensorMode.Color)
|
||||||
|
if (this.color() == color)
|
||||||
|
control.raiseEvent(this._id, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current color from the color sensor.
|
||||||
|
* @param sensor the color sensor to query the request
|
||||||
|
*/
|
||||||
|
//% help=sensors/color-sensor/color
|
||||||
|
//% block="`icons.colorSensor` %sensor| color"
|
||||||
|
//% blockId=colorGetColor
|
||||||
|
//% parts="colorsensor"
|
||||||
|
//% sensor.fieldEditor="imagedropdown"
|
||||||
|
//% sensor.fieldOptions.columns=4
|
||||||
|
//% blockNamespace=sensors
|
||||||
|
//% weight=99
|
||||||
|
//% group="Color Sensor"
|
||||||
|
color(): ColorSensorColor {
|
||||||
|
this.setMode(ColorSensorMode.Color)
|
||||||
|
return this.getNumber(NumberFormat.UInt8LE, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers code to run when the ambient light changes.
|
||||||
|
* @param condition the light condition
|
||||||
|
* @param handler the code to run when detected
|
||||||
|
*/
|
||||||
|
//% help=sensors/color-sensor/on-light-changed
|
||||||
|
//% block="on `icons.colorSensor` %sensor|%mode|%condition"
|
||||||
|
//% blockId=colorOnLightChanged
|
||||||
|
//% parts="colorsensor"
|
||||||
|
//% sensor.fieldEditor="imagedropdown"
|
||||||
|
//% sensor.fieldOptions.columns=4
|
||||||
|
//% blockNamespace=sensors
|
||||||
|
//% weight=89 blockGap=8
|
||||||
|
//% group="Color Sensor"
|
||||||
|
onLightChanged(mode: LightIntensityMode, condition: LightCondition, handler: () => void) {
|
||||||
|
control.onEvent(this._id, <number>condition, handler);
|
||||||
|
this.setMode(<ColorSensorMode><number>mode)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Measures the ambient or reflected light value from 0 (darkest) to 100 (brightest).
|
||||||
|
* @param sensor the color sensor port
|
||||||
|
*/
|
||||||
|
//% help=sensors/color-sensor/light
|
||||||
|
//% block="`icons.colorSensor` %sensor|%mode"
|
||||||
|
//% blockId=colorLight
|
||||||
|
//% parts="colorsensor"
|
||||||
|
//% sensor.fieldEditor="imagedropdown"
|
||||||
|
//% sensor.fieldOptions.columns=4
|
||||||
|
//% blockNamespace=sensors
|
||||||
|
//% weight=88
|
||||||
|
//% group="Color Sensor"
|
||||||
|
light(mode: LightIntensityMode) {
|
||||||
|
this.setMode(<ColorSensorMode><number>mode)
|
||||||
|
return this.getNumber(NumberFormat.UInt8LE, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
//%
|
||||||
|
ambientLight() {
|
||||||
|
return this.light(LightIntensityMode.Ambient);
|
||||||
|
}
|
||||||
|
|
||||||
|
//%
|
||||||
|
reflectedLight() {
|
||||||
|
return this.light(LightIntensityMode.Reflected);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//% whenUsed block="1" weight=95 fixedInstance jres=icons.port1
|
||||||
|
export const color1: ColorSensor = new ColorSensor(1)
|
||||||
|
|
||||||
|
//% whenUsed block="3" weight=90 fixedInstance jres=icons.port3
|
||||||
|
export const color3: ColorSensor = new ColorSensor(3)
|
||||||
|
|
||||||
|
//% whenUsed block="2" weight=90 fixedInstance jres=icons.port2
|
||||||
|
export const color2: ColorSensor = new ColorSensor(2)
|
||||||
|
|
||||||
|
//% whenUsed block="4" weight=90 fixedInstance jres=icons.port4
|
||||||
|
export const color4: ColorSensor = new ColorSensor(4)
|
||||||
|
}
|
16
libs/color-sensor/docs/reference/sensors/color-sensor.md
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# Color Sensor
|
||||||
|
|
||||||
|
```cards
|
||||||
|
sensors.color1.onColorDetected(ColorSensorColor.Blue, function () {
|
||||||
|
})
|
||||||
|
sensors.color1.color();
|
||||||
|
sensors.color1.ambientLight();
|
||||||
|
sensors.color1.reflectedLight();
|
||||||
|
```
|
||||||
|
|
||||||
|
## See Also
|
||||||
|
|
||||||
|
[on color detected](/reference/sensors/color-sensor/on-color-detected),
|
||||||
|
[color](/reference/sensors/color-sensor/color),
|
||||||
|
[ambient light](/reference/sensors/color-sensor/ambient-light),
|
||||||
|
[reflected light](/reference/sensors/color-sensor/reflected-light),
|
@ -0,0 +1,11 @@
|
|||||||
|
# Ambient Light
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
loops.forever(function () {
|
||||||
|
if (sensors.color1.ambientLight() > 20) {
|
||||||
|
brick.setStatusLight(LightsPattern.Green)
|
||||||
|
} else {
|
||||||
|
brick.setStatusLight(LightsPattern.Orange)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
@ -0,0 +1,11 @@
|
|||||||
|
# color
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
loops.forever(function () {
|
||||||
|
if (sensors.color1.color() == ColorSensorColor.Green) {
|
||||||
|
brick.setStatusLight(LightsPattern.Green)
|
||||||
|
} else {
|
||||||
|
brick.setStatusLight(LightsPattern.Orange)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
@ -0,0 +1,16 @@
|
|||||||
|
# On Color Detected
|
||||||
|
|
||||||
|
```sig
|
||||||
|
sensors.color1.onColorDetected(ColorSensorColor.Blue, function () { })
|
||||||
|
```
|
||||||
|
|
||||||
|
# Parameters
|
||||||
|
|
||||||
|
## Examples
|
||||||
|
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
sensors.color1.onColorDetected(ColorSensorColor.Blue, function () {
|
||||||
|
brick.showImage(images.expressionsSick)
|
||||||
|
})
|
||||||
|
```
|
@ -0,0 +1,11 @@
|
|||||||
|
# Reflected Light
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
loops.forever(function () {
|
||||||
|
if (sensors.color1.reflectedLight() > 20) {
|
||||||
|
brick.setStatusLight(LightsPattern.Green)
|
||||||
|
} else {
|
||||||
|
brick.setStatusLight(LightsPattern.Orange)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
15
libs/color-sensor/pxt.json
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"name": "color-sensor",
|
||||||
|
"description": "Color Sensor support",
|
||||||
|
"files": [
|
||||||
|
"README.md",
|
||||||
|
"color.ts"
|
||||||
|
],
|
||||||
|
"testFiles": [
|
||||||
|
"test.ts"
|
||||||
|
],
|
||||||
|
"public": true,
|
||||||
|
"dependencies": {
|
||||||
|
"core": "file:../core"
|
||||||
|
}
|
||||||
|
}
|
0
libs/color-sensor/test.ts
Normal file
@ -20,7 +20,7 @@ DEPS = $(PXT_HEADERS) package.json Makefile Makefile.inc
|
|||||||
all: $(EXE)
|
all: $(EXE)
|
||||||
|
|
||||||
$(EXE): $(PXT_OBJS)
|
$(EXE): $(PXT_OBJS)
|
||||||
$(LD) -o $(EXE) $(LDFLAGS) -Wl,-Map,$(EXE:.elf=.map) $(PXT_OBJS) $(LIBSTDCPP) -lm -lpthread $(NPM_LIBS)
|
$(LD) -o $(EXE) $(LDFLAGS) -Wl,-Map,$(EXE:.elf=.map) $(PXT_OBJS) $(LIBSTDCPP) -lm -lpthread -lz $(NPM_LIBS)
|
||||||
cp $(EXE) $(EXE:.elf=.full)
|
cp $(EXE) $(EXE:.elf=.full)
|
||||||
$(PREF)strip $(EXE)
|
$(PREF)strip $(EXE)
|
||||||
node -p 'require("fs").readFileSync("$(EXE)").toString("hex")' > $(HEX)
|
node -p 'require("fs").readFileSync("$(EXE)").toString("hex")' > $(HEX)
|
||||||
|
@ -1,4 +1,47 @@
|
|||||||
{
|
{
|
||||||
|
"ButtonEvent": "User interaction on buttons",
|
||||||
|
"Draw": "Drawing modes",
|
||||||
|
"Image.buffer": "Returns the underlaying Buffer object.",
|
||||||
|
"Image.doubled": "Double size of an image.",
|
||||||
|
"Image.draw": "Draw an image on the screen.",
|
||||||
|
"Image.height": "Returns the height of an image.",
|
||||||
|
"Image.width": "Returns the width of an image.",
|
||||||
|
"LightsPattern": "Patterns for lights under the buttons.",
|
||||||
|
"MMap.getNumber": "Read a number in specified format from the buffer.",
|
||||||
|
"MMap.ioctl": "Perform ioctl(2) on the underlaying file",
|
||||||
|
"MMap.length": "Returns the length of a Buffer object.",
|
||||||
|
"MMap.read": "Perform read(2) on the underlaying file",
|
||||||
|
"MMap.setNumber": "Write a number in specified format in the buffer.",
|
||||||
|
"MMap.slice": "Read a range of bytes into a buffer.",
|
||||||
|
"MMap.write": "Perform write(2) on the underlaying file",
|
||||||
|
"brick.Button": "Generic button class, for device buttons and sensors.",
|
||||||
|
"brick.Button.isPressed": "Check if button is currently pressed or not.",
|
||||||
|
"brick.Button.onEvent": "Do something when a button or sensor is clicked, up or down.",
|
||||||
|
"brick.Button.onEvent|param|body": "code to run when the event is raised",
|
||||||
|
"brick.Button.waitUntil": "Waits until the event is raised",
|
||||||
|
"brick.Button.waitUntil|param|ev": "the event to wait for",
|
||||||
|
"brick.Button.wasPressed": "See if the button was pressed again since the last time you checked.",
|
||||||
|
"brick._imagePicker": "An image",
|
||||||
|
"brick._imagePicker|param|image": "the image",
|
||||||
|
"brick.buttonDown": "Down button on the EV3 Brick.",
|
||||||
|
"brick.buttonEnter": "Enter button on the EV3 Brick.",
|
||||||
|
"brick.buttonLeft": "Left button on the EV3 Brick.",
|
||||||
|
"brick.buttonRight": "Right button on the EV3 Brick.",
|
||||||
|
"brick.buttonUp": "Up button on the EV3 Brick.",
|
||||||
|
"brick.lightPattern": "Pattern block.",
|
||||||
|
"brick.lightPattern|param|pattern": "the lights pattern to use. eg: LightsPattern.Green",
|
||||||
|
"brick.print": "Show text on the screen.",
|
||||||
|
"brick.print|param|text": "the text to print on the screen, eg: \"Hello world\"",
|
||||||
|
"brick.print|param|x": "the starting position's x coordinate, eg: 0",
|
||||||
|
"brick.print|param|y": "the starting position's x coordinate, eg: 0",
|
||||||
|
"brick.setPixel": "Sets a pixel on or off",
|
||||||
|
"brick.setPixel|param|on": "a value indicating if the pixel should be on or off",
|
||||||
|
"brick.setPixel|param|x": "the starting position's x coordinate, eg: 0",
|
||||||
|
"brick.setPixel|param|y": "the starting position's x coordinate, eg: 0",
|
||||||
|
"brick.setStatusLight": "Set lights.",
|
||||||
|
"brick.setStatusLight|param|pattern": "the lights pattern to use.",
|
||||||
|
"brick.showImage": "Shows an image on screen",
|
||||||
|
"brick.showImage|param|image": "image to draw",
|
||||||
"control": "Program controls and events.",
|
"control": "Program controls and events.",
|
||||||
"control.allocateNotifyEvent": "Allocates the next user notification event",
|
"control.allocateNotifyEvent": "Allocates the next user notification event",
|
||||||
"control.deviceFirmwareVersion": "Determine the version of system software currently running.",
|
"control.deviceFirmwareVersion": "Determine the version of system software currently running.",
|
||||||
@ -7,47 +50,26 @@
|
|||||||
"control.raiseEvent": "Announce that an event happened to registered handlers.",
|
"control.raiseEvent": "Announce that an event happened to registered handlers.",
|
||||||
"control.raiseEvent|param|src": "ID of the Component that generated the event",
|
"control.raiseEvent|param|src": "ID of the Component that generated the event",
|
||||||
"control.raiseEvent|param|value": "Component specific code indicating the cause of the event.",
|
"control.raiseEvent|param|value": "Component specific code indicating the cause of the event.",
|
||||||
"input": "Respond to and read data from buttons and sensors.",
|
"motors.Motor.clearCount": "Clears the motor count",
|
||||||
"input.Button": "Generic button class, for device buttons and sensors.",
|
"motors.Motor.count": "Gets motor step count.",
|
||||||
"input.buttonDown": "Down button.",
|
"motors.Motor.move": "Moves the motor by a number of degrees",
|
||||||
"input.buttonEnter": "Enter button.",
|
"motors.Motor.move|param|angle": "the degrees to rotate, eg: 360",
|
||||||
"input.buttonLeft": "Left button.",
|
"motors.Motor.move|param|power": "the power from ``100`` full forward to ``-100`` full backward, eg: 50",
|
||||||
"input.buttonRight": "Right button.",
|
"motors.Motor.power": "Sets the motor power level from ``-100`` to ``100``.",
|
||||||
"input.buttonUp": "Up button.",
|
"motors.Motor.power|param|power": "the power from ``100`` full forward to ``-100`` full backward, eg: 50",
|
||||||
"input.remoteBottomLeft": "Remote bottom-left button.",
|
"motors.Motor.reset": "Resets the motor.",
|
||||||
"input.remoteBottomRight": "Remote bottom-right button.",
|
"motors.Motor.setBrake": "Sets the automatic brake on or off when the motor is off",
|
||||||
"input.remoteCenter": "Remote beacon (center) button.",
|
"motors.Motor.setBrake|param|brake": "a value indicating if the motor should break when off",
|
||||||
"input.remoteTopLeft": "Remote top-left button.",
|
"motors.Motor.setReversed": "Reverses the motor polarity",
|
||||||
"input.remoteTopRight": "Remote top-right button.",
|
"motors.Motor.speed": "Gets motor actual speed.",
|
||||||
|
"motors.Motor.stop": "Stops the motor",
|
||||||
|
"motors.Motor.tachoCount": "Gets motor tacho count.",
|
||||||
|
"motors.stopAllMotors": "Stops all motors",
|
||||||
"output.createBuffer": "Create a new zero-initialized buffer.",
|
"output.createBuffer": "Create a new zero-initialized buffer.",
|
||||||
"output.createBuffer|param|size": "number of bytes in the buffer",
|
"output.createBuffer|param|size": "number of bytes in the buffer",
|
||||||
"output.getCurrentSpeed": "Get motor speed.",
|
|
||||||
"output.getCurrentSpeed|param|out": "the output connection that the motor is connected to",
|
|
||||||
"output.getPattern": "Pattern block.",
|
|
||||||
"output.getPattern|param|pattern": "the lights pattern to use. eg: LightsPattern.Green",
|
|
||||||
"output.setLights": "Set lights.",
|
|
||||||
"output.setLights|param|pattern": "the lights pattern to use.",
|
|
||||||
"output.setPower": "Set motor power.",
|
|
||||||
"output.setPower|param|out": "the output connection that the motor is connected to",
|
|
||||||
"output.setPower|param|power": "the desired power to use. eg: 100",
|
|
||||||
"output.setSpeed": "Set motor speed.",
|
|
||||||
"output.setSpeed|param|out": "the output connection that the motor is connected to",
|
|
||||||
"output.setSpeed|param|speed": "the desired speed to use. eg: 100",
|
|
||||||
"output.start": "Turn motor on.",
|
|
||||||
"output.start|param|out": "the output connection that the motor is connected to",
|
|
||||||
"output.stop": "Turn motor off.",
|
|
||||||
"output.stop|param|out": "the output connection that the motor is connected to",
|
|
||||||
"output.turn": "Turn a motor on for a specified number of milliseconds.",
|
|
||||||
"output.turn|param|ms": "the number of milliseconds to turn the motor on, eg: 500",
|
|
||||||
"output.turn|param|out": "the output connection that the motor is connected to",
|
|
||||||
"output.turn|param|useBrake": "whether or not to use the brake, defaults to false",
|
|
||||||
"screen.clear": "Clear screen and reset font to normal.",
|
"screen.clear": "Clear screen and reset font to normal.",
|
||||||
"screen.doubleIcon": "Double size of an icon.",
|
"screen.imageOf": "Makes an image bound to a buffer.",
|
||||||
"screen.drawIcon": "Draw an icon on the screen.",
|
"screen.unpackPNG": "Decompresses a 1-bit gray scale PNG image to image format.",
|
||||||
"screen.drawText": "Show text on the screen.",
|
|
||||||
"screen.drawText|param|text": "the text to print on the screen, eg: \"Hello world\"",
|
|
||||||
"screen.drawText|param|x": "the starting position's x coordinate, eg: 0",
|
|
||||||
"screen.drawText|param|y": "the starting position's x coordinate, eg: 0",
|
|
||||||
"serial": "Reading and writing data over a serial connection.",
|
"serial": "Reading and writing data over a serial connection.",
|
||||||
"serial.writeDmesg": "Send DMESG debug buffer over serial."
|
"serial.writeDmesg": "Send DMESG debug buffer over serial."
|
||||||
}
|
}
|
@ -1,7 +1,6 @@
|
|||||||
{
|
{
|
||||||
"ButtonEvent.Click|block": "click",
|
"ButtonEvent.Click|block": "click",
|
||||||
"ButtonEvent.Down|block": "down",
|
"ButtonEvent.Down|block": "down",
|
||||||
"ButtonEvent.LongClick|block": "long click",
|
|
||||||
"ButtonEvent.Up|block": "up",
|
"ButtonEvent.Up|block": "up",
|
||||||
"LightsPattern.GreenFlash|block": "Flashing Green",
|
"LightsPattern.GreenFlash|block": "Flashing Green",
|
||||||
"LightsPattern.GreenPulse|block": "Pulsing Green",
|
"LightsPattern.GreenPulse|block": "Pulsing Green",
|
||||||
@ -13,37 +12,61 @@
|
|||||||
"LightsPattern.RedFlash|block": "Flashing Red",
|
"LightsPattern.RedFlash|block": "Flashing Red",
|
||||||
"LightsPattern.RedPulse|block": "Pulsing Red",
|
"LightsPattern.RedPulse|block": "Pulsing Red",
|
||||||
"LightsPattern.Red|block": "Red",
|
"LightsPattern.Red|block": "Red",
|
||||||
|
"Output.ALL|block": "All",
|
||||||
|
"Output.A|block": "A",
|
||||||
|
"Output.B|block": "B",
|
||||||
|
"Output.C|block": "C",
|
||||||
|
"Output.D|block": "D",
|
||||||
|
"brick.Button.isPressed|block": "`icons.brickButtons` %button|is pressed",
|
||||||
|
"brick.Button.onEvent|block": "on `icons.brickButtons` %button|%event",
|
||||||
|
"brick.Button.waitUntil|block": "wait until `icons.brickButtons` %button|%event",
|
||||||
|
"brick.Button.wasPressed|block": "`icons.brickButtons` %button|was pressed",
|
||||||
|
"brick._imagePicker|block": "%image",
|
||||||
|
"brick.buttonDown|block": "down",
|
||||||
|
"brick.buttonEnter|block": "enter",
|
||||||
|
"brick.buttonLeft|block": "left",
|
||||||
|
"brick.buttonRight|block": "right",
|
||||||
|
"brick.buttonUp|block": "up",
|
||||||
|
"brick.lightPattern|block": "%pattern",
|
||||||
|
"brick.print|block": "`icons.brickDisplay` print %text| at x: %x| y: %y",
|
||||||
|
"brick.setPixel|block": "`icons.brickDisplay` set pixel %on| at x: %x| y: %y",
|
||||||
|
"brick.setStatusLight|block": "set `icons.brickButtons` to %pattern=led_pattern",
|
||||||
|
"brick.showImage|block": "`icons.brickDisplay` show image %image=scren_image_picker",
|
||||||
|
"brick|block": "brick",
|
||||||
"control.raiseEvent|block": "raise event|from %src|with value %value",
|
"control.raiseEvent|block": "raise event|from %src|with value %value",
|
||||||
"control|block": "control",
|
"control|block": "control",
|
||||||
"input.buttonDown|block": "button down",
|
"motors.Motor.count|block": "`icons.motorLarge` %motor|count",
|
||||||
"input.buttonEnter|block": "button enter",
|
"motors.Motor.move|block": "move `icons.motorLarge` %motor|by %angle|degrees at %power|%",
|
||||||
"input.buttonLeft|block": "button left",
|
"motors.Motor.power|block": "power `icons.motorLarge` %motor|to %power|%",
|
||||||
"input.buttonRight|block": "button right",
|
"motors.Motor.setBrake|block": "set `icons.motorLarge` %motor|brake %brake",
|
||||||
"input.buttonUp|block": "button up",
|
"motors.Motor.setReversed|block": "set `icons.motorLarge` %motor|reversed %reversed",
|
||||||
"input.remoteBottomLeft|block": "remote bottom-left",
|
"motors.Motor.speed|block": "`icons.motorLarge` %motor|speed",
|
||||||
"input.remoteBottomRight|block": "remote bottom-right",
|
"motors.Motor.stop|block": "stop `icons.motorLarge` %motor",
|
||||||
"input.remoteCenter|block": "remote center",
|
"motors.Motor.tachoCount|block": "`icons.motorLarge` %motor|tacho count",
|
||||||
"input.remoteTopLeft|block": "remote top-left",
|
"motors.largeMotorA|block": "large A",
|
||||||
"input.remoteTopRight|block": "remote top-right",
|
"motors.largeMotorB|block": "large B",
|
||||||
"input|block": "input",
|
"motors.largeMotorC|block": "large C",
|
||||||
"output.getCurrentSpeed|block": "motor %out|speed",
|
"motors.largeMotorD|block": "large D",
|
||||||
"output.getPattern|block": "%pattern",
|
"motors.mediumMotorA|block": "medium A",
|
||||||
"output.setLights|block": "set status light %pattern=led_pattern",
|
"motors.mediumMotorB|block": "medium B",
|
||||||
"output.setPower|block": "set motor %out| power to %power",
|
"motors.mediumMotorC|block": "medium C",
|
||||||
"output.setSpeed|block": "set motor %out| speed to %speed",
|
"motors.mediumMotorD|block": "medium D",
|
||||||
"output.start|block": "turn motor %out|on",
|
"motors.stopAllMotors|block": "stop all `icons.motorLarge`",
|
||||||
"output.stop|block": "turn motor %out|off",
|
"motors|block": "motors",
|
||||||
"output.turn|block": "turn motor %out| on for %ms|milliseconds",
|
|
||||||
"output|block": "output",
|
"output|block": "output",
|
||||||
"screen.drawText|block": "print %text| at x: %x| y: %y",
|
|
||||||
"screen|block": "screen",
|
"screen|block": "screen",
|
||||||
"serial|block": "serial",
|
"serial|block": "serial",
|
||||||
|
"{id:category}Brick": "Brick",
|
||||||
"{id:category}Control": "Control",
|
"{id:category}Control": "Control",
|
||||||
"{id:category}Input": "Input",
|
"{id:category}Image": "Image",
|
||||||
|
"{id:category}Images": "Images",
|
||||||
|
"{id:category}MMap": "MMap",
|
||||||
|
"{id:category}Motors": "Motors",
|
||||||
"{id:category}Output": "Output",
|
"{id:category}Output": "Output",
|
||||||
"{id:category}Screen": "Screen",
|
"{id:category}Screen": "Screen",
|
||||||
"{id:category}Serial": "Serial",
|
"{id:category}Serial": "Serial",
|
||||||
"{id:group}Lights": "Lights",
|
"{id:group}Buttons": "Buttons",
|
||||||
|
"{id:group}Light": "Light",
|
||||||
"{id:group}Motors": "Motors",
|
"{id:group}Motors": "Motors",
|
||||||
"{id:group}Screen": "Screen"
|
"{id:group}Screen": "Screen"
|
||||||
}
|
}
|
@ -4,34 +4,34 @@
|
|||||||
*/
|
*/
|
||||||
const enum LightsPattern {
|
const enum LightsPattern {
|
||||||
//% block=Off enumval=0
|
//% block=Off enumval=0
|
||||||
//% blockIdentity=output.getPattern
|
//% blockIdentity=brick.lightPattern
|
||||||
Off = 0,
|
Off = 0,
|
||||||
//% block=Green enumval=1
|
//% block=Green enumval=1
|
||||||
//% blockIdentity=output.getPattern
|
//% blockIdentity=brick.lightPattern
|
||||||
Green = 1,
|
Green = 1,
|
||||||
//% block=Red enumval=2
|
//% block=Red enumval=2
|
||||||
//% blockIdentity=output.getPattern
|
//% blockIdentity=brick.lightPattern
|
||||||
Red = 2,
|
Red = 2,
|
||||||
//% block=Orange enumval=3
|
//% block=Orange enumval=3
|
||||||
//% blockIdentity=output.getPattern
|
//% blockIdentity=brick.lightPattern
|
||||||
Orange = 3,
|
Orange = 3,
|
||||||
//% block="Flashing Green" enumval=4
|
//% block="Flashing Green" enumval=4
|
||||||
//% blockIdentity=output.getPattern
|
//% blockIdentity=brick.lightPattern
|
||||||
GreenFlash = 4,
|
GreenFlash = 4,
|
||||||
//% block="Flashing Red" enumval=5
|
//% block="Flashing Red" enumval=5
|
||||||
//% blockIdentity=output.getPattern
|
//% blockIdentity=brick.lightPattern
|
||||||
RedFlash = 5,
|
RedFlash = 5,
|
||||||
//% block="Flashing Orange" enumval=6
|
//% block="Flashing Orange" enumval=6
|
||||||
//% blockIdentity=output.getPattern
|
//% blockIdentity=brick.lightPattern
|
||||||
OrangeFlash = 6,
|
OrangeFlash = 6,
|
||||||
//% block="Pulsing Green" enumval=7
|
//% block="Pulsing Green" enumval=7
|
||||||
//% blockIdentity=output.getPattern
|
//% blockIdentity=brick.lightPattern
|
||||||
GreenPulse = 7,
|
GreenPulse = 7,
|
||||||
//% block="Pulsing Red" enumval=8
|
//% block="Pulsing Red" enumval=8
|
||||||
//% blockIdentity=output.getPattern
|
//% blockIdentity=brick.lightPattern
|
||||||
RedPulse = 8,
|
RedPulse = 8,
|
||||||
//% block="Pulsing Orange" enumval=9
|
//% block="Pulsing Orange" enumval=9
|
||||||
//% blockIdentity=output.getPattern
|
//% blockIdentity=brick.lightPattern
|
||||||
OrangePulse = 9,
|
OrangePulse = 9,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,15 +41,13 @@ const enum LightsPattern {
|
|||||||
const enum ButtonEvent {
|
const enum ButtonEvent {
|
||||||
//% block="click"
|
//% block="click"
|
||||||
Click = 1,
|
Click = 1,
|
||||||
//% block="long click"
|
|
||||||
LongClick = 2,
|
|
||||||
//% block="up"
|
//% block="up"
|
||||||
Up = 3,
|
Up = 3,
|
||||||
//% block="down"
|
//% block="down"
|
||||||
Down = 4,
|
Down = 4,
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace input {
|
namespace brick {
|
||||||
/**
|
/**
|
||||||
* Generic button class, for device buttons and sensors.
|
* Generic button class, for device buttons and sensors.
|
||||||
*/
|
*/
|
||||||
@ -67,16 +65,18 @@ namespace input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//% hidden
|
//% hidden
|
||||||
update(curr: boolean) {
|
_update(curr: boolean) {
|
||||||
if (this._isPressed == curr) return
|
if (this._isPressed == curr) return
|
||||||
this._isPressed = curr
|
this._isPressed = curr
|
||||||
if (curr) {
|
if (curr) {
|
||||||
|
this._wasPressed = true;
|
||||||
this.downTime = control.millis()
|
this.downTime = control.millis()
|
||||||
control.raiseEvent(this._id, ButtonEvent.Down)
|
control.raiseEvent(this._id, ButtonEvent.Down)
|
||||||
} else {
|
} else {
|
||||||
control.raiseEvent(this._id, ButtonEvent.Up)
|
control.raiseEvent(this._id, ButtonEvent.Up)
|
||||||
let delta = control.millis() - this.downTime
|
const delta = control.millis() - this.downTime;
|
||||||
control.raiseEvent(this._id, delta > 500 ? ButtonEvent.LongClick : ButtonEvent.Click)
|
if (delta < 500)
|
||||||
|
control.raiseEvent(this._id, ButtonEvent.Click)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,16 +84,13 @@ namespace input {
|
|||||||
* Check if button is currently pressed or not.
|
* Check if button is currently pressed or not.
|
||||||
* @param button the button to query the request
|
* @param button the button to query the request
|
||||||
*/
|
*/
|
||||||
//% help=input/button/is-pressed weight=79
|
//% help=input/button/is-pressed
|
||||||
//% block="%button|is pressed"
|
//% block="`icons.brickButtons` %button|is pressed"
|
||||||
//% blockId=buttonIsPressed
|
//% blockId=buttonIsPressed
|
||||||
//% blockGap=8
|
//% parts="brick"
|
||||||
//% parts="buttonpair"
|
//% blockNamespace=brick
|
||||||
//% blockNamespace=input
|
//% weight=81 blockGap=8
|
||||||
//% group="Brick buttons"
|
//% group="Buttons"
|
||||||
//% button.fieldEditor="gridpicker"
|
|
||||||
//% button.fieldOptions.width=220
|
|
||||||
//% button.fieldOptions.columns=3
|
|
||||||
isPressed() {
|
isPressed() {
|
||||||
return this._isPressed
|
return this._isPressed
|
||||||
}
|
}
|
||||||
@ -102,15 +99,13 @@ namespace input {
|
|||||||
* See if the button was pressed again since the last time you checked.
|
* See if the button was pressed again since the last time you checked.
|
||||||
* @param button the button to query the request
|
* @param button the button to query the request
|
||||||
*/
|
*/
|
||||||
//% help=input/button/was-pressed weight=78
|
//% help=input/button/was-pressed
|
||||||
//% block="%button|was pressed"
|
//% block="`icons.brickButtons` %button|was pressed"
|
||||||
//% blockId=buttonWasPressed
|
//% blockId=buttonWasPressed
|
||||||
//% parts="buttonpair" blockGap=8
|
//% parts="brick"
|
||||||
//% blockNamespace=input advanced=true
|
//% blockNamespace=brick
|
||||||
//% group="Brick buttons"
|
//% weight=80 blockGap=8
|
||||||
//% button.fieldEditor="gridpicker"
|
//% group="Buttons"
|
||||||
//% button.fieldOptions.width=220
|
|
||||||
//% button.fieldOptions.columns=3
|
|
||||||
wasPressed() {
|
wasPressed() {
|
||||||
const r = this._wasPressed
|
const r = this._wasPressed
|
||||||
this._wasPressed = false
|
this._wasPressed = false
|
||||||
@ -118,26 +113,38 @@ namespace input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Do something when a button or sensor is clicked, double clicked, etc...
|
* Do something when a button or sensor is clicked, up or down.
|
||||||
* @param button the button that needs to be clicked or used
|
* @param button the button that needs to be clicked or used
|
||||||
* @param event the kind of button gesture that needs to be detected
|
* @param event the kind of button gesture that needs to be detected
|
||||||
* @param body code to run when the event is raised
|
* @param body code to run when the event is raised
|
||||||
*/
|
*/
|
||||||
//% help=input/button/on-event weight=99 blockGap=8
|
//% help=input/button/on-event
|
||||||
//% blockId=buttonEvent block="on %button|%event"
|
//% blockId=buttonEvent block="on `icons.brickButtons` %button|%event"
|
||||||
//% parts="buttonpair"
|
//% parts="brick"
|
||||||
//% blockNamespace=input
|
//% blockNamespace=brick
|
||||||
//% group="Brick buttons"
|
//% weight=99 blockGap=8
|
||||||
//% button.fieldEditor="gridpicker"
|
//% group="Buttons"
|
||||||
//% button.fieldOptions.width=220
|
|
||||||
//% button.fieldOptions.columns=3
|
|
||||||
onEvent(ev: ButtonEvent, body: () => void) {
|
onEvent(ev: ButtonEvent, body: () => void) {
|
||||||
control.onEvent(this._id, ev, body)
|
control.onEvent(this._id, ev, body)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Waits until the event is raised
|
||||||
|
* @param ev the event to wait for
|
||||||
|
*/
|
||||||
|
//% help=input/button/wait-until
|
||||||
|
//% blockId=buttonWaitUntil block="wait until `icons.brickButtons` %button|%event"
|
||||||
|
//% parts="brick"
|
||||||
|
//% blockNamespace=brick
|
||||||
|
//% weight=98 blockGap=8
|
||||||
|
//% group="Buttons"
|
||||||
|
waitUntil(ev: ButtonEvent) {
|
||||||
|
control.waitForEvent(this._id, ev);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace input {
|
namespace brick {
|
||||||
let btnsMM: MMap
|
let btnsMM: MMap
|
||||||
let buttons: DevButton[]
|
let buttons: DevButton[]
|
||||||
|
|
||||||
@ -163,11 +170,11 @@ namespace input {
|
|||||||
btnsMM = control.mmap("/dev/lms_ui", DAL.NUM_BUTTONS, 0)
|
btnsMM = control.mmap("/dev/lms_ui", DAL.NUM_BUTTONS, 0)
|
||||||
if (!btnsMM) control.fail("no buttons?")
|
if (!btnsMM) control.fail("no buttons?")
|
||||||
buttons = []
|
buttons = []
|
||||||
input.internal.unsafePollForChanges(50, readButtons, (prev, curr) => {
|
sensors.internal.unsafePollForChanges(50, readButtons, (prev, curr) => {
|
||||||
if (curr & DAL.BUTTON_ID_ESCAPE)
|
if (curr & DAL.BUTTON_ID_ESCAPE)
|
||||||
control.reset()
|
control.reset()
|
||||||
for (let b of buttons)
|
for (let b of buttons)
|
||||||
b.update(!!(curr & b.mask))
|
b._update(!!(curr & b.mask))
|
||||||
})
|
})
|
||||||
control.dmesg("runtime started, " + control.deviceFirmwareVersion())
|
control.dmesg("runtime started, " + control.deviceFirmwareVersion())
|
||||||
}
|
}
|
||||||
@ -184,35 +191,36 @@ namespace input {
|
|||||||
|
|
||||||
initBtns() // always ON as it handles ESCAPE button
|
initBtns() // always ON as it handles ESCAPE button
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Left button.
|
* Enter button on the EV3 Brick.
|
||||||
*/
|
*/
|
||||||
//% whenUsed block="button left" weight=95 fixedInstance
|
//% whenUsed block="enter" weight=95 fixedInstance
|
||||||
|
export const buttonEnter: Button = new DevButton(DAL.BUTTON_ID_ENTER)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Left button on the EV3 Brick.
|
||||||
|
*/
|
||||||
|
//% whenUsed block="left" weight=95 fixedInstance
|
||||||
export const buttonLeft: Button = new DevButton(DAL.BUTTON_ID_LEFT)
|
export const buttonLeft: Button = new DevButton(DAL.BUTTON_ID_LEFT)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Right button.
|
* Right button on the EV3 Brick.
|
||||||
*/
|
*/
|
||||||
//% whenUsed block="button right" weight=94 fixedInstance
|
//% whenUsed block="right" weight=94 fixedInstance
|
||||||
export const buttonRight: Button = new DevButton(DAL.BUTTON_ID_RIGHT)
|
export const buttonRight: Button = new DevButton(DAL.BUTTON_ID_RIGHT)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Up button.
|
* Up button on the EV3 Brick.
|
||||||
*/
|
*/
|
||||||
//% whenUsed block="button up" weight=95 fixedInstance
|
//% whenUsed block="up" weight=95 fixedInstance
|
||||||
export const buttonUp: Button = new DevButton(DAL.BUTTON_ID_UP)
|
export const buttonUp: Button = new DevButton(DAL.BUTTON_ID_UP)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Down button.
|
* Down button on the EV3 Brick.
|
||||||
*/
|
*/
|
||||||
//% whenUsed block="button down" weight=95 fixedInstance
|
//% whenUsed block="down" weight=95 fixedInstance
|
||||||
export const buttonDown: Button = new DevButton(DAL.BUTTON_ID_DOWN)
|
export const buttonDown: Button = new DevButton(DAL.BUTTON_ID_DOWN)
|
||||||
|
|
||||||
/**
|
|
||||||
* Enter button.
|
|
||||||
*/
|
|
||||||
//% whenUsed block="button enter" weight=95 fixedInstance
|
|
||||||
export const buttonEnter: Button = new DevButton(DAL.BUTTON_ID_ENTER)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -222,7 +230,7 @@ namespace control {
|
|||||||
*/
|
*/
|
||||||
export function deviceFirmwareVersion(): string {
|
export function deviceFirmwareVersion(): string {
|
||||||
let buf = output.createBuffer(6)
|
let buf = output.createBuffer(6)
|
||||||
input.internal.getBtnsMM().read(buf)
|
brick.internal.getBtnsMM().read(buf)
|
||||||
let r = ""
|
let r = ""
|
||||||
for (let i = 0; i < buf.length; ++i) {
|
for (let i = 0; i < buf.length; ++i) {
|
||||||
let c = buf[i]
|
let c = buf[i]
|
||||||
@ -233,22 +241,22 @@ namespace control {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace output {
|
namespace brick {
|
||||||
let currPattern: LightsPattern
|
let currPattern: LightsPattern
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set lights.
|
* Set lights.
|
||||||
* @param pattern the lights pattern to use.
|
* @param pattern the lights pattern to use.
|
||||||
*/
|
*/
|
||||||
//% blockId=setLights block="set status light %pattern=led_pattern"
|
//% blockId=setLights block="set `icons.brickButtons` to %pattern=led_pattern"
|
||||||
//% weight=100 group="Lights"
|
//% weight=100 group="Light"
|
||||||
export function setLights(pattern: number): void {
|
export function setStatusLight(pattern: number): void {
|
||||||
if (currPattern === pattern)
|
if (currPattern === pattern)
|
||||||
return
|
return
|
||||||
currPattern = pattern
|
currPattern = pattern
|
||||||
let cmd = output.createBuffer(2)
|
let cmd = output.createBuffer(2)
|
||||||
cmd[0] = pattern + 48
|
cmd[0] = pattern + 48
|
||||||
input.internal.getBtnsMM().write(cmd)
|
brick.internal.getBtnsMM().write(cmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -257,9 +265,9 @@ namespace output {
|
|||||||
* @param pattern the lights pattern to use. eg: LightsPattern.Green
|
* @param pattern the lights pattern to use. eg: LightsPattern.Green
|
||||||
*/
|
*/
|
||||||
//% blockId=led_pattern block="%pattern"
|
//% blockId=led_pattern block="%pattern"
|
||||||
//% shim=TD_ID colorSecondary="#6e9a36"
|
//% shim=TD_ID colorSecondary="#6e9a36" group="Light"
|
||||||
//% blockHidden=true useEnumVal=1 pattern.fieldOptions.decompileLiterals=1
|
//% blockHidden=true useEnumVal=1 pattern.fieldOptions.decompileLiterals=1
|
||||||
export function getPattern(pattern: LightsPattern): number {
|
export function lightPattern(pattern: LightsPattern): number {
|
||||||
return pattern;
|
return pattern;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,55 +0,0 @@
|
|||||||
const enum ColorSensorMode {
|
|
||||||
None = -1,
|
|
||||||
Reflect = 0,
|
|
||||||
Ambient = 1,
|
|
||||||
Color = 2,
|
|
||||||
RefRaw = 3,
|
|
||||||
RgbRaw = 4,
|
|
||||||
ColorCal = 5,
|
|
||||||
}
|
|
||||||
|
|
||||||
const enum ColorSensorColor {
|
|
||||||
None,
|
|
||||||
Black,
|
|
||||||
Blue,
|
|
||||||
Green,
|
|
||||||
Yellow,
|
|
||||||
Red,
|
|
||||||
White,
|
|
||||||
Brown,
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace input {
|
|
||||||
|
|
||||||
export class ColorSensor extends internal.UartSensor {
|
|
||||||
constructor() {
|
|
||||||
super()
|
|
||||||
}
|
|
||||||
|
|
||||||
_deviceType() {
|
|
||||||
return DAL.DEVICE_TYPE_COLOR
|
|
||||||
}
|
|
||||||
|
|
||||||
setMode(m: ColorSensorMode) {
|
|
||||||
this._setMode(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
getAmbientLight() {
|
|
||||||
this.setMode(ColorSensorMode.Ambient)
|
|
||||||
return this.getNumber(NumberFormat.UInt8LE, 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
getReflectedLight() {
|
|
||||||
this.setMode(ColorSensorMode.Reflect)
|
|
||||||
return this.getNumber(NumberFormat.UInt8LE, 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
getColor(): ColorSensorColor {
|
|
||||||
this.setMode(ColorSensorMode.Color)
|
|
||||||
return this.getNumber(NumberFormat.UInt8LE, 0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//% whenUsed
|
|
||||||
export const color: ColorSensor = new ColorSensor()
|
|
||||||
}
|
|
@ -10,7 +10,7 @@ namespace control {
|
|||||||
this._id = id
|
this._id = id
|
||||||
}
|
}
|
||||||
|
|
||||||
getId() {
|
id() {
|
||||||
return this._id;
|
return this._id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,34 +0,0 @@
|
|||||||
const enum GyroSensorMode {
|
|
||||||
None = -1,
|
|
||||||
Angle = 0,
|
|
||||||
Rate = 1,
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace input {
|
|
||||||
export class GyroSensor extends internal.UartSensor {
|
|
||||||
constructor() {
|
|
||||||
super()
|
|
||||||
}
|
|
||||||
|
|
||||||
_deviceType() {
|
|
||||||
return DAL.DEVICE_TYPE_GYRO
|
|
||||||
}
|
|
||||||
|
|
||||||
setMode(m: GyroSensorMode) {
|
|
||||||
this._setMode(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
getAngle() {
|
|
||||||
this.setMode(GyroSensorMode.Angle)
|
|
||||||
return this.getNumber(NumberFormat.Int16LE, 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
getRate() {
|
|
||||||
this.setMode(GyroSensorMode.Rate)
|
|
||||||
return this.getNumber(NumberFormat.Int16LE, 0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//% whenUsed
|
|
||||||
export const gyro: GyroSensor = new GyroSensor()
|
|
||||||
}
|
|
54
libs/core/icons.jres
Normal file
136
libs/core/images.jres
Normal file
@ -0,0 +1,136 @@
|
|||||||
|
{
|
||||||
|
"*": {
|
||||||
|
"namespace": "images",
|
||||||
|
"dataEncoding": "base64",
|
||||||
|
"mimeType": "image/png"
|
||||||
|
},
|
||||||
|
"expressionsBigSmile": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAt0lEQVR42u3UsQ0DIQwFUEcUlIzAKIwG2YxRGIGSApmcuVy4AwqkSxEppvjFEwIJG0OZLg/s7Ox/50G0PLuDlidHAHPk2TOAPnLJZSAXsXPUSOebbLhe7L/oUJfpHXfXvefd1X1X7+julZRJ3/VSJ0A0y/6sc8Muu/9E57TVjR7oysfoNDFQjJ7ofeToZEmNjtvZQU/qDrY4M3EnE9iJ+61cs/6JAGLmuVX32m+tq64eBf879i/5C1nd6IT3Lpx4AAAAAElFTkSuQmCC",
|
||||||
|
"expressionsHeartLarge": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAB/UlEQVR42u3WPW7cMBAF4BEEmI1hXSCwrpAyRWDlSCndicEWuZZ8Ex6BpQqBDsUfzXtcOQsHcapso+UHLeftaJekvJ6+Fvm77sd8DT27LWMvM/oqZWzFoC8iaaIgIuhxOOzXLb6Z1OPwvs/Tlxuyx+lHW+b7bNRdvMtPeb75h3q8TbYxl52duo3jJ5Pmk9HPh8s+vuSyZp2q7x8X85LqSLdPmH1PLb3LdeRpqL5PKxLn3evIo6nukz9PqY4MPfvXMdURc6nu0vhT8f6leionD0OqL51jNybXl8Nt/nz17zP7JdeX5+p52FX/MpHHgvl6XzwU/5bry8PILsXvim/CLzOce/9O74qvrf88d3mvm//+Ed4+Rxn+jYfWxz/z19anG24bn2/40jivD/o7v+W++R/d8vXqcf3et6s2w/pJbYP1ltoD6zO1AdZzaoOu//x1db/gmLq/cMzioY0J+xTFrG6bmLDfUczqrolZ3XP3cT+l+NVDE/PYl5uYul9zzMMXjnm445h6HuCYh68c8/CNuqweOL6eQzi++kIx1R3FVPcUU32lmOobxVQPFBPOSxQT3EKX0ReMD+4xJviKMcE3jAkeMCae6zAmuoWY6AvERHfaZXIP8dE3iIkeICadPyEmudWY5G+9d925+/7cV3Pu23DuYXzj/Dx93Dn8yn8BfHcW3cEFXEQAAAAASUVORK5CYII=",
|
||||||
|
"expressionsHeartSmall": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABXUlEQVR42u3WMW7DIBgF4Gd5YKvVC5QzRN1r5Sy9RiRbykF6FTJ17BU4AiMDsgtWZN6PbSVRutUMlvMR4QcxP8G42gx23/0B99ONaUrv0cYrUDoQvxow9ZIH1OdxdFMvu4e6jKMFlHQH5dInHKUbVL6LD4eTHuXUxofDL/xND9FPnfAoL02MiY+2dKV8vGrhaYT6HOOj0exphGry+qt0XGzq/WFPI+OYHN8Lh1m4w9w+H/R3dpv9sOGv97jJjv/gtA7VM06/S/2M++zqHg/Zmw3X5Xt+bYt9ccO7ct/xctL+Fcszu5XTpTogpkV1Q0yL6oyIOfsgY3K94pjZjYiZ3YqY2Z2IyfWTY2YPImb2QcSk+txzTHLDMcktxyR3HJPcc0zykF8SeV5wfPaeYrIbisluKSa7o5jsgWKyDxRTnGsUU3g/r7L0rXtbr7tX6x6adR/0xvnb7v83dv8j/wXoD/U2XjE34wAAAABJRU5ErkJggg==",
|
||||||
|
"expressionsMouth1open": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACQklEQVR42u3WvW7TUBQH8L+xFC+AH4DBPAIL6sBgNp6g0IlkR2LuUtmoQ0bew+nQsRuOPPAEqKurbGHgRlXEFXHv4Vxfxx/XNgIJhCrlSlHkn/7+kO1zfECDK8V98c0Qr1IIp8+5yw4EXVWAcSBqcYzG632U2Wq8u9i/yz57O3ZzxPaKyPhctTWQtRMVtRJ1POQfm/oDV6HlH7te/I5Hxum/++2Q35buWx7+Td8M+Uq78st7a9wvn0Pphe1++X5S4XVd+pRpl7Z72mUoXhGJyDxf0plz8tiDPOM3e//cXc4sFXsBZ8n1sXeuhjyHz/cT7ozoQWC8eBrRUiBMsYsnl4GY7P2Zp9wrvEuxpbsTwDfXR/KU3+YpXaf4kSQXwAvPuHgPPE6SBeePj9/E7vYDn++cz3+d44ylzCekkjRQiMPCST7Rep/XawY4KReQ2aryvK74fKI8tl5NfhrjbArc2fmEaL0gSux8d7XynXXIH/L/KL+j3h4L+qrr8ZGdfo2jFAoTO3+BJ7quXTt/outahks7fxnp/hDlX6z8jOa6z4hv7UtakLqp+s8p/Cb8Fm6mfUNyBrfJc2FmVX/j0iWqypK4WL3KHUpzZ12mBfJIVK48HXpONKVtzLuaflj2Vf52BuC+E3An0N+e2j35EMgxcYuOc+vlb+NL/XmcNx7o9hyHPAHEIX3W2y1Pdd/No57f6P4tqOcr/S8PPuL7mSZqe3eeqd0ei0oXQ/NSNj5f/XIeG57fhue9kflwbJ6873PyiP8E/XjE+2xX1DsAAAAASUVORK5CYII=",
|
||||||
|
"expressionsMouth1shut": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACG0lEQVR42u3WMW7bMBQG4F8lYC5tdAT1CN2DQt1yAiEZgqK9gbcGHUoVGTz2CpkzxBmzWYaGnsBzWXj0IiNIQ8QKXx5FW7ZsuWiBBl1EQDb1gRJp8vHRoNaSofPOn8PnbTzNUAS7rAU7EDXVAt4BtcEp1l4/Y/3d2puF/d7sslyw+zduFkXeB3ZTI1M7UVkrUcNjvtjsX7iNt/xb08s/ceWd/rvftvlt5eGWx//S520+dW7Dam69h9U6VF5ue1jFJ5Wy6Sak3LnZduncxMURUaH8+pJrc06SPdI5R/Zq3QW3GVv2EsGY98fKeTdojZD3EYQmehF5L18rGl/jMMNdKvtR0Vv5G2nFCT5leCB7A4R+fGTOgN6QZtyeHk+Bt9J78R54dUz3GRY4GKZi9pX7O+f+Zxqfr9z7f0EmREkWWaRxGUwUTU4RuXGKSy4aCDL4+o0bp4nHkyRJuD/Z5/65mvSV+71KuzbDFF9GwIOrX9DAzVvxgx4T7mNSXcdEH5fzeYaDy7pcQeTO52Q+QCR1OQHy5XrxUEbkW4/omgew9IAyHdxVrQtoVSzdSuJkcEh2SIsUwXJ9qzjhXBBBGP6AcHupdmleAho9UTacQ4n3+ju33Qdrj1y4pTFntDSm7+5+wzMXR1rt+E8XjwXt+NR9m873+CpHq01v5ufat9N85UVb/s/3nxe/PV/az6P282vPebfvfOz+P3T+DP4EGY4rBjL+iVYAAAAASUVORK5CYII=",
|
||||||
|
"expressionsMouth2open": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAEj0lEQVR42uXWz2sjZRgH8CnBBkrT8VKQsOkchXpRJAhVnEgPuQhboW+SQmFXCgrxklIiKOjMbm0ClTZ/gJQs7sHum6HbImJlYUkI20Fx24MMKHhIGtxCBJlsWZyu4/v4vPMjZKaJeFPwufU7n74zTOZ9n0eAoVUX/q18bFjcEoRhF3iMJQVTJvRLGYhVYbCksLWEIRWtC7khF6IbKWFXCa3I71ZShRzec2YwfRZv9YzjQez1/0eRWphPqcKyAixqgqWAKcMFgNTEPJYSNBlYxISnCjyWwAQmrUvAJlRhUQZ7zFTOZTjDXGFSFPOE4+2Uqfwug16Fx4o9I0pgx1Uhg/n1gvJLFbYq8EixryQwn04JVAKr8KL8WxU2T+BYtp57VQR7Dj3mPwrywwokrkJFttRiBaxkSqhJcKEJ0ncnENfhM9lUuxUw86pAROhlJqWdNEuuQFLqdQzMCXrMazNivMNmb7MXqp37FPOu68nXYnLNLq6xYlUnpAJtA30FevTX8dkDO39gd6slir5B0ZehQ0ipuGQZb1lGdYv7Jq5PdTiltJ7XLPrNBa1McH+T+zT3143MqpE7J8cJ7st9f4vSl6h2So8/5H6c+xU4I2TVyEbIok7eNLiPcX8bjii9R2slqk3Rbyl6Fud+DTYIuUbIA5JJkHmCnk1zfwD4zFiM0jl6zL09x/0S905ln5CPuLeT3O96vl8VK899ru+9qpiEew22Q97scr+obIV823C8MhHyDcp9Ro6F/LqzPpXjIX/T8VlpOuSjjq9JQV8TpxxPxJCfirm+EvKTcdefhPxk0n0ePeSFvOvfSQZ4FiPHfz4bfH6h6/pC0GfGDNfvh3yEun4h5CPe+ochP+755ZCPeV4L+TnPZ0K+6Pla0Ne6nidPyKXiflg5nvwv/NMRfmeE3x7h10f4G32fNQa9avh+Lx949LzvlwPrq/7vSw8DvuR/D6QQ8KWE71sBX972fT3gyxv+9/NJwOtHvp8sDvp00/dXAh+c3va/z9cCH2i65+0X7fWgN739lfs44Octb/19FtjATdvbvwUW2PDzzNvvbd/fp3e5Z3Oun3d91lghiwb/M+H6JvddquXbVMPjvAkTri/j+U2+IrliylhEOg9b7vlThk1ai+O2/z6vbXNf8s4rBLhpV5LHSewA6JuuF9HvjdOzeGVOw3ejQ9M9PyX0uOdPdqo7OXw3aWg4fk/ChnH4fq36aXXzjtVF33Y8NuwH1xbWiPRQeriE7yYNLfd8luHo3v4fNVmXH92x3+vq4J7nyzI0V1sXGflM7iyxV5JpsJz1d2U4bTX+1JRT5fwAZrALe/1CgU59zP4Zm/7FDyDE0Bcdj7kaYbs4JFhfgjqugz3r+fNIhP2EI4fdgRvraWBOPzrESSMaZR+ABexdaDR0cPvdAoApRmENc3geGq0TcPvjPuZSFF7meRTa5lXAHwB9AXNZhC94LkLbEj1/C3NFhDLPq9CzMS9x/zbmIPlz0SrDfIP7NuaDc5Tv37g8d/H+frd+eU6LMHXkXDdqDvybuXH4nDn2j8dV58J/bN7+C/XpdkrjO2oQAAAAAElFTkSuQmCC",
|
||||||
|
"expressionsMouth2shut": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAD20lEQVR42u2V72sjRRjHpwS7UJqsbwoSTAZ8I8Q3lSMo9cXkKDRvhDshk6ZQuJOAQnzTEiJ4qLt37aVQaecPkLIH98LeZPFaRDw5OBLqJSg2fSELCr5IGmwhgmxaxM257uPMbu9IeznxrdLvy898dn7PswiGporO+Tn/L/KRYbiF0LAGiUXwaeqhJ9EGsI4Gg8+6DhoSpYpyQxqUmym0qZ3pUY5W1lFOjBkfpM+LoZ7zfVB7T77RcEvwiI7mNfAUGxwNbAJ9ALwjeDiFTAJeyIZHGhxhsMHDSxi8MR1lCLgjtnZM4FBwzcOK4DHfd1O29geBhgFHmhtXMbhRHWUFv7qg/WLAGoMDzX0xJvhECnEMzsIk+c2A1T1oEueFN1Rwp4Qv+I+I7DKIXQJGHL3EwEmmUAVD30T4uz2INuBTYuuPGNgFHVEVetlxvJH2knlI4l5nQ3AqfMErcTXa8RK3vVeMzoN1wbuBT79Sk0W3VPRKRoMuMWhbwmfQ47+OJrbdwrbbNcr8OoMaF/4KdCxaLs051luOZaxRncGO6J83oFPg1YLp8K/7nI1xwW9IPw37lF61sotW7pg2Y9JfCfz9Ar/F+avc3OfNa7zMYFT6eTigdNGaDdFMg74phmIQlv5t+KbA7/NKmZsR/i3nK8yLSr8Iy5ReofQhzcboNKWCT0h/G5YLXMTjfIo3OW8wd0r6c7Bcon5mf6cfUZpmblL6m7Cc4ANpMKcg/RwsJ+lA0sym0jdh/Yxvd6Wf0dZP+dOsbfm+FokO+jusxqWfJZGJ0/6S3z8n8RP/Ab/r+zd8fxbHfX/WytOMJX3F9ytY+l1uFtrcvCZ8NeL7VMVhSr+kuVLKysSEHwkHPsOrvBLlW4nvC+a68Mfjgb+H12g2TPPJZlKcAJ0evxD4aeF/PsoPo2zKbIv1onwwn3fIGp1P0r0NYyPXs2gaXQzm/xKp83vvV4xPjNU7TpfXUTtY7yR5eOVykeJdvDvnUDoz0gr2Z5LU72/9WSENcnDHfa9bD53s5yTZWWz1s+SQdOa815IzISfY/9fJfqv2l6nta8fbEI/WleC85j8kneqI+7N4dP0fAIVnVKfkn6/gesjbFI/U+QL00TpxE/75fkyOQyHvJ/Hk3Q5cX5rRPP8+3NPIkaJ4H4AD3rtQqzUguG+XAWxVgaLg8DLUWnsQ3M8twbECFyRXoG1fAhiT/oLgRIXPJFeh7agn/i3BNRVWJDeg5wpelv7bggN+XJcWPcFvSr8t+GAde+xffLruyfd1t/p0nQx5+jPr6rPq8D/U7eF1fuRf/y78hvP/7Dn/H/G/AcCdgHhcio2gAAAAAElFTkSuQmCC",
|
||||||
|
"expressionsSad": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAkElEQVR42u3TzQ2AIAwG0I9w8MgIjuJosoErMQojeORg1BSD4c8oJzUphwYeCTSlYKsOA3Z29tfc9RQXlbvtKM4ydy2S5a3DTzTGZ77CCzB8w1vzb67PVZ2v3oX7lj1zI6q+ns2cugFEzQGEbo7dkavSLZSDLF1L2iudznDnBZGPIaR+/JfSJ58Uvzs7+498B3cE819ZIE/TAAAAAElFTkSuQmCC",
|
||||||
|
"expressionsSick": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAApklEQVR42u3TsRHDIAwF0O+joPQIbBKNZkZjFI9AScFBkJucET7bcZEUouDgFSCEhDocAerq6j/z5HjOc++r5Tma3v202546toXHcs0LNgHoP/xu/Lfzc5Tno3/RulV/5p6GXjAPPaHVZiHhkTsgO+GBeyhJ99QuiNJRg6mrOL+YdkP1S+/Z1owXRJzcKcAk3fHGCucXxc+Td3nLoHE+ofWjrv6NvwHAjOwKGeyV+gAAAABJRU5ErkJggg==",
|
||||||
|
"expressionsSmile": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAkklEQVR42u3TvQ2AIBAF4EcsLBnBURwNNnAlRmEESwqD8pOYAGeUSk2O4gJfQeB4YCeHATs7+2vuplg3WbsdY12H2rUolreONNFQz9wjCTB/w3vP392fqz5fvQvnlr3wJaWl9Zw31XjOOeEhao5wHaJp0e5vIR2G1h3CkMT5oyvCDSCo+/rzM1Z9MILfnZ39V34A6BLzXyhnhjoAAAAASUVORK5CYII=",
|
||||||
|
"expressionsSwearing": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAEtklEQVR42r3WQW/cRBQA4HGN5B4Q7rEHlLlx5hikKMM/oagSV1S4pNKS2apIERKq/0BgfwiHTBQUH4Buf0DReuWqPq6ND3G0s/N4783MepvsFVZq4/3stWfee34zAvZ+jPjP3dHf5Y7deP+Tjl/r0fs1e0XHf+/40LO3RG933DbsRuHx/GbLZ7dz9ssL/NJsvc36gr2jb10TXajG3+eWvrl8eznMvW8+mFClwaz2zDfD8cyjj4Ok+20WwYdkHDteso5eTca5UhxiPKdCRe9gqpvoQsyi162Qq+BOiDyEFxpzjMeO3QqR0W0l/lemcIbCPnhv6SGvJJQokrwVIiWnWZwrqGFl1Y4L8sdPdA9N9IQmZsgPK4W+4ftXIr+k2eH93RdO9ninXW9xPO45zOrR5TL6CcxKKproTnFY3ImWJVUI+wN56XyE3ORAFlAl3vPiytHMQLpToaTDabLLs5eOZmBzp6YO55p7Vya1HIkcFFhVBW/V23Q4o5nlIDEzg5DBf03bOUUihxwH6YIPcpZznaOXcIX5C57L/Cr4JQ3soQx5+TQ7a8klxhBnfZDHPGZ55d1itJ3Koh9LrD9ynjQ+xddJcq6msHXM/rbeqOTcWEbeN3+B2OewwhTvc6y4R/u8FXkXvLBp9DUIPutw7DYx/CuOW8Wlw461x6P19ZNB9Er4Iua4hdclehadg+DdCF+U7PoyXA/sYusvtz7NKz7h3T/XYm8Rn9MPlJ9XaALoRnwpeKTsJngSPQ/xl3c8C+7jhZHxfpgG16PT55Nkv6fBB2oW3GO8J3e85PCMTp9b362EePChd767IU7vuuWWIJ7gudErbnnYQsQjCpwRjpPI75SiwhAP8Z82wnLeHMVE8gPIsT+0igsDY1hJHtFHFFAjOr8mYIzYrfiYAmpEDS0XkvKNCXhmmRFNNYCP0cA+jW4mmts49lRKEIcoNaL88TQ4XpvyiESCfn1wrGHtjumh0vgpixdGvP6OHABbq1P46Db49VPvC2raVkJNPkVPj9h900Y33uv8CLPSBJ9BWXlfuiNweuVzU8yguMZhCoyPPQRQC5+DfAayMGKCPkye488v6Ba9UxKUpBFhnB9zahf4yN5p6Y4VJZPyQjyR6J07VXaiekMOLwD+oOaOjjgMun5H8aGr33AQ4NZa3bWQXVM8fdoxdAUM9gT6pcvmoy/I7eQZ1Ffu2/k0D75YsZ+mUBZOF34dwc9vN+TUwMoSBxv7hltj4OZAUC+dVt57rMBN9G5wJyq+p+A3ERoX8KH95yS+17jWOY3NTtPStWy/D471ejPI4F3dPo19SbFjFjA7fdk1O/sW77SgFru+qvwihe+Y7Oqd66fYOtzXeFCorh3dUTNy9MCDrW/Yqa/iufdHuk28W8dt0Ht1yOse+wl5or0/2/bbzWdcxBfYHy7gfTf6K37P0b9R0NSjO/avwL7DIDXR3Q/R6d0er3eJ3fXx/sq79E7rIWxW6HOrg/+O8+LWaKkeGlyTvf/MueCGit5jJXg/j/tBl7Gvgv+y3R2lHLeb4OMO7CfyKqM4qF2fkTf8Mt/z2xW7vrsvXRe8Nbq3X13TfkUk93zgdpLt3/caud83//9+e7//C0qd0Owbh6PaAAAAAElFTkSuQmCC",
|
||||||
|
"expressionsTalking": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACDklEQVR42r3Wzc3kIAwGYEesxJESKIXSyGgby3ZCCRw5IGb5S7DBiRTp05fjowkwxPgFvuxzwK855EetfhQHO3uoDNvs0B9F3Z++Ud8BTJtEY499gAQgsLvz/dCX1L2N0kAPj/3t+oIc7vtsbQXD8S75vrA6vBye6sqqx2vWOpA43ZPNdnC6E9hj+QfVd0W+SRm1Ohk+m2oep2/pZfMgqMetuZPUEzQ/9FQMeUHFdzMXiam+lJDTxdM2u1fFo5w9S/agZk+iuNdLdW7FnVl8r27Xai5+rFXubPadcZP9s7ovLlYP+t6TXD2qe49q9STvPWjm+IoHN4z/fe+e88+DW8b//aC/XM9P7cPb/X/7fd/Wz219bkw964c6vzsvB3O+7MN5vDu/d+c9rP2helz+WJBPfeauL619bG/97ZgX1PuhnyZOvX+GaYLSZ1sfphM4efZtOsHe+/b3ELQNGzYvwpULdAK3jTzCE9Rw6vkl8DAa5Z1FcWRRPo6BWrJeecrm5pmuI3G7+/OGcAZ09zO/c55LkvsHQL8VGOKxDBTWe0KOaYN+PjxB+dhXQI8Ez+W4A6z3mai/41aAPGhcYNhxQaLxDS5s7PggDHcWHxzsu+X8IHWNPG6sf0j8I/eSdUHiHzkpurHPf4C9NybYWEdXr+neqFj39DBd7oC/r9KzhOpE8T7fpeBqRaxH+8v38P/FUimZWI/+PwAAAABJRU5ErkJggg==",
|
||||||
|
"expressionsWink": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAqElEQVR42u3TsQ3DIBAF0B9RUGYERvFokMplVmIDr8AILlNYJEARKbl/kd0kUnRXwSsQ+nxwp5Nhbm7+Y9/O3FfH/bnd6QnxzYvjnsYCmF69AoH5dtR9oV5DnZir9//sR/PRctbexXr7HV8UnxW/KJ4VL1HpwyT8OjwIH80p0kczIfvTaSWe2kHp5IUXtPGz8Fv3sAiv3VmeGXDM21eNNP/krIfm5n/hD5hN/hkkU+lAAAAAAElFTkSuQmCC",
|
||||||
|
"expressionsZzz": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACK0lEQVR42sXWPXLVMBAH8NV7zLhhxsNQpHRBQZuOUiXnYCg4Q5pIVJQ5Ategi6m4hjtad7gQUvQt7Xo1QxryquT3/Oz/rtaWwbGfFV7Q54HDPHCYOLfgPyOHkYvnufg6OP7nwD8P/N0/u/kvfj33eR14/IJzt9Glyb4DWct2/MK5v4DkXAMoztn1jR0VnBsaP/txmqzkp/jZT/FbfyTneuBAy0pu+XkO8fuydpn9QGUZKL6jsmLm6FtflhZ2aetey9rgXhTv44dbYan3Y4vfOYofRmmp8yaQz8lR/M5RfN3Og1al87U/f3BZvQWiXirQ6c/msrRnRX5bXGlwnb/O/uh/0ftF2pTQAXGTKrWx+Ooi+HXqXVeHX6GLE3IV/P3JL8WP2CzOl96h+D50iZ4PKuffmscvOA8TpyzcppVS3b5gwn/xkhrQfmFcvqT3v2Qf2cKPQFhBPA2l0HfEdR7KV8TDigS/YI+dN2loeo8dZn2OQ0z9GPqSXSGPHXuGx06ynp4JIW7vcTDzI7D3uF4GwJ39Y3qaIA8d++LMTPf30JkPdN9/SH5DXUvefQoD3X3ffBq4GPingb8ZueVcw1v2fcYO3K1X3vn90Z+H3R99E9j90S8ruz/6W4XdH90m+PexFvMR11tiHhL3p8Rc0fG2xgR0vKkxsR81JvWS84fCXi58KPxeIR5y4cSh+B/i37N/I54L2CYyD8Wv/LpsZP734orcF6lf7vcLv28/AaqW51qc+IlYAAAAAElFTkSuQmCC",
|
||||||
|
"eyesAngry": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACX0lEQVR42u3Wv27UMBwH8K8bRAakhhEJUF6BCRhQI96kb8BtIDHETLxORwakXsXAyAtUOksMbJCJC7qrw++fnYNgBpYy9Ja6n7P9dezWv2D642eNG79u34M+Tn8P3G7UpY1OHNaH3cM62VCgZ4/artgHbbfs1sfl6Xks+UjDuKcsQ0b5mn2QdpRvfSuzVexBEifPC5Ivp71jX+sKA3WN9hRg99JnGmjYvlL3Pbu2R/badoHdxrKNje1GR25jI3ur7YE8JqefQ/KW3ObkcUNnWX/xvWVNbyivtzU0/+C2humC3Jrxxq/f64K7gqMveFvweuGjuFt4YL9rAQfu2R9YwOwR8lwWMPuovna/eVAfNGB2fyRuT5A94lj3TQOyjzhR14DsAbbPGpDdV+YakJxWn85FApKP6JJLQPKAfI4SkNxX2SXAnKafz50DzGn6uT8HmNP02XeBAsxp+uxbTwHqEXdm/woKUB/xcPZLvlbVA45nf8d3srrH2z77GZ6iFY9wH2Zf4Rlq8RHu83n2U7yCEw+oLg799BGes3tULntcw9/jP7tAteAWNgeO++Ij3/6/Om9RCEsf2P3Rwvn/JuD2wifxx0vn9eP7odP68US82tEO2vobc75XG/V0366Al+Ldjh549jPghd7DV+S9ON/ztP/f9J6/WqPu8/1/CbdRj3Je4hWfb3VudWTF58t1hPttfdNb3XmP11p3+Dl34STVqY3bWp2iuraffqS69mX6ZHWN62D7MdXBMXZWB7luhi7XTZfqZqnOlupyqY6X6n7pPaH0XlF8Dym9t9y81/2H/hNF0RpVT4pRTAAAAABJRU5ErkJggg==",
|
||||||
|
"eyesAwake": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACCUlEQVR42u3WvU7cQBAH8L9lCVNA7gGOxC+Qgo7iohyPkkdIB50dIdHyCHmFK6nAVClpr4jESbQITMNZwngzMzvjPT4WRIREFLiG4efd9dq741m4B38V3v21vQX9Ev//jOOBd4kxFoe2YS+hjbQrULB3Pk7Zax/n7Nom6YfnvuQNdeOWMg3pVWbstcSdXC1zGS1ln8kdXckTkouuTdgrP8MZNe30KcBeShtXU7c29V4W7D5u2DN9C+zal60Z6NsYk2vfjj33cU3emdPf2jwn1zG5Xz3Wez3ird7L/aD7FTqHwV+4zsEdkWvYvUXHfa/Es7veQFy3eHCoJ7d9Zu73vrkAz0cSITilyVfxhi4Ep9TIdP4VZ4g6Z489l8Tq0saed0J9vdOYadH7d85TcQqyw34cTreEXYIT85tKE9Kn44X5dZmsmH/G8lbvSHcb79kUaxvmc6S/ikrc7ePTyPwK2U7BuUg5OcGXYfAlmrR/rgnWez/DcnKo/g2bq8Gx4Hh1v5KXbvPH8Cmf02KY7wOj8D6xZOs7BTbC+8cH89/A1sJ6fTQ/X1gvWt+R+Xxhfd025ubXVdgP7iC9ML+p87B/jt3Pfh8Wbcivy7bo9+3eaXD59tl+zv+T78YLfYef+/2P1ZFY3YnWqVhdi9XBWN2M1dlYXY7V8Vjdj50TYueK6Dkkdm55P9f9g/4H3XgcZrwl+lgAAAAASUVORK5CYII=",
|
||||||
|
"eyesBlackEye": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAB50lEQVR42u3WMU/CQBQH8Hc2UkKinZhQuzO5MWACfgMH2P0WjK0xcfUrMJpOjmzUya/gQGITV6OdgITSeu/u2rsebWyCRmK4geGXR++4Pu5/kBQOH/a+Sx4AHdamIwPZ8Ig5OLqH3G3dA+6W7r6Bn67JPBJzodjsaQZz/uUeW47DZifMXfHMJImJWC16zOfCJ0cGd9ehLtaMpZEppkdfQtvzvDEubGmJ5faoh2RIxwCnXNri56EHDQ+HSxcUpm5T95tYP+zbWMd9ie62Wf3Y0p2VD6+oB47YVos6sHLvwdSc8PqB5vEBr/fobw3Etsboh7x+qHtJfZTWE80bov5my/qmqL/83/XYE8wBsoZDv38r9NiJCn0d2k6Rr3xzWuQLIK/c7WTtw2mSPDH/APhMfeWS49RnUB9lDsZd6i9w0kl9AcazI3wCZ93U52Depv4IFy3pNUP6eebvUCdT4dfQP5IOisOf+5yeGnL90PrOF4pPALpyP6Em9xM6Re9rBjAqcvm+yt5vtX6Q/ZPvT9lvWj9n/VnWz7/9//qh82er87DCeVt6PivneaXzX80LNUeUfMnljppHak4p+ZXLNTXv1BxU8jGXm0qe5nNWyd9cLit5ncvxCrlfdk8ou1eU3UNK7y37e92O+BcKz5DpA7xJVAAAAABJRU5ErkJggg==",
|
||||||
|
"eyesBottomLeft": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABtUlEQVR42u3WsU7DMBAG4N8KUjfCjiCPAQMir9I3oBtIDDETr8PIgNRUDIy8AFIjMbBBJhrUEOOzz04Gjkos7ZAuvX7xJa5z8hnm10+J0bftLexH+d8Vxal3FyN3Dh5DrsGDOBUoyDsfJ+S1jzNyHqPi7SnXemPTaKSbhsvSE/LaxZ27qjN3t4S8ck80mibkLppWkZd+hpUd2vG/ALl2Y0xt09rEuy7IfdyQT3gVyDmXrEl5NXLrnNuRZz6urXfB7XcdPLPO96S8Oudn/eEtP8vc2OcVPIf0H85zMAvrHHajj777XuW9q4FnT9GbLo/emq/ob+Y5+ro6j75Uq+grnRbBH3Ad/R3JPPgMR9FfoJbsXYX96Pc4+GD/LnFbBL/D6UVwrR6jz3B2yb7W6nUefIqrk+BIFgOfDlwFPy6hD9k/sYdl7+gdW3c7f/Tzh5pv8hnQr497F2E90a8nkqJffwzWf1Jsel/S+xXqIeX6cfuqrx+/33K9Off1xvuwr0/nvj7J7T7v69nv82rT/i/1EanviH1K6mtSH5T6ptRnpb4s9XGp70vnBOlcIZ5DpHPLeK7bQf8By0loyHh24uwAAAAASUVORK5CYII=",
|
||||||
|
"eyesBottomRight": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABt0lEQVR42u3WsU7DMBAG4N8KUjfCjlAeAwZEXqVvQDeQkFoz8TqMDKi0YmDkBRCNxMAGmWhRg8OdfbYz1FRiKUjt0usXX+I6J5/RrvxMsPVNewP6KPe74jh3bmOU1iFj2DVkkKQCI3bj4oy9dnHBLmNUuD3nki8ojUfaadgs3WOvbWzsVV3Yu2XslX1iq3lC9mLbKPaJm2FFQ438C7BrO6atKa3JnOsRu4sX7D1ZBXbJZVvksholueQa9sLFNbnxTt+194Jc7sl5dSnP+sEbeVZ7Sc8byRzyX7jMoZ2SS2i2vvV/4VUZXXW8eAi+MGXwpv0M/to+Bl9WJ8Fnah58rvOR91tcBH9Ddud9gIPgT1AzcVNhN/gN9t7Fvya4Gnq/xtGpd63ugw9wfCa+1Opl7L2P80PvyKYd73dceTcT6H3xD+zgOTqiY+NO80ecP9R4nQ+AuD7IxnE9EdcT2TCuPzrr3xuue1+p97uqHnKpH7+vUv2E/ZbrzTvVW9yHqT69U32yu32e6jns8+rH/T/VR1J9J9mnUn0t1QdTfTPVZ1N9OdXHU30/dU5InSuS55DUuWV7rvuD/g1mT2jIOjnq9AAAAABJRU5ErkJggg==",
|
||||||
|
"eyesCrazy1": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABwUlEQVR42u3WsU7DMBAG4D+K1HShfYACeQW2DkUqj8JblM1BSKw8Aq/QsRMNEyMrAxKRWBENS1OpqYPPvqIEnZGCkOjQLHW/+GLXvuaMSrxS7P2/vYS5Avc9o3bfuW1jbB3chzwBd+JQQJFr1w7Jc9eOyblP8PV4ijW+MmHU007DRiUReW7b2t5NYvu0kDyzI1YJTcjerMqAPHUzzExXzb8C5IntU+UmrAydJ4rctVfkEa8COceSrfq8GmPjHKvJY9fOjeutm89867FxfibF5WMe6wcveazq0oyneA79X3hcuSndG+cu2vlHqUR/rG5FvwsXol+gkFxnGEm+SXEk+ToJeqIjvJa8QPigBF8iupK9E0r+hm4wFx075UvzJ1ItvAAiJa4nOvL6o9dmv77tr0l2MR9uXsX80aoU822Tx0rKz3UazbWQzwWCF3Z3sb8DC8mf0Z1I/oTDoeQzHI8kn+J0IPuJ6Oc4O5AdO+VTYNDGZ8BIXk8M5fXHpM1++fa3lg8Nr+VPw2v51vBafjZ9m89/9B5u+/731RFf3fHWKV9d89VBX9301VlfXfbVcV/d950TfOcK7znEd27Zn+t20D8BnntiOLdBg8cAAAAASUVORK5CYII=",
|
||||||
|
"eyesCrazy2": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABxElEQVR42u3WMU7DMBQG4D+K1HSBHqBArsDWoUjhKNyibA5CYuUIXKFjJxomRlYGJCKxIhqWplJTGz/bLUl5BhUh0aFd6n7xs137Kc9Q7CfDzv/bK+hPYH/n1O5YN20kxuH6kKdwnVwoIMilbYfkhW3H5K5PsBqeYrXPdBj1NMswUWlEXpi2NE/T2IwWkudmRpXSgsxDVQXkmV1hrrtK9y9Anpo+qtBhVWg9FeS2PSOP3C6Qu1iyWcftRqLdxUry2LYL7XLp+rtYeqzdjUlxReLm+sYrN5e60PMJt4bOL9ytQd1pt4tRkvPrF9alqFhfFLHgfJ5FY85LBM+cvwETzp/QHnD+iIMe5yMc9Tkf4qTL+zHrZzjd4x1b5UOgu4mPgD6/n+jx+4/BD+dlU/3r+b5Xgs2HB3XD5s9tOGHz7Rwll58yR5/L50WGw5rTWMbnabDPOsIrzkuE94LxKaJL3lsh569oB2PWsVU+1S9nsYGXQCTY/USL33+w++87r7XzXflaPnx6I39q3si3mjfys+aNfF75H72HN33/++qIr+5465SvrvnqoK9u+uqsry776riv7vvuCb57hfce4ru37O51W+gf2n5iOAicusQAAAAASUVORK5CYII=",
|
||||||
|
"eyesDisappointed": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACl0lEQVR42u3WvW7UQBAH8DGLblOccpSRCPErUEERhHkUHoEKqGIjJCokHoFXoKQipqKkpUDCEj1Zqlg6x2b+83H2GQ6JKhR3xZ39u/2Ytcc7puGPn5r2ft3eEX8yPW9wvFKXYyrEydrAK7JG1pWohPd6HOBJj3O4tck2w6Mve8vd0EnDyPm7ivAUdOASItOwsDc4bEOFgOhJRKMMXgNSbHiEPmtleoJXGKBZJe7WhU6mr0q4TJi38Njr9HBtUXQ8Mv8n0zcFu45Y9vB8kOkTew/n7vhNvFAsIOXsFhn6pcKidkd46imad7JCPnvB85XSYuhW5uitLgvYOGZTlwWIyxXk6D6yS8QcnjtOzNHEXTqbY0h3mcwcIbhLcOYI2T1NPYzeLMd5X2ej1/lb9/6MRq/ChftV4pjdiS7d1zVnpDknz6n7JbLNnJPnjvsPZJt5S9mh+1ei6J4ovHL/QkfBvaHwqTR/T8eZe03xpfs7ekDuFS3C6Hc5Z9SJDrJz88f0iAp1PDAT5wWod3Nfqbdzj+rp5rYfBPVmue3LTL2eO6lX9/jpHeOn23QmTk9nXj2EnxBf8zheHzqtT+DH2ZpoMV5Put8cwo/CuqLp9X+WFvBb8areul8X7Q04L7uZ3t/sGxM8H55P8yGe9+rF8GGaP3k5qJfD52HMt7LjPBMfhp/dmJ9vvnNewpGn03xGHsODbZnmss3B4+/e+nM6881zOvN+79fvfr90Xx3v1z967/mg+7zmQ/4Xt7yyOqJ5lXvdYde6o154nULtkjqlVbvwuqbmOSl1rSotV1EH1aUO1hqE1k112tRZrRNaBa3OyibPe67UZQlI67LUcd5DZUJpo3V8V93f9Z6w671i53vIrveW/Xvdf+i/ANCjCZtu1XwRAAAAAElFTkSuQmCC",
|
||||||
|
"eyesDizzy": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACP0lEQVR42u3WvY7cIBAAYCwXdMsLnOw8xhar+FXyCFuelNOZjaVsmTeKbF2R18BvQOnCgswwM+AiJEoUKT+6bY77FuxZGBhU/OZnVq/+p31X8Gnof4dtQ57aakiuuA+6VdyJhyo1ogdqt+ie2j0692ny43Es+AbDsGcKI42yGt2ndkjf2j49rUV36Y3RYkDpy7g36DNF6KBr4F+h0G3qEz0M21tyO6JTe0PXPAvoPBZtMzwbAziPDeg9tT14EIe/XrwH52fiOD/wu77jO78r3uB9I8dgfsE5hriAczP8Y74d/NPBXfFgDm6LbwcPqrg7OC03+TwWp2Ulvx3i8QNkMHvrm+zuCbM8edAz7BBxj1lObjD72RfXQ8Im37vGa/Fphgwj3y4GEon9PmFI5I8DhMSutYPVT+6vz2YWN8Z24n5rnPjJKKPZITY/kodTp/Sd3K1OPYo/PPTtC/m6LP4yiJ+HRfxl2h+Kv1+z3z8f/N26in88dX3xa3F9+rG/Kf7h4BdVfC7edcqJr+4kDvPQSJwwD53ECfP2RX6X9/tTdt3GSfw6bDIP8X6L7STr0vvzkNfxrLWsY2uvY173PP97p/L8R7ept0byxLZ5vdxzGkV55cxS8jBug+RhjFPOW4MnALnFA0ryv8GdwfnfQy/ZLyrnJ57QOT/htNTiO57m4r7kf1Ql/2mDseMGC//D+fObzuGfPf9rdaRWd6p1qlbXanWwVjdrdbZWl2t1vFb3a/eE2r2ieg+p3Vte73V/oX8Fk+c0j6ggguQAAAAASUVORK5CYII=",
|
||||||
|
"eyesDown": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAB1ElEQVR42u3WsU7CQBgH8H/ThLJIHwC1r+DGgAk+im+BW8+YuPoIvoIjk+Dk6MpAYhNXI3UBEkrrfd99X+vgkeiCQ1k4fty1R+/j/ofqx9cMrR/aC9hX4D5n1I6dcxsjdkgfcgPpJEOBlLx07ZA8d+2EXPoE9eVprPWNHUY9eRo8ykTkObdL/tYkfLWQPOM7VoYmxF9WRUA+czPMbNdSfgXIDfepcjusCJ2blNy1N+SRPAVyGUu2ieVpjKzL2JI8ce3ceqlu33P1xLpck8blI7nXHi/kXtW1vV8qc4j/4DKH6sm6NMvWW2/9187/bXH6b6t/Fmntd2+Nv1T36mVaNP4YLtV3eZLWfoW1+nYWTdXLDEP1NYJX9d0MJ+ofwFJ9a4Ke+gLdce0Ib9XnOB6orxE+p+ITnA7VV4hu1B9w3m+8EzZ+Vvs7usFU/BIXR43jm+PgvrJp1Mwf/f0e2+eDKJV9dQK7FrLfboGO7rdzYFC7QU99AYzZ7T7v1svt87xesv+79XXO68seunqQHOF6oByhflQ/kjtcP5Q7lFNUb5JTXG+cU8bVp+Ya1Sfnms1BvrbkINUz56AvN30568tlX477ct93TvCdK7znEN+5pT3X/UP/Ag/3YjiGSiORAAAAAElFTkSuQmCC",
|
||||||
|
"eyesEvil": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACf0lEQVR42u3WP27VMBwH8J+xVHcpOUAL4QjdOjyklJv0CGztFnMCjtArMDIVcwFYGZCwxIqoWfoi1Y35/bHjNJAODMDwnlTV7/Ns5xvHyS+QfvtxsPN/7RHwo+S7p3Yjzm3o2CH3IbeQO+WhAD35KG1NHqTdkuc+apqexqIPOIx6cgweZQ154PbIv9qWZ9Pknj1ZCsQ/pqDInUT32HXMTSC3csoBg0adT7Yntzx4IDcy5Sm5cnyqZEMjJ+07dB04xEguLR3QRy29RpxbekQTWnSTj0beSYKBPaeb3LfksUkS9BUKJ3NdbNgl6OS2zy5BJ8clJm9zjPfoOdgoPpi547fsErQ4LlR2CVocFza7BC2OKYpz0OL4pbjvZo6TFueg2Wn9inPQ7NSe+uvqYdb/g6ruj6pfQXXX1jwXtG+yW/NuOl9Puzw7qC/F7xztcnHcxdfFby2Y4gPsn0/Ou188wNFJ8S08UsU9PN0UvwEDxR08P6y+h0HFLRxP/g32Mag4wOlBdbql2Olmu+dGfFi6Fg9LV+J+4QrE3bOF257dns38Bqc/a8lH9QbgcO4vG/Ko577FmBeGfDBvATaz9dyLmjw0nwBOZuv/eFTkvv0McD67Xk+SJXf999n1wuu7Se4FusVj1euL+2GbPF4a/Lt1dT+kK31NDxd65NyF2f75mC7TQI63UB/rfvsR+xTJcbu8/lqd97aSZxPt+eL37/eFl/tl53/Xm1+vS/wDH0326TlPdeMB1znDVEfoP9Wd7FPdoXFUp/Kxap1KXKdsnrPWteS43vXLOohEdbNb1s3EddM3yzob1UN1ea2Or9X9tfeEtfeK1feQtfeW3Xvdf+g/AbKCHZJ1IQy5AAAAAElFTkSuQmCC",
|
||||||
|
"eyesHurt": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACWklEQVR42u3Wv27UQBAG8G8xwl2cFvHHjwEFuhNvcm+QdEFCwps3oqSIFFNR0lIgzhV0ZCtiFMdmvp1Zm/jiFDQgcdfc+ne7O3u7dzOL4dZXjb3/be8gL6fPDduFemxjHR3Wh+5hnWwoUNF7bWf0oO2Sbn3cOD3HircyjD3jMuIon9NDbPfxU1/G2TJ6EyMOnguKHw6do9e6wka69vYtQPexzxBkWJep+4qu7Zae2y7QbSytLWw31uI2tqeX2g7ifXJ5D8lLcZuT48LaYt3hncUaTiVeZWso/sBtDcN7cWv2e/9/3PH3uusdvdj1QM92vaZj1xF9PfdOvZh7wEtxn829dly/BfjNkdNbDTB5h5Lea4DJA6q4Dxpgcll9dA0wOXJ1DTC6TK+uAUaX6W2fY4DRuTnqMcDoMr15DJC8w8PkXxkgecAq+ZYJM3mNIsU9AyaXrHpufsyMbC6Z1W1t/Q2zqrlk38ML9euaGdlc2s+PzL1jylaXjPziRP3KOzlkdSbuV8/Mkcni1AM22EzufKZeo4Z/pP4D9+VJHQ8k8OjAJ6zoj/H0pn/BAf0Qb2761t+jw/Uzl58dPZ97q17OvVevhg0wrh/ufPB0OdroMa+qN/Q8bvqJuedRtJaH3wJH6tfiVczDzPPvgAvN87L/eTXm/888r+hyXgdWF+T5u0xqdeQYT7SOsN+lLyqrO2d4rXWH//OrZpXq1NZdWp2SutYNP1Nd+zZ8tLrGOlh+SHWw7ddWB1k3JWGkuulS3Vyqs0t1eamOL9X9pXvC0r1i8R6ydG/Z3+v+Qf8FVocQ2WNhih8AAAAASUVORK5CYII=",
|
||||||
|
"eyesKnockedOut": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABBUlEQVR42u2WMQ6DMAxFjRgYOUKOkqOR3ozehCNkZEBJ/W3TLnWlVlVLq7BgXvwTk8HfVO8+MzX+bb4RP51+L4hH5RJTFE6WA57IkkxKNIEXjXvwrHEAt5zuuj20zFeWIVPKEFUawLPERVZTkN168EVOrAkFyWLdOvBZK1w4tdhfEHiSnJpZtvXK0wSu8Qo+2C2AmxZsHe02InPTFvCgcWZeds7vvPPA3PaELkc76wHf7Kx64vMmq2F8gVsN9czcwvLvfLjxNTZ+DF60DQiXRhA+w9v9H5b/Qj95Ux9+tv97PuL5jutTnq95Puj5puezni97Pu75vjcneHOFO4d4c0ub6w7IL0FMhO6cZXtmAAAAAElFTkSuQmCC",
|
||||||
|
"eyesLove": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAB+klEQVR42u3WPU7DMBQH8BeMmgXUgaliKFsP0IExx2EEiQPEnIAj9CrhBByBHMGjB8vB//eeGw+4EhVSK9QudX/1V2L7PdP042egi5/aA6VPI79HlJfiXKaOnbQO3JJW0qZEPTxK2cCdlNdwrdPsu0fb5D41Q02eBreyLdxxOfK/ds29GfjII04WE+I/p9DAB5nhmKpGfQqCW64zudQsGHHbw6Xs4a2+Bbi2hfmlvo0uubaN8LWUXfKYPX277Ovk2ifauU7HOuBBx5re0ni9zmF5hOscpo/kWoz/29OSp8UXJyy++tBOaeuxR+o8ZbevMW099mB2jnp1WgXaiHv6HJtOPNKNp624o6eh2YkHWrzQSnykraXP7OaBbrOviJ7FPbb8tfiA8qbwReGP4nx4rnp2Pmt3hZvC7wunws1pnZ+Liudqj3ONS/o+ETYOe5Two+uF8JPXF33m9UVIy/uBQ5HsB36UvK847Om+wlDqjkOduMVQ6ug0788BQ6kHjnriI4ZSjxwlxR2iZN7naKvuMYXsFtFWPGAK2UdEZz0XGCq7Q3xUt2Z2T/M5Sodk76GZHWE2O8c4dcS4/XlsZ/dd4e+zh77wr9njucaTP4rDv43/tTxSyzvVPFXLa7U8WMubtTxby8u1PF7L+7V7Qu1eUb2H1O4tl3vdGfo3+S3L7VKZWUcAAAAASUVORK5CYII=",
|
||||||
|
"eyesMiddleLeft": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABpUlEQVR42u3WvU7DMBAH8L8VpG6EHUEeAwZEXqVvQDeQGGImXoeRAampGBh5AaRGYmCDTDSowcbnnJ0OHBUfUhmSpddffLbruDnDfnqVGHzT3sJdqvteUZx27mPk3sFtyDW4EacCBbnp4oS87uKMnNuo2D3lOm9cGrX00/BZekRe+9j4uzrzvSXklR/RapqQv2lbRV52M6xcU8O/AuTat7G1S2uTznVB3sUN+YhXgZxzyZqUVyN3zrmGPOvi2rkJ7j7r4Jlz7pPy6pzH+sJbHsteuPEKnkP6A+c52JlzDs3gv/Eq712teHYXvTF59Na+RX+y99GX1XH0uVpEX+i0CH6D8+jPSKbBJ9iL/gA1ZzcVtqNfY+eF/b3EZRH8CocnwbW6jT7B0Sn7UqvHafAxzg6CI5mt+HjFVfD9EnqX/RVbmPeO3rFxd/NHP3+o6TqfAP36+GcR1hP9eiIp+vXHyvqPinXPS3q+0n6Q9o+036T9Ke7n4f+e/t17+Lvvf6mOSHVHrFNSXZPqoFQ3pTor1WWpjkt1XzonSOcK8RwinVuGc90/9A8jSWjIB4EzpQAAAABJRU5ErkJggg==",
|
||||||
|
"eyesMiddleRight": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABpklEQVR42u3WvU7DMBAH8L8VpG6EHaE8BgyIvErfgG4gITVm4nUYGVBJxcDICyAaiYENMtGgBgefc3YycFR8SDAkS6+/+GzXcXNG8+GVY/C/9hr2Uu33guK4dRcjdQ5uQ67BjTgVyMhNG0fkZRsn5NxGhe4p13pl06ilm4bL0iPy0sXG3dWJ6y0iL9yIjaYJuZtNrcjzdoaFbWr4V4BcuzZNadPqqHWdkbdxRT7iVSDnXLIq5tVIrXOuIU/auLRuvNvP0ntinfukvDLlsT7xmsdqTu14Gc8h/obzHJq5dQ7N4D/0Iu1c9Ty5CV6ZNHjdvAZ/bG6Dr4qD4Au1DL7Uceb9EifBnxBdeZ9gJ/gd1ILdFNgMfoGtZ/a3HGdT7+fYO/Su1XXwCfaP2FdaPcy8j3G86x3RvOfjnivvJofeZn/BBu47R+f4c7fzRzd/qNk6nwDd+iCadeuJbj0RTbv1R2/9R9N1z0t6vtJ+kPaPtN+k/Snu5+H//lvv4a++/6U6ItUdsU5JdU2qg1LdlOqsVJelOi7VfemcIJ0rxHOIdG4ZznX/0N8BvkBoyHDCksQAAAAASUVORK5CYII=",
|
||||||
|
"eyesNeutral": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABrElEQVR42u3WvU7DMBAH8H8UqekCfYACeQW2DkUqj8JblC1BSKw8Aq/AyETDxMjKgEQkVkTD0lRq6uBz7uIOHBUfUhmapddffLFruzmj/vTKsPVNewV7Bc33nOJe4y7GyDm4DXkKbsSpQEJumjgkL5o4Juc2Qft4yrU+t2nU0g3DZaUReeFi4+6msXtaSJ67HuuUBuRu1lVAnjUjzG1Tw78C5KlrUxc2rQobTxPyJp6TRzwL5JxLNu/xbIysc64hj5u4sG7E7WchHlvnZ1JeMeK+vvCK+6rPbH8Jj6H3A+cx1HfWOTRb/5W7NWanNRZ/r5LWL1+8P9RX4iapvN+GU/FlESetn6IUX2TRRNzkGIqXCJ7Flxn2xd+AqfgiDXbFn9Adt47wQvwRewPxEuF9wn6Dg6H4DNG5+DWO+t47offD1l/RDSbsJzje8Y4Vx8Z9Zt9Kfvzor/MSiPz8YOjnEx0/nxj4+cfK/GO8br209dX2g7p/tP2m7U9tP2//73/3Hv7u+1+rI1rdUeuUVte0OqjVTa3OanVZq+Na3dfOCdq5Qj2HaOeW7bnuH/oHa6JiOJLpgNsAAAAASUVORK5CYII=",
|
||||||
|
"eyesNuclear": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACgklEQVR42u3WsW7bMBAA0BMMVEthrR6M6hu6OUv5Mf2BBlk6FCGLDF2K+geK5lfUJd7iX5ChwasMLzRA8HrHO9pLGaNB0GSIYSTUEynS5B0pwL9+Onj15/YA9KnkuudyI57KYJKD1mF3oJW0KYBlj1KesI9Sbtm1TnV8PLcl99SMa6ZhpFauZh9TOaa7rk1Pm7D3qUd0PKB0E0PF3skIe6oa9VcAu0t1cKRmYSLuLLuUPXuts8Cubdl8o7NhyLVtZG+lPJLH7PR/zN6S6zO53Wi0rwc8aF/4lfqzOobmEa5jwN/kWoz/ydP8qvN8Z+84etQBTl7xBIuHujfZ6XuTfbSxyT5aFnH6e5N9QzNo1b8hXaqvqCejTr357Evk6+R0H4NVn1scluLhEvGHEY8LeshK3NOj6lY8fDLYDeK7jhZ0qU4h6K7E987Gai3uKXLhUnxwJlQr8UNHfiG+BRNgK75zdYSZ+B20Hj6K79nn4vfsV+IDTAK8tcm/QzPCe/Et+1T8J/vF4/wO6l/wxiSfwbvPMBO/h3oKtfgC5vTNPq1PvphnX6c4ETccJ+Gcc85kp9w7OjYnDyY7LfstLWzyFqNFr78rhar8rlsuH8459Xt06ld94HEG8SWPc6frgr7CIOuyxr7Gva4juxdfsQ+67rzpHXTdeevTdffsO40Tdo2TQNum3WtcoatQ4ypY8hyH7BqHkXYnk+OW807jFlsHbY7za4Brk/OCPOfFB4AvOS9WPdXJeeSqYx5twuSUd2OzOZenpbwu7QPFfaO0zzzJPvZE+/C/7v+lc6R07hTPqdK5VjoHS+dm6Zwtnculc7x07pfeE0rvFcX3kNJ7y+t73Qv0PwhMG/HSVEiBAAAAAElFTkSuQmCC",
|
||||||
|
"eyesPinchLeft": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABe0lEQVR42u3WvU7DMBAH8H8UpG7kARDkMdjIq/QN6MbAEPNGjAxIhImRF0BqNjbIRIMabO7ss8PAgUAVBZEuvf7is6/5OsO9+2kw+bZ9AH2y8LvluAjuY1TeIWPYDWSQpAI1uw1xzt6FuGSXMVmannPJe0rjkb4Mn2Vm7J2PrT9qSj9bzt76FZ3hgvxBN2TsTaiwpaFW/gXYjR/jOkob8uCmZg9xzz6Ts8AuuWx9IWejIpdcy16GuCO30em7i16Sy5yc11Wy1gc+yFrujNarpYbiGy41uGtyCe3k/9eB9OC1Mf4JP2gw35N6npBjKfWQm9F33jpGx8a9nAOH4msq9+ozXwAn0Q3y5OfAsfgLeR39AniM3mCW/A7ZUty22E3X68HPGa7XAvvJV6aoo1/iNPm6PUrXd5mtkg/uOfm9ux3vh/ImeW+rbd8Pf+V52dB7+Kvvf62PaH1H7VNaX9P6oNY3tT6r9WWtj2t9X9snaPsKdR+i7Vumfd0v9FdjPP/LItpYaQAAAABJRU5ErkJggg==",
|
||||||
|
"eyesPinchMiddle": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABhklEQVR42u3WMU7DMBQG4D+K1LBAD4BQrsDGwFCOwi1gszkBR+AKjEw0nICVAYlIrBU1C63U1MbPfs9kwCBQRUE0S1+/+NmvaZJnuHePBhtft3fwRxG/txQPo4cYo+DgMeQaPIhTAUVuY1ySmxjX5DymSNNTrve5T6ORoYyQpStyE2Ibzuo6zFaSt2FFp6mgcNJ1BXkTK2z9UMu/AuQ6jHHGp3VldK3IYzwnr/gqkHMu2XzIV2PknXMteR1j492K+08jXnvnOSnPjHitD7zjtdyZX09xDcNvONfgbrxzaDf+fx1ID14r8U947SYYFGOu5xj721LnBFs9P+o5eo6V+4t/Kyn2S2D3M58BlfgVcCi+AAZyne+Ag+QaO+L3wIn4ssGe+BMwFbetn5N9huIh/Y+nmIkvmmqc/Lqcii9NrZLfugtxq7q3++G5U+l+OH9c+/3wN56XFb2Hv/r+z/WRXN/J9qlcX8v1wVzfzPXZXF/O9fFc38/tE3L7iuw+JLdv2ezrfqG/Ar/2+7GXAFZTAAAAAElFTkSuQmCC",
|
||||||
|
"eyesPinchRight": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABf0lEQVR42u3WO07EMBAG4D8K0nbkAAjlGHTkKnsDtqNAIuYEXIWSAkE4ARdAEImCDlKxQRtsZuyxQ8GAQCsWxKbZyRdPPJvXGO7drcHaV+0DaMvCfstxEdzHqLxDxrAbyCBJBWp2G+KcvQtxyS5jsnR6ziXvKY1H+jJ8lpmwdz62/qgp/dly9tbP6AwX5A+6IWNvQoUtDbXyL8Bu/BjXUdqQBzc1e4h79olcBXbJZesLuRoVueRa9jLEHbmNTr9d9JJczsl5XSVzfeCDzOWOaL5aaii+4VKDuySX0K79/zqQXrw2xj/h/B42mG5JPU/IcTO6GX3jrWN0LN3dFNgRX1DF55/5DNiPbpAnPwH2xF/ID6OfAo/RG0ySXyO7FbctNtP9ekB+Ee/XDNvJ56aoo5/hIPmi3U339zabJx/cc/J7dzU+D8d3yXtbrfp5+BPvy5K+w1/9/mt9ROs7ap/S+prWB7W+qfVZrS9rfVzr+9o6QVtXqOsQbd2yXtf9Qn8F3gkAZhfTUgYAAAAASUVORK5CYII=",
|
||||||
|
"eyesSleeping": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAA/UlEQVR42u2WPQ7DIAyFHWXImCNwlBwt9GbpTTgCYwYE9bOdTnWl/ijtAEtePmxwkMIztYdjo85/zQvxGPQ9Qc/KRdMinCwGPJIFWSrRCl5Vj+BZdQC3mOG+PHKZ75yGSClDsuIEnkVXmY1BVhvBk+zYIgqSyVYG8E0rTBxa7SsIPEpMy5xWRuVxBVe9g092CuCWC7bPdhoLc8ut4EF1Zl4Pzs988MDc1kReXmyvJ7zYXu3C+61Ww/wGtxralbnJ2nnnZ3Oi+w+fDn0G7+ff+Sf8S/fwq/e/5yOe77g+5fma54Oeb3o+6/my5+Oe73t9gtdXuH2I17f0vu4P+Q3tn6K1k3T0owAAAABJRU5ErkJggg==",
|
||||||
|
"eyesTear": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABsElEQVR42u3WzUrDQBAH8H9YML1oHsCPHHwBbx4qxJuvIfgQesuK4PN49Nb01FfwIBjxKhoQ2kDjrjv7kXjIFALFemgunf6yk51s2sxC9x4Ftr5pb2COyH0vKU6c2xiZdfgx5BJ+kE8FcnLlYkFeuTgl92Oi9vKUa7w2aTTSlmGzZExe2VjZszK1VxPkpZ1RSyrIntRNRF64CkszVPm7ALm0Y3Rl0hrhXObkLq7JY78K5D6XrE78amTGfa4iT11cGVfBzWcVPDXur0l5VebnWuGNn0vfmvlyX0NiHGgXrgzxX7i5lxsstJ4a13pZxBOtnKsS4+ALRC/BvwscBv8APoMvZbQX/Bmj69Yh7oM/4eA0+AJilnt/xNE4+BzxXfAHnO13viM6P2n9HaNo4v0S57ud45dj4z43/5aufvj6N/jc7eHqcb/tQb5Yk38x/rYmf2V8OtALxiXneb8j63WFtNcbxmuR9DtmvV7hgvErxo8ZF2vxGvEgb5AMWjfTOVY+R+49PNCHvv+5PsL1HbZPcX2N64Nc3+T6LNeXuT7O9X1un8DtK9h9CLdv2e7r/qH/AE7U1rlxChGvAAAAAElFTkSuQmCC",
|
||||||
|
"eyesTiredLeft": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABiElEQVR42u3WP07DMBQG8M8yUjZyAAQ5Bltzld6AbiBVKOZGjAxITSfGXgCp3tggEw1qZONnPzsMGCQGClK69PUX/3nN4M+wn35aTH5oH+A+IvzWVJfBfY3aO3gMuQIP4qlAQ25CLcm7UFfkPEak5Wmu895No5G+DT9LFeSdr41/qiq/miTXfkerqCH/0A6CvA0dajfU8L8AufJjbOemDTK4ashD3ZMX/BbIeS5ZX/LbqJ3zXENehbpzbqK77y565ZzXpHldzXt94QPvZW/cfg33UP7AuQe7ds6lmXzyyf+HA+mg1LH+Da/muDrnfvaQ61Xsc475BxfRz1qoE/ZXHGE7OkbHwd31j7F/iNU3Xi6ASz5XlwpyFc/bW+CC/dp5E/0OeIneomA3xSPEls/5mcZxOv+f/Zrh/F/gNLrcqbKJOXKPJeeIlXs9S7mzFTvOHSsG+5Zy6sluYk4pWz2kXOtNHXNNNboec1CkHMzlZi5nc7mcy/Fc7ufuCbl7RfYekru3TPe6P+jvVlI6sc0WsN0AAAAASUVORK5CYII=",
|
||||||
|
"eyesTiredMiddle": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABjElEQVR42u3WMU7DMBQG4D+K1LBADlChXIGNgaEchVvAZnMCjsAVGJloOEFXBiQisSIalrZSU5v37PdSBgwSAwUpWfryxc9xM/g3/KdXjcF37R3oyuJ9w3UZPdSYBIeMYbeQQdIKGHYX65y9jXXFLmOyfnruJV9RG48MywhdtmBvQ+3CU1uF2XL2JrzRW15QeOi7jL2OK2xoqJN/AXYbxviW2ro8ujXssV6xF/IV2KWXbVXK15iQS69jr2Ldkjt1+m3VK3KZk/vaibzrC+/kXf6S3mdkDeUPXNbg78mldIMPPvj/cKDfKButf8Mrv8AoN7KeGxyNdZ0v2Mum4mc43d86Pjh27gtKne36Mf7Ol0ChfgucRC/9GhjpvvoAHOt+u7Y4UH8EztU3NQ7VX4F5cNrnXUNzyj6/RPbU7/8XWKqv62Iane7v8rnmyKatTMgRHjfz15o7znQxdzin3jrT59TVs+SUjVmkucaZFHItlYOp3EzlbCqXUzmeyv3UOSF1rkieQ1LnluFc9wf9HedzO02a43rNAAAAAElFTkSuQmCC",
|
||||||
|
"eyesTiredRight": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABjUlEQVR42u3WsU7DMBAG4N8KUjfyAAjlMdjIq/QN6AYSiJg3YmSoSjp15AUQ9cYGmWhQg43vfE4YcAcGClK69PrFl1wz+Dfct58ao+/bO/iPCr8N1XlwrlGyQ9aQa8giaQUqchvqjLwJdUEua1R/e+r13vo2WsljcJeekDdcW76qC75bRm74iU7TQHzRdYq8DhMav9TKvwC55jWu8W1dFlxX5KFuySfyFsill6zN5W2U3qXXkhehbrzb6P67iV54l3tSX1PKs3Z4J89yN/55lcyQ/8BlBrf0LqUdffTR/4cD/UZpYv0bTvNMcXEi82yRLReDT7+4im5r6CPxNxzgaXAMjr27nx/D/FCLXU776gw4l311q5HNo98CZ+If3q+i3wGv0WtMyHmff4Rayz5vDQ77/f8F2X3c/2c4Zqcc2ej8OubIHJeUI5w7W3Pa585abSh3OKc6997n1LN74JziXCtWfa61tuRc4xw05ZCDKuRgKjdTOZvK5VSOp3I/dU5InSuS55DUuWU81/1B/wSObTqxus+kUQAAAABJRU5ErkJggg==",
|
||||||
|
"eyesToxic": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACF0lEQVR42u3WPW4cIRQA4EeINEUikS6dSYrIpXMASxzBR8g1No0HKwfYI+xRvJYLl77CRKnSIaUZSxjyHjx+ipCVo0ixFW+z7LcwPBjgAfGXnz08+792D/gR+fdCZZU9lcEkB65DboErcVOAmTzksiR3uazJuY6oj6e26Cs2o5opjNTKTuQulUP61+r0NEm+pB6jpYDSn9EL8n2OcMGqgUcB5DbViQ6beZndzuS5vJJPPAvk3JZsVTwbBp3bBnKdyw49FMdvV1yj8zOpnTPc12/cc1/xAvubOQb1B84xxCt0Lob/1NO7Yad3U9zRumG3svle7IoHeN3cwllxDy/mzk+ai+YAb4uvAJfFQ9oV2R3tiuavOv90qL5Puyj7QrvokKvpovrmtLneXlX3553fNg+HPejtdY3Tn7dxqeMv1T+fduP92MYlrG7ztpnqvEncz/W9bHR9L3Jf38tl8/vedwuYb9l9xCnR7Fs8KIrPeIwUl/cf4k32VX8/CSZ7AHOMLZI7cWcWxf4Gz6f37NYEUfwIgvjK7ianVI1Tb3+UOMHPu7oOu/Vp2/rc3UIZlw8bqP5SLrLE+U7DEceJQ/S4ULKDWqCMC1dA83mtblPP+fkT9cx+TT1lDxTd3Dx2vha/6dx0/rTPjb90Dj/0/B/lkVHeGeapUV4b5cFR3hzl2VFeHuXxUd4f3RNG94rhPWR0b3m+1z1C/wlHT0r16qhmxgAAAABJRU5ErkJggg==",
|
||||||
|
"eyesUp": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAB5ElEQVR42u3WPU7DMBQH8H8UibBAD1AgV2BjACkchVuUzUFIrByBKzAy0TIxsjIgUYkVQVjaSg15vC+3DA0IFhjipe4vfrYrv+YZtLKN0Plfew1uiX0fS79nrn0U6vAx4iV8kIcCQbyxfipeWT8X9zHJYnqJZZ9xmIzUbWhUmYlX2m/0aZnrbKn4WFekUjakD6lOxEe2wzEPbfxXQLwM1PBUFYfV8snPyyBO9FYHmolnROdPvLw4x97RhRo/a0LNcxbsHHudvlIjntN7lQeq2GXuY0xtjZzmo2zIn+wZNWPsk8RVBU2RPHKc+vsI29FfgFf1ukfzMtkkOuH1Aj1gfUB1zxzpWfR7bO1FnyK9De5X2Nk3z2mC7DTQDTvRJQ761ERfS5e+u/BnrCdD9yMcbiwdnxx/7hPOquX+0f/Op0AW/Qp8Fu5zYI3c74G9hZfYjP4ADKLbeZnrebnb+Zrr+bprPrhrPkSX/HHX/Iku+eau+RZd8tNd8zO65Fp0yefo2tz1z9N5553/zHv+xd6r2upfuNQJbfae1+bv/9We+h68RmnBy63uqFvdMS+sTulaVqes9hVW13ROr2taVoPVQY31Oqg1NHxRN9vqbFtdbqvjbXW/7Z7Qdq9ovYe03Vu6e90/9A9mtWI4APcpSAAAAABJRU5ErkJggg==",
|
||||||
|
"eyesWinking": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABYUlEQVR42u3WMU7EMBAF0G9Z2lBtToByEIpci85eIXENbgKhouQKOQASpiGRCDYee5YCzSAFEFAkzc6+eGyv480YSbwGbP7XviBfpn4fKW6rlxh9cXAbcg9uxKmAI481tuShxh05tzHv3VNu9jmnUcsyjZLlG/JQ4lju+q70ZsnHMmLyNKFyMy2GfKgzHHPTyL8C5L60SSGnLba6d+Q1nskbXgVyziWbW16NPjvnRvKuxiF7PHr+DEfvsnOflBd6HusTX3isdMjjOZ5D+wXnOaTb7BzGzb/l5RkL/rQ40e/TlejX9lH0c0ySxxFnkr8OOJX8xZu96LCXkk+wd07wZzQXsu+s5A84MTeigx18/bZ/nD+sW+ET0DhxPbGT1x/7Nc9Le77aflD3j7bftP2p7eft//5z7+G173+tjmh1R61TWl3T6qBWN7U6q9VlrY5rdV87J2jnCvUcop1btnPdP/Q36EeCwIlHlo8AAAAASUVORK5CYII=",
|
||||||
|
"informationAccept": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACY0lEQVR42r3WTWrbQBTA8adOibsIcZcuGJQjuHTTRYh6lEIvEMgBNLtkEUJP0FxlTIKzKe0VRF3IVm43ExBy51vz3hvTVeuFMT+E9H8zEhbsix8F/8rXB1we8GVT9vO66GNzVfThcl103fVF36mzpuS/1Uld8q0UVyV/hOq+5LcAFyVfAixa7uN7gKO64BcAYsZ9MA733HVnfMV9p4wvW+ZbafyE+xPYD/eNc37+G8sV94V1wdyOC8DnsuMCzJkPH63z9dF2LGiY76TPp74N+dQ3IZ/6t5BP/SbkU1+EfOLjKuQT92Px+3BQIZ+4liGfuBtXcN/GTOKbmEn8a8wkfh0zib+OmdjH05iJ3Y1bcXe7KLg/y5iPfZfysf9I+dgfUj7265SP/XPKx75K+cjduIL78CHlI3e7OOf+POUj/zXlI/855SN/mPKT34VxK+y6DrsosEubdzrlB9fiuxl3Wv3osnk042b53rXonsx3lu9dnoPxPst3roWCT8Hz/xd1BnC533dZvvO1uW3e2Z9TvnN74FtzlSwz+Zv9Ps90bi+48GM1udvwY+9t7oPzIc9M/rLVeaZze4ajts8z/ToYedF02SrH9TFHOp8zrxqV53s3VNUyz/duT3GH8r3blC8of/JjlB/20dgrlO/dLQHK9z4Gnx/wmr4/BG+oSwCcH1wB4HzkFfMOAOcH72l+vM9pfvCB5iNvmI80Pz5fND89dyQ/d1FwRfKjdyQ/ek8yc28Lrklm9IFkRh9JZuaz4nsjyUwu0SpPrnB+5m3ROyi/r/ZV2bU44LOyD/Oyj/X/et/+i/8B3hwL9ySzr9cAAAAASUVORK5CYII=",
|
||||||
|
"informationBackward": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABFElEQVR42u3WPwrCMBQG8Bcj/gGhg4tbBAdn8QB1c/QQHqS5gUfwKNYT9AqCg6tjh9LaphGbl/eGgg5CAl1+lML3pcMHFXlS+LprAIgJrxkU4co+2Jf1++ceDsGDBw8e/P/9CeZokK7fWt+BID2uruR3AO6u529/uF5YFhnt8uR6+XaFclkfxci19YT2Gfa09QXuzQbeYLeBt4wfsdsi9tht4Ax7G1icGFfe/RofxJ7rbg0dN4GHjE/8/8cUMfXdBJ77bgKvGF/7boo4+G4CRz12DjC7qCkiITxlvAlc0S4or4uQlOeM14HHjEeUl524zj7kXH9qQJ6QnjJ+A3qXPgXjkvac8WJMexkxe1j19MtPd7jrL3T4N1ugBC5lAAAAAElFTkSuQmCC",
|
||||||
|
"informationDecline": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAChUlEQVR42rWWQY6bQBBFizgS3oGl7InGByFZ+VigrNjNlYjkgyDnAng1LQUxaXdVdfNraM0sMr3x8PTH/g1d/0Ovu2uk/8v/KnhBflf+B/mk/Dfyayd8QP6rFf6tA140/Lk+tVu+0jPz5Wez5QtdmLv+ecsdncWvCITPdGJ+E4HwiY7iVwTCR/rK/gYRCO/pC/urRSCciDewfhcB85WIN7D8EAHzxfML2xcBc+f5me2LgPnsL09sXwTMJ395ZPsiYD76y+BvUAFz/2vsr1YBc38V/Hn7Igj8YT/48/Zlh4EvgV/YPm8gcBf4me3zBjb6E9snqvD7j2yfqAE/D39D+KMF/w9/deAd7Nf/f7BPhPfH/16wTwXeT6KS7R/w/nvA9kt8Xv4Lkv3N8/Ur2U/nIews2k/n57GS/XTe0sLzGVeB5zmuA57/uEqcl7gqnK+4YL5eE4d5lA1E+5GPaD/lA9qPfEb7kTu0H/mC9iNf0X7KN7SfeA/2Ex/BfuIT2E98BvuJO7Cf+AL2E1/B/iafwf77PPc9ud/N+cztK3cfcvdtyNznev+5yOi+eY48um+fu+v3z8k9c65umXN4zZzbIXPO6/25iPbNHEX7Zu5cvz+n98xc3zI5cM3kxrDh25ypyQy25BjbH22OSXBONvckOGebkxKcjkyuSnAuZHJYgnMlk9ua+2RyXoOzx16IuT9ij8Tcn7B3Yu6nDWx6qtThMD1VqcD0VKMC01OtCkxPdSowPaUC01OFCkxPHVRgeqpUgempSgWmpxoVmJ5qVWB6qlOB6SmdH9NThcaH6amDxo3pqVLjyfRUpXFmekrfG21PaUDantL30v5j77G5997ce/KnvZ//A/4SazfzAqDCAAAAAElFTkSuQmCC",
|
||||||
|
"informationForward": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABLUlEQVR42u3WMWrDMBgF4BcMngLtqE7uEWpygOQoBQ89hj1mKKRjtl7FQ6jHXCE0F4ibxYNRa8mWFEsvQ4YsxRo/hOA9fiHhl64Sd/Ccu1ze5m3Cvdlwryvu5yP344L7V8r9XXDfznPqIqYuX+Il9dcoYd6uZhvmTYE987pAxfwMZMy/gZT5DnhivgYE8y3girjwR8AFdi6fgYh4u+o8IV4CrgjnXQ1wgZ3XHeMt9B/lWegH5WnoO+Ui9LXyeegf2vPAFbsirEvtNrB1VUMX+DNwvd8WYb3Rbouwfuo9u+IL3w+9p76XvQvfi95NYN9j34FREcbl4KYI4+3gJrDv5goYb4xXYz8Zz8Y+xMVDzR2zK+dEwTyrzWzOJ5988skn//eOG1y/hPld/+GX/gcqVSYNBdilYwAAAABJRU5ErkJggg==",
|
||||||
|
"informationLeft": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABAUlEQVR42u3WMWoDMRAF0CEu7NKQJoUxvkOaFLlbBGlcGO+VhHWEXECq3ArSTCFG3saS1/xfbBHS7JQPIX0hhpFUWF4WX/xP/Uo8EP/Gbq/Yyzt2/cWeiIcf7AM+1/bYyyd2zdhTxB4c9kGg2w57+cCuGXvy2IPDfhboYxzZyr26j3Fk0/yruUaRdXvR7slJr5fuQbCfsNsb9nLArh57kkk1vxA/Yrct9iLY1WHPZL0n7mauZ/urzMtfmZN7PQdqnokrcSNemTvikXgmrsSN+DTQQ3+NgVao7yLxTLwQN+KVuSceiWfihbgRr464Jx6JK/FC3Fbz5hSda9flP7D4v/kNWMQjUDSyRnEAAAAASUVORK5CYII=",
|
||||||
|
"informationNoGo": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACvElEQVR42rXWMW7cMBAF0KHXiIoszE2XAAboLrWR1gjducwhfIHcQALcuNsj+CpCYMClryDnBEqnQlhlSM6QHJLukq12H1bSJ0VyBrbmZ4R/75Nq+gLQtXyAG+hrx7+buat9AlCbqh3wo2db+upcrbr02TnYh9In791b6YN3WHrpp8BwY6Sv5FpLX8i7F+kTuXqTPpLDT+kujnYPueyFu7/6qy5s7i6m9qk+mtzdHay/7NMx98VNso919ZL7TO9wgdv73DG+Cc8ZrnMfw+23TcHnwkPeX7DPfYBd8Gc47zOPS+cRPtjkJz8q9znAzggPjz1dgXpKjsMN07XegjoKp9eD8/qafGH/g/N0l3wGWoC/0e9zj/EBviWfUnyA64Yf0L8kH2lYGH8fJk46xr8ME8duOP53OE8+0DRg/D5MqHSMv8FZcp6eZxzfcGYrf8TxDSp3jt9tY+0YX+d+Isf4Bt0kVxzf4unxVLqLL30X4+OcR1/JXXz0Y+kuPvpr6S4++o/kXYyPa6B0H7/hPn7uS3AfH3/cJdcxPl78tXAfv+E+fsN9/NpD/NpD/NpD/NpD/NpDfBp85iG+9C7Gpx/ZvB34SNHCKX7lFF/6LsbH9yid4ldO8XP364rio8v1SfFxz0qn+NIhxqe9GffFSiclitgvCx9Z0vuZ994gfYJYCWy+r0c+msJ10ePJmjtm45OV9ib7BZ+sq/Q9xxfuq5elyqEK72ufQ5nKjszkigviTpzDHH8MeeO5zScoHY3JNU+PFnWB4m/0JbnlYRlRd2J8sKJOxfjQt+oafynrIEhPdZPGXdVZGndVl2ncVR2Pq66o+2DafQLYdl8BfbsPgXbfwq+t7HPS65F9Eeh2HwWm3XdB3+zT+LFlX8erpegD42OLvpFnoegz0+1lX5o1sqKPhVYf+27f+16f/H/687+bJlUxAa4nQgAAAABJRU5ErkJggg==",
|
||||||
|
"informationQuestionMark": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABoUlEQVR42s3WQW7DIBAF0KGuyiZKLhCJZa/QrjhOt80Fam7QI/Qq3mXZKyDlAl6ysNwaiAIzzFSx1EjJIlKeLPLBwwD8sJ8B/t8BLOcjAHDuFjetTwAq6NbjMHZo3S+ux77xODx8mMYjg9lRn5PrI/UpuTpRD8nhQH3M/kLdZ9/3xIfsW0vcZdeGeGboPrHPZ1dH7DG+illPrZv4Jwfs8dE+hnptXKXvF+zLdHUabd/4LqXdsO5g0yP3uRYcPDZu088n1j31IcaP/mA5HxnPsTrWA3UXlyG6WuVT6935NVzr+i8P1EuVrvJRcC/4eVkbd4ID77Pg06V1YA+Cj5CXm/oSv+N8ENwBaM4hVy/1uXQy5DG+ZTxcpou96pTI/WVa2Et87CU+9hIfeRUfeRUfeRUfed3oa6/iU+84H0p85K7Ep27486gcSMR7wYVzTXE+V/GJ65W+43yqpnWl23vym983bu1e8+6UcP957/n3uxfWbcv6cuYY3tWXcL/6XuPLtnsT/FlwfU8+CvtF8iDsl7ByH81SnVft5Ko6kerqJvX8C9BZnroLD70HAAAAAElFTkSuQmCC",
|
||||||
|
"informationRight": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABD0lEQVR42u3WMa4CIRSF4cvDxFdJa2HCFrCzm8INuQPsLHVJJhauY/I28KKNVhrBqwbOKSjshvIrmD8MAyM3OPYy+ODf9ivxf+aRuMd+dsSP2E898UB8FrFPPHbrsJsjdumJB+IaVLoGla5BpWtQ6RpUeSA+jW/fy3P8iAYlX6uPRIOSb3Wei4jZvH0nH6MnHsD8j5GDas9Bteeg2nNQ7TkIeCCegoCnIOApCHgKAi5/xAPxRcS+Is8l81vSMyb9k65tfVZkPQ9t78uS9z7q2vbPnOy3JfENduPB9/LKKc89kd+I3dywW+KOuCfeEcfns+ZUbok74p54JE7uC0N8TNy13Tv0nmq8B4f/hMG/7HcdRCwW5RggbgAAAABJRU5ErkJggg==",
|
||||||
|
"informationStop1": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACf0lEQVR42q3WvWocMRAH8BEqtotSurp9BncJOdDDuMgrXGGsLVIG+5UEgbjLMyy4DxvSbIhYZfT9cRpwQq45+BW7/5FWowE7/Gn4Vwf/k70fwefeTaCn3ncQ7u+59y085673Nfht7zokuel9Uf7vs+o8/n+VrR/Mv4C9zK0brv17fzy1vk+L98tz65sIOc93ra+n4Kfb1vU5uLhpfbkEn2IBySGuD48FRI/xSwHRU/xcQPQUPxcQPcXPBURP8XMB0VP8XED0FD8XED3FzwUEz/FzAcFL/FRA8BI/FRC8xE8FBC/xUwHBS/xUQPASPxUQvMRPBXiv4qcCvNfxYwHe6/ixAO91fCzgY/ZT7afi59rfFH/3t86ML2nvfbIc44oDz/tWu7Bf0GeLbmqf7Qu6tIu0R+3S/kRX/rTWruxvdNwg9MfaBfqvQ2wS5m+VH3xnhpkJXdRu2MYM3/kuYap9B42+MeffGwd8ygpGAq/dEH5411eunAsN993zlQ7+0OWRW/Ym/2zGLmx29djsyxK9XU9u16GD3ZI3+wJyT97sIwiTvNl34MmX9rtihAPl93Hden+I6z901vtb535/W7+49w589+6+k8Y/HC4/Jtpaf49nGP2Y1+45+NHikXG3T+vKu7ry2e0LuHPRurD4fYI7R0t37nBFYTK9gz+hsL7yXFP9geonRP+h+hXV36h+SPVPst9S/Znq51T/p+4L6n6h7iPq/qrvu09qfD8CcZ8y4v7lxH09je/3TYzngXUezw9ajueNRY3nEyDmGUbMP5yYl6bxfBXjX81j6zye37Qcz3uLGs+HQMyTjJg/+fW8Gtbner4N6/PaeZian//bfN75HwXO6JISlEzrAAAAAElFTkSuQmCC",
|
||||||
|
"informationStop2": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACbklEQVR42q3WsW7fIBAH4ENUZankNUNVP0P2KH6YDH2LmCiVulTKKzE1r2EpD1C6ebCgBxwYMCdVbbyQ/yfZ+Z0xcOCHl4F/dYjX0rtLPvd+JHrpfYcpDK+92/Sch9635Le9m5Tkpne9xuHH2jmNP5fWnUjj29z6IdP4+6X1XdH42rqd6L6H1jd6rrtt3eQXedM6xS8FZC/TQAWQ5/ilAPIcvxRAnuOXAshz/FIAeY5fCiAv8XMB5CV+LoC8+rpSAcnP+LmA5Gf8XEDyM34uIPkZPxeQ/IyfC0hexacCklfxqYDkzeKIBUSv41MB0ev4VED0Oj4VEL2Oj3d/LT7X7k5f3stdTHqo3nc4AJQV+Huq3cId+gb4W9a+wWd0A6sBUbuBT+ga8A+oXcMHdNw20B9rt+gfhZ2M3+4rF4dy0skd3dYu3eTkoQ5l/F678ljaMbngXxr3+JTZS+OP2iXjIvpycR0cX+tz93y9JH/q8pipeJN/k2O3UFw/NvOykrfvE3fboXucPvJmXrxR2Zt59FZmb+YdP2nytf2uHOOe82d6b70/0fsfuuv9V/A4v61/D/934Cp6+E4avxMhPyaaWr8HCC62uXsOfrS4ZPAY7FxH1xffwrz4sC5atxCWXlhHa7fu8I36Xfbu084x/+d65/YTZv/h9ituf+P2Q27/ZPdbbn/m9nNu/+fOC+584c4j7vyqC/i2js9HYM5TwZy/kjmv1fh8pzsv/cA2j/sHs4z7Db2O+xNg+hnB9D+S6ZfUuL/K9/X92DaP+zezjPs9vY77Q2D6ScH0n/Lar8ZLXfvbeE1/2w9z/fO79eed/wEyMn3kewrZowAAAABJRU5ErkJggg==",
|
||||||
|
"informationThumbsDown": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAA+UlEQVR42u3W0Q2CMBAG4CM8aEzMjcAoTOE87Ty6REdhhD7yQKhSUCm939AIwRjujS+XtPyUA3JiGdr9h90QlZJrokJyIuIUfyBb6ioP/Hy5sPFOgZ+uN9a9q0k/DVVM+kUf9TPo52/6j5R9dhXmMOrPgWeJTsjVRu6WcIa5LXa/5Ua+cs7yOSlgnplb8znOd66A18CdsP9uzjgdv1/+RBng/cKHaO7ZeJ74OWnjueSrfo+3wJs4f1/tc/Oxszi3R8M4cA3cAK+AW7BunejNEOZcb1+xTb5Tcj7proG/r0Kvkl2JboHX0MtVvVnIW+AO3Bd0o/b/sf/yO03ytM7x6NfjAAAAAElFTkSuQmCC",
|
||||||
|
"informationThumbsUp": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAA9klEQVR42u3WQQqDMBAF0C8uLIWSI3gUT+F5kvO0l8hRPIJLF6I1KnTa/AEDiosasvExxOQTRjHS4XH5Ce4td6T5gIp6v5N3hzs/V6t4o/qY5F5xl3HHPj4gp96jSPIOJslbxRuU1L3iTnFwH8DfOznNp8dnIend5DnxFmFY6R7TTVu8lO7CczN7IR1hi372PHIXuwlz5vUIqz/q2nSLQ/r9+TIN8ake4PXUD6j/2v8NGURqsWv1P+tLtzt5dZKn7pPmYNQ8sZfbkzzxnmieU7dqbuYkLze6cYj7UnAvYpPeihi++gz5YokbtcmdaM1Rn7z+x/7I37QxtM54FQn1AAAAAElFTkSuQmCC",
|
||||||
|
"informationWarning": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACT0lEQVR42rXWPYrjMBTAcSkJ4wkMmJB2wUWKnGErlylzne3sqbbMEXIVHUVH8HYqhLV6evrW8yyBHRcJ/GKD/c8DP2bIQ7Bv8IF23dGu9ht+pn05vuby8JqL3UT6vBtp57Qz9qRdkr4yeSedL6RrvlwpV3t12fAz5UunTxt+pFz26+EVF4NJQTOfrY+Uj+aTcmZ9oHwy4tn6Cn6n3N4q4Rr82rriNsVlw8+tL3aa1YnwLg+aXHZyr98J78WfFDS56OdfawyafB7mHylo4R+Gt85G9jbFoJlP1mPQ6DYn203i0bqxHoNG1+jX2m026zFo7efabU7rMWjhbFLH2mUHHoMm78Fj0OiiNzMz62Gq3E6n9Ri0dl67nU7wELT2+Vk6TCd4CNr4vXSYTnB5K10Fv1TO0UPQ4DCd4CFo48fSbU7nIWjjh9JtTuchaHCbzQh7TyFo47x0mw3dB23cT6h3yOb9QbufUO+Q0/std8WD+wn9h0M2I+HDB239mDtkQ/dBWz/kDjnRfVDvc3IMGnwIbgpnyfmQO5ykenfpM7nLZjSe+ajd/9P35Dp/q96Sq9wvmfPsrZ35kvsp82xDUJnjEym3V6j3zLt0FQZFdzmN/GliUHSX04gPE4N6dwXmNxODojPvUwzqfcQ9wfln9LXw+ZEcAb9cUOe69Ftwn9O7C1p6Curc5wwzeYqOOSVPQZ1jzvCzC4qOixt2xsl1Lrp8BdQQ1DnmjC9cCPels6HYJSHoV+5zpoXhga5Zdfze8NuGd//X19r70KHy8Zv28Nz/AgHnbGIis7BaAAAAAElFTkSuQmCC",
|
||||||
|
"legoColorSensor": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABAElEQVR42u3WQQqDMBAF0BEX2dULtOQaXRQ8V6E06Ql6JY/iEbLMQmKdVCw1f0DRUhADgryFmD/jRGrhqmhVb2hYxSI3w5Ofm3OXY7dkxl6bmBFn8xi7J1LIa6IMedWFjNx2boBzUcrUA7tOvemLOHbPrqa7Y89Tr9mz5V5R7jiI1IsGuw7ILV0MB5f6WfBrrHDq5k9etjTDpRzk3HDOa9VR6pO5/dZQVqO+DaQ86vOW91siP9ywH+/YTwG7nunS+whuu32h7912OZgZ80GaJ5JLc8nFMk53ae6FOJa+Pc7VOMbAvH3fp+7V9s6dlc5lXrq/dt9994/3/0WL/Tf/5y+oIIpSoJDd5QAAAABJRU5ErkJggg==",
|
||||||
|
"legoEv3icon": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABgElEQVR42t3WMXLEIAwFUHlcuPQRfBQfDbqkyCRX8lE4AiUF42SNEEh4f5FuE5fPuzMIjPTp++lz0Kt6oMcz3f24nO7ui7ubF6Z99JN9Gz2zr6Mn9mX0yD6PHtin0Xn5RKP76m7wylKA+Cm+Wc/iq/UkvliP4rP1ID5Zl+UTWffNnfHGtYDqZ/dNe+6+ak/dF+2x+6w9dJ+09+UTaffKnXLFXAD7qX3rntt+xVoAe2r7m2oB7LGdR66/YA/ap+6HdurujbvmZHwXP61v4tn6Kp6sL+LR+iweisdr6bmeQPGj+PWWD1rcF7/eulxPoDgf99vjD3uuJ6D8i577J/CPX/o7cH9zP7gz9Xa3fc+rtvQ/HNWL9gft56s5+j7R94y+f3Rf0P1C9xHdX3TfYX9A/QT1H9SvUH9D/RD1T9RvYX9G/Rz1fzQv0HxB8wjNLzTv4HxE8xTNXzSv0XxHeQDlB5Q3YD5BeQblH5SXUL5CeQzlN5T3YD5EeRLlz7+Snwf/AbPOUrbIcZsfAAAAAElFTkSuQmCC",
|
||||||
|
"legoEv3": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAuUlEQVR42u3UsQ0DIQwFUFsUlIzAKDcajMYojEBJccIxJCflgEhOkVQ+CQk/mm+DDmj7JVBXV1f/hwMAVktUXOLtcXnjAoohyjbyzou8IldO7ifvol8cd47jMBAc8aC88xRmZ+xHJPbozzGUfM9z+Zyfm+qtNbFn20cn92KylTtSxeSmnKOvly/9nhD93mHrrb+QzZyH3+9l5OEkgdZ7/+xxLLkn/M6zmZyeOYvt9dv71/+Durr6L/0BgN5AjLS7ff8AAAAASUVORK5CYII=",
|
||||||
|
"legoGyroSensor": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABVUlEQVR42u3WsU7DMBAG4GyMnZiZ6Uv0ETIQizEPwUqxmBmYPHdgKPWSF0BKBVv27Axk6USJkKBqa3K50IrfjtSWVBUoliJHn36dEvuc1jPOMfYa9bm3Gp1fuVxVvt3YYyO38j9Q/3nt15bz2Nzr6rh9QPNSon+EpR+hP0ZUZ3mPfuyTL0QPvBuV763RU5/mRYB1kiHVmWn09Jz808rrIc0zLcHVGc3vAl3fUJ3XbgwuLshzBc95pXml9QA84NVPQ8zzOieO/ENHmgzyl0X+7c6YSfTT+8KYjC4f8iNjEu3Op4E7r4t3cOWVkAfJb/X8lB3ZeVrPabHFmWP958Unxlp/wfuoQuxP9/7K77zVz3F5Y/WP4vNi9xufL6s/a/u/Oi/oWVUffdIrb07RX7g/n9Cn7Dl6XuM7fH8O4Dt9h/+jN/S7TOOkulpvvfW102Fpwvfz//wLrcogjkDLtBMAAAAASUVORK5CYII=",
|
||||||
|
"legoIrBeacon": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABVElEQVR42u3WsWqDQBzHcY8M6XaP4Ft07ZjZZ+hU0Gdop2YoJY9RHIXgLLS0Q+kQuiS4XBUzx05XEP/1ck53P4tS3bwl4YP5Yu7PxTgEV+KM7Imj13/9Tb9I01/05RezD/Ou/RxrLp0uVIWZLpatM9OLOA3ig+k5HRtOb6g0PW84iGzXHduHdr5UZ2f7SXWubZeqs7a9umw+sLG9Vvvg2k7Kr4DrNZnXnKgC9yMXRKel7WVElD3b/n2o3RzsT+5X/APNaytXr2hee/n0jubl/6w6OmvcqTju1C7uEOEOEe4QTdkRzbuE9feu+Q7tTP29xusIhjuC4U7h4U4WDusIhjplVHjHT/C7sctCdC7kovDQ+ap5FqLzSFR4+FxnIfb5+r+vF8x2wbVXzHa1TKdN67c9/a59zvb1R/U4SoOt6fdnjvemP5w59efOtJ2hc+zyqf6f/wIbEfAds1E0cwAAAABJRU5ErkJggg==",
|
||||||
|
"legoIrSensor": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACSElEQVR42u2WS04bQRCGCzOGkTczSLHEzmOx8yU8PKRsEwnvc4QcAMmDBcK7XAGxQj5Fi+QgQC7g7Lyw3KlXPxBtHkrYuTZuf65+VHXXXwabNAMb/jqHJzZ0/P4p33KcvnRHYrVMIL6EsbWdmdgPa5tC+LxoAC7VvwQ42xZuvuPcI/WvALYb4efoDn1xP6X1v42Jr3Zo3xJ9cY9b8tnvEV/uE8/Rtz0afaXxTkF8UdE4GzRQweCGA9glPjc0bnUhb0H3hCP7SfxBguwQ70z5S5/4nUR/yf4lj0viF8KP2J/3gnyMPBfehyyDTzWPs6GBlUylADpyfDxED7lMpQC6cnw8BPKl8myAEd8oLwwsZEkMANNzoldzhbxRH7qBqfLPBubK+Qb0DHBs4I+7VlpP94IDAw+OV/obB2Pg0fEevgC35p6BO0hYaeBXiufr+UWS1zBN8ez/8TzJMYQUbxGnBF97RI9XOFr71BfLyPvT58yvMIv5lveXma2X9v1Yvi4PH53/dff+3vez7h0+pvhe9M5j60d1EdtBVEc2UsbjqO54v1B3vk75fKFOfV1T/Wahrr0OUL1Pgg543SA5PASvG05nKnqA143XGadLh+T/pQ66pAmakP9tFXRMda/NclsG3VOdFEHPg06qrkoDyIKuqg4P2H8SdFh1O8qS6LbovFOexuu89IU6qJPrC9xHruxvaxeWsuj6CPedQviqF/qOFbVibiH0Kb69ofIm6mvkNFZuoj4oJvx5P93wDX8Lv1ft+Fe++b+a4n8BxZLiTc0fV/wAAAAASUVORK5CYII=",
|
||||||
|
"legoLego": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACCElEQVR42u3WMaobMRAA0JFlLBfmy+UWH8tH2DJFiH6Xa+wRcoCAZFz4EoFcI6VMin+FlAq5gEp9EJqM/BMyWlz+dCuWXfbtIlajmWEB744Ab+gZuqEWX3zxucsLcxHARLD0sl9/ZK6LRDoyYOn83YMGfYCDDLrzIAcQCeQDiDObX3gR6SGIH3Rm3yMbtpEAJuYrAK88+QQwMt/ICJiAbm0amO90Ephle1S2zLcmKSwas8C6Yz6YpLGYtrTO95Y8Wyxka+ajiwaza1N1fnTRYsLnYl46nzBYDCiLiZ0/YXBBkNver+idF1VlGzo/oUcvi8quc3FGQJBFJudnLhBUFpGcrUvIVwegK3OpKgVG35zHYaWqRNTpIHrftHQgd6cq6nbmldZ6rbKyfVnrrMh/4vcqC/OdIS/Niyp77rRd2V7nvqVteUmvnlk+DDbqBDa456zzce4uWPLEfG9Dc28v5Czf9i6Y5u6STXz656PzVBXkOpkYuH8xv1qMdbLRc8eWJlcKqbsyPyJ+xeIo1IinO97S6gydm+aZfNX7LT0pSnXDfGwzk0eK6pq7qwqTwUAVvONuqVaCRi8wDcz3Ot7yCrwLI/Phb8sIrSLZfjUUAJup1THLB4BInQR2I1U+cwnyGzxG+PQIivclET9oSO9lVP5z16/+fCcIjHf62LT088UXf3P/n//nvwGyQo0HQOyH8QAAAABJRU5ErkJggg==",
|
||||||
|
"legoLargeMotor": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACiUlEQVR42u3WT2sTQRQA8EmC5qBtLh4Eafcj5FpBm/0o+QCFFrwUikx6qgchHsQKCv0I4ifIQsE9SY/qKRu2NpfiZik1u8nujjPzJrPzr+hFUOiDkuSX8mZn5r3XIuKMAN36v+oFwk7PUM/pOfnLjlh0HM/Dom07f/zYdv4udazLIrvBC2z5jK1b9QxHjTl7hz3dK9RI2LvR0PBezn0cGo7Bk1j3gfB5qjsSvsx03xReahsI0LbwSrvN2vUNcI8Q8owNKK5tQMmjbUBxuoGCHaCZZ5nDjWLDy5zfGZy3kqfKSdzJ8Kln+0V7/+DwxMhD/bzVf4R+7zLPH7rMc9O6087+wakjz7QaXRNX/kaw7sr/nX1tOfQBQi0jz8obVn4iK97lrGBczm7A5cRT6416BOt6Q7U+qcMrSUK1nmufx6L+z3RfpsI/6F5moo92da/oBljfISN/RWcI71PDM3pCvK8ND0iEVU+FHw2e9BQvY/H9Jj7rcJ+Dh+DF4734iPuSf74agmfT/k7MvYAB54GnY7/7rJ4/9NiFj/zuR8ULDB5jv/utnm/0BfyC+N3Leh7SJgL/RPq7l/X8RGJukc9kL/np8/kvYikcgxNyTH8WuHjO/QXCURPa+FUbbTVxtc39Hbsy8JMF+VJh4vEHOO7Mqg3w908nyTomwxH78KY9K9bA325MftzFJByzD69bwdYdkX9tsNPEBA7a9pQP5AeWw4HYvw8T0V4XRozynC97E3If8wKHzZfgoeieAVv3IT2HFngku43GPXpuC/CZ6E7zPLWQ528Evy+Hy/s14orWw1eHy/oxIl/VmxGyPo2Q9WyErH8zVv1i/W0X/WXGTPSjtQD07+3/af+T/wJN3ebtyLaNLQAAAABJRU5ErkJggg==",
|
||||||
|
"legoMindstorms": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAkklEQVR42u3SsQnDMBAF0O9KpRYI0SIZ7ApDBBnAKwm8iLKB1aUQXCSTmMgRIeD2X/mK/+/goN0JoNPpdPpfno46IALrhwUnmOgCRgwRaD3Yvnuz+fkiotOUUu0wtzmPku4lv3E7f/kCl/RxXf0z5+2aj7mqW3ura9552bP1eldxb3Y5Lw+279Ftzv+k0+n0n/4ExFPChY04blkAAAAASUVORK5CYII=",
|
||||||
|
"legoMediumMotor": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABl0lEQVR42u3WvUoDQRAH8DmOJJVcY2Eh3msEFFP6AAbBxmewtBBzdnY+hG0a32BFMaWvcBAk2F1Ms8Fjx9kE9DbOPxg/SIocZBN+hGM/ZmeGWH0M/chz+niiqptPp+94zw+xTWW0s+5STjQvO5OvL25d0td8aOOh5qMiGmvez8lqPjB0rnpGe5r3xDuKPxHtLMUz2l/IDV2onpNTvYh0t7HuLtFdjn5lvCSSIHQyhi4XIC0bLOEf+uXkcvjhLHAfyZdFS6K3WfVHEU5OfPxvVf1BJuJ2367l51Vwj1zC5dHGAZepqfqdjdl26zdcNPLAi4jH7doh53Hg9zLHYbd+yyYqAjfUGbVrx5xR6Bm1Xm38Igs+DdYl3s+oKR6uV7ZnQLQtG9ec9WeiTc3/5P9gPmj+cL1gf9B+ov1H54XOF8UDih8Ybyg+UTyv2r2blx9QPkH5B+UrlN8WzZNLyueovqB6hOoXqneoPqJ6iuovqteovmv9wLz+wVuqvAd5Ov2sfe3/7mYag6z1w5r7vtqXgGymr/593/4ORMuwad9vYW4AAAAASUVORK5CYII=",
|
||||||
|
"legoSoundSensor": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABSUlEQVR42t2WsUrDUBSGk3bImAcQmqGbu6sZ+gBxCR0dfA0hg4Ojj2DBoXIdfAPplsGXqM0LFFwEq9dgEsTT/3PRoPZAQvj4uJx7DrnnBl7GIuibtzH8Lm8/KuDLIAIeEE/1+utE8ZW7i6WfTy+07861n5fgl+BPwK/APwH/6l/718FY+lMv67C61bzKevYpH8p/V/tF/pGpQxuDualbdw5kmg9U/es/+sX6zrmb/fpl/byOg/ohfw6+zb/z7X4739ZnN/xZ3YKx8DNzRHf+5RZv/OOefcqH8v+qPhX4E/BL8EvwP8+LvPCNb+aLm4WNb+fRMvTvE83Mr49IgXvNt+Zpouf7UHP/DD7w1z1Y5x54BfxR84jyoX0VwFPgyQ/x+I9xynNEPNX8EPgp8E2h+/ikuV/DvfQB+JnmmwjusTHwVPPwl+7bwN8AruTZQAWFR1QAAAAASUVORK5CYII=",
|
||||||
|
"legoTempSensor": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABrElEQVR42s3WsUoDMRwG8JwdDgS5BxDM7u5q8AGEDh446nsIERw6+grtJtci9Q2E23QSVBxb+wIFl4LVmNM77p/4fTioaIZQPn6kyeV/lygH26X67bxune/m9Y8ZyScqJbliucHjzzXKH4vzDPo872FflMQfEn9BfJf4M4v9vsV+ZLDfM8Rr4jPiT4nvEV8SXxI/IP6G+DHxDxb7kcX+1mBfaOzvff0mwA+rwgb+7tjnFozvH+iyeSGk3/VdlL/7K98xj8avvAXzId5h31Vr0PfVKvQHga/bSuyb70A8fus/z8fv00s8/6IohptF1cL15r5tVd0XvvnD2De59HK/pJf7K3xQD9LL+pHjy3oTPqhP4YN6Fj6of+GD90X4qcN+QHxJfEl8j/iM+Ix4Tbwh3mAffj9bP7bYh9/n1g8c9jvEh+dFbl3t09D3kw8fn0eTxL0vaKHReari865tDudJfG5qfL53cO6eiSf56zoZ55rkM5I/4Txl82HrsiQ3JNc/lGf/LGfz3GC5wfk2yY9IvrR4Hxc4d3NyL52S/ATny5TcYzOSG5wnf3TfJvkb6gg75melAHsAAAAASUVORK5CYII=",
|
||||||
|
"legoTouchSensor": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABB0lEQVR42mP4jxUcYKCq+B8GOOCnSLweSDQw2APJforFIYB4cVLNn/8fu/is1djFp4YSrf4BQn0jhjhEfeOoehLVi4bKYxP/p/2rH5v4nxh2d2ziPx4wPMYm/rH5hyE28cdy7yWwiR8rlz1Tjy5ewcDAs4ZtGQMDO4a4yBXWVAzxyv//X65h2/T//3M08dDQyBDW4NDQdDTxVatW/mH/tGrVcgz1wQ0MltjUb2pg0MSqnoFBEpv6zUBxUtTjNB+He3C5H7t/cYQPrvDEFf644gtP/OJKD7jSD670hit94krPo/md9PKWLupx1Re0rNeoVC+DgDwUj4qPio+KI8RBmYUa4rRpnwMAklG4kKcHXLEAAAAASUVORK5CYII=",
|
||||||
|
"legoUsSensor": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAADpUlEQVR42u2WPWgcRxTHR6g4YpwsBFRIGLZKs1ViCCRBubG7FCJyohtJnVGhRlVsCKg4bk841oKRc9WBioAxMpJvJHDSpTB47SU6UH/9bpZrVO0ZDGsx2cn/zdz6JOTDhZpAdMXevN+9fTPzPo/p935Cdsk/zNmZDy95fJZPlJyxcy8QV8yPJ0vD2YRuOpZn+H63fci1mrQ89LEFH3Iy3rR8A8vctbio0Dl84mZpHuXveIArVzddfW+4rV8wv3CI5zzHkV9aHuMyFV0hnuHBeGZ5RJfBEzzRjIdO7hseKAYxIR7hvGpS2YM6uEzmkAkd5G7T3SjMQQs3brBGJffBnXjdexz7DnHFN2IZbCgessJ92Re1dR6Y4/uVtvghLlxwfu+BlL+5XcOLTzwpf/LBFXeEEPNOZK6lvoUwy52Q5Y1rUsqdICGe5Hch/OoG4OprqIgoo4hMZn2sl5xuyDJFKjK1fHCE9X4rCtkgXyX9lZzsdJM2CUEasiQ7kk1P/m4cEUSeZFJGScjSQa/G/xJfKeKtrrilp2rpIGRRIjv6RG7XyUHOptzTx3IlC1k3FQtaibkGcfehmNcD8UUOHnnPtPYOqoZflS+0wmYhCw7Fba3bi1WX3DktfF2I5fwGax1CRR/tcuJ8RuItb1uB3xew0PvRJV6dqoGL7+rgWxInPN63/HoHXB4Qf0gqbxYs/3IBQm8O3Nkik6/3XQRMVa/vQzg6qDPmfmT0hdMCr39m9GtV8BkyedJpGb62B+F4l/i0wPKtsHx1CUJ/8b+of8Xct2Pv5Zn7PgF3Sv8YP5T+YeRP6x/rz6F/yJ8Ike6X/qTN2uTP1i8mXtLyT028nhI/NPFatHGcNvFaRhyDQ/kIIdq1cZ9B8Aq5jbh3I6SMFnM2Tz7Gy/+Izyl/Um8HKXPQoHx2t2RLv5Z/5JSHbYHrLteJO5tiSfcF5WGKlOev5J/DvPWe6iuS8jbJeuLGFEzaPBeCiRrl+SBfo3op64LWHaqLTP2MCqmlpnFEgx6EBaqjXH1DKtGAeJodQ9ijukOdkkpZp3cgfE91irpGiT8r63oW+s+prtEHUIPX3vUB7GX6APrG31KO+sYD2TF9g/qMuDnqM4momD4zti+N62Pj+t64Pjmur47rw+P6tu3z5QwZ9Xk7F04PneapOXJq6JRzhOYOxFRrxICN5o5R9oe8OZpTxrge8vDUXNOMnGk5rPKzc3PIz83TS37JL8Jjm4EX5v/v/7H/Ajl+8VgNmvuRAAAAAElFTkSuQmCC",
|
||||||
|
"objectsBomb": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAB8UlEQVR42uXWPU7DMBQHcFcZOnpkQcpFkHwUrsGAcBADY4/QozSoQ8ceAVcZOpIIhgCJH7bTunn2M6kQEgMdKvWnNHp+/vuDAfkp2Z/6S8IXCecA15Q/gs4TLiivvnMde2O9FZG3AMZl5J3UEprYtTTveQLKpSk27pswzmlHIzj6UkNH+baztcb+os3YCN9r2FP+2sM24QvKP3vc6MGfoe87GfvWeEt4AUGZBy/Ns3vC1QWdH50lcvUmErndVrTvFcvInLeMCTr/bZZYF0XCa0G7nsfusvNA5MR+7WoZ5vNQa+jrhC9AOhfY32xsTaGh76S2i0ixHHl/b+ZR2h/YW24Kcs6RKwH94IyNvVkNrozPx27yBitbj//DsQ+N9xx5BUs3Z+xmTju/R74x2XWeKZwT6+79wy5x9IVdLs7v8siVq4ePPbdboh0v44/j/cF5YT1b4/ndAFhms93YV8b14A32CjrnrMW5qtywrEvab0OvB78SyJthWIxdJtzNwNjLCefI34c2RP7hfR6ur4SzCc/Oc/1Tn/0zP7M/8Nt+bh6mnAdeTngeuJpwEe7/Ey4DbxN+WO8MaJ9F58upnfj+lvLCtw176duDXfk2YK99+dg7Xz527csJ7pmFPxiwq2j/P3VOUvfV4+tD9yfbH9+fz/cvYG0fIZhr9gsAAAAASUVORK5CYII=",
|
||||||
|
"objectsBoom": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAEWUlEQVR42rWWzW7bRhCAV5ECx74wEEKgNwroAin4BDmVUp3AYi6xUfGcQ1+jACXbgZNcrLLorUDspEDdfYnIboMAufQRSjcFcgwNX2h4wenM7orcleRbK9i09Wk0fzs/y2Dla8b+a/7nDfw9PT4v89+dLzX8lB4Hy/w5PdaW+c8pQHV/me8jl1sreARQbi7zrwOA4nKZryPPf1ziVezhux+WeYq+H1w4vKJfvgewO3A5uah47OpBkxLOoQpKl6NJGffSsjN1+Z7iQc6nqBGKmj8P4BIqxkBGjvxsDU55xlg2dPnpDfxjTpmfofnoEq4bng/ZrZhP13kWnMMnh3djnuGPdwmHDb8AFtSnHzS85FMtHjMoI5tnhveiGYV2iFwir+tMsg5YPK6/wO6q+jJ6Gt67a8VV6/mLfFtll2ebi9xEtrWgpyK/MdZPNke5YQelMUsHFi+I9zV/ZXN6fJWC/NKkZ55PsnhvnU93MNOLPGzx3SOXj+nh9+HZaK1yOLkeHrEN0eI2Z8T9EfOTAY8aLlv074bA16/S4WT3pwRfD6cWLxV/SfL7Ns9V2yr5J7YeKp4sVvpfWHZzzX2SjxvOGKMSANT/WryStf8zLc5R/lHysMlDaXgoxEux33Cp1VT3kuR28tTKzzlJMyY2xGP0p+Hq1FkraW0/SuxzrDydnQftD+IQrPPdRbu3kySCd+iPVT907N8IEcEH9GdgcYzxSstvQp42+cRSm5L8mTjWrW3mBgWm5Xf41OqXNn4WihT+FifaO8MnWG7JCGs8GXXjtls/oUAHhOjGzKpDtOUn6ECSBFB4TT1jp4e/YQGEGMCwXXOJ3P8W//oYcMyimnvozwSd2hBvdL40rzrZ0O+ngAXXxxBb9fxEHoqgwALFUh3XejCwyh957/DAIr0EDMdpFYo3eMInGGHa8HPKzw7WDzZM35rPObl+gvLHZgHNOeYnGaH8dmbnh7hQ8r9kscmnVCM2lVp+q55jJY5rKPC8dqmej01Dzti14duM6nnAs/q8cGKgnvH3IfWXnh9zu0U37mTUACMdVsNxnFDDHBF/2/AUR8czihdkWjZ5K6h0ySGG9UMtY/MJhnuHZykEVn5AVcORWk6RlQesuMG2j+7jaljgw/GtF9ysDMNVbq+C8ik4c54KUe0LKmCX0x6Jl/hB0aZViM1VetYegc6YoUV0iY/Zms0Z68z5/YZXX6wxj/Rc4xT5ruGyZ2bZdNiqrHMvUafi2dDDPWz4W8Unes17emEQD1QD53pfBGrbK65Fcr0vInuf0o4o1blKhx/Wu0ef+nx/kZBcwcHsHZZK/eazxdEuW+cL95MrgG7cY62eGTtzfk3GZ9Fp6dwfFN/PWFoM8aomFzl25R19v5tzutG8l5ilB84eVBGc9QOzmeZcr74zHATwh8316P1Ik/Afi+uMQT6Zb0r3XlrsWRvd4hdUIHKFvLeal4G5si3yaPV9+CYu09W8+n/v4Qv8X0gYw3qRwhztAAAAAElFTkSuQmCC",
|
||||||
|
"objectsFire": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAEaElEQVR42q3WPWvkRhgH8Ecr7+miInJhQarTlUZVCAQuYLJb3OFy11jCZfIR3ARSBDRxOjcHAdcWXLF742K/QCBqTMg2qbZXjrhxE53DgXzImjzPvEizaztVFrMSP/9XmpdnRgLx4KeA/9+bx3z0sLfBI+7d8zvpzj2/ld/G285r+W2u2WTGK+WZ8rp3KaAbWq17a7wcdT6SHm16Gdle9E5dbSDY9MJ9xKlL9QMOax4ZZ3SojJedAx3KzgPt7X96Ybzy1px17mpvpMM9r8mb3h3b697B9uohd6g5vWeP+Mi4S83s+gWR5QDdfPXurXvQe9t7YbzpnAW2t+gNOQUsF8bV1LDO8efYZ2p2oAawrxPpjG7d2t5gn2Ekm9T0Xgd1DQP4GqhEq96boKphCHvSWe+tVx5jXrrsiFl3PxXHmH8BuDQa2/9kx+DDZ+S6wcrv4HPYgm09b7236D4Co9EEM1/kL2AHsAty3npv8NoxwMCRzXRE708pv+Xo+SzgVjtQ3ldO61QtdWpcYvIe3aTOjGP+qaN3A3Raun/r/DbWRaSdjq91fhc90+7RTqXzU7fbf2o8bTydn1uOt6qlp+t5vH8pnQPktmeidFXemXqW46p3VX6Q2x5pV/nKtJ9GyZF5RnnmKm+w9pn0dDwce62sUOkODlVj8npT6X2s8lXvgIX6AzwHnvu5V0C07tuQTsOxy4xjeWWAlRlDPPdzF9QmavwZhDI/6BwvguX9Kfh5PI/zAU2u07sHwyRMwilWUFZZ7sCAx5znMGBy00THFlABDlP8UF7Q4u8c85zyvtOoOsE/6Y7Kh44cCeWM/kH5OfhuRT1DL7Wnocy7BfUAvdIeDygf40gor7WHX6VpAgl6Jr0x+V9izHNP773khcxHYZo4yRPjrXb//JTzAX8CP+oHAsPVPcb85DJNh8mW42ovgxJnC+LFO85PsIiMt6MSptj+yYeUWrTjmQfLXQm72N/FDXUZ/M6bCmt/mE5uN/J1BTj2fFHL/G7Q+feAY5PuNzSkMLWd8rNW5ueR8WpP5o9ayjvT3p9RPp4J+hXkI8txaMIjEcp87wH4fM5ngq5/YuU9hsmzfXGG+eE469xlPn97uhCnWEMnrHcohunBaiJWSZq+svLwrc8vlguxnMf81M7j6BxeYl522PYBf3P9WiwvsAdreSc9uvpGrA7v52fvzsVyhnnYyH+IxGp/Mw98dvOrWC7W8nKxH70fiasJTZjlzyGefczE9flGfgfz+JZ0NdrI+yye4WvddUYl2nlDi/EIT/4Sa/kGm+/P8OT3di3f0uKi/G9t+iqxHRfXGzz5o+U/W3lB+UP52Ei/tPK4hDm/kI8B/sUchOVpciAfS8l3U8sLrJ9PZH5+Y+dLCJOX8v3x4Grq9F5h/RzT7T7OrnPLscPpHvn7YC3fYofP1fvgde5a76XMSSd0/Edcjm0vcb7URr7MPctrUP0VYjW2vYX4rfJTFtjvySxM1MnZOLK9iLl6ueVM7av/ArwbP0k4AOccAAAAAElFTkSuQmCC",
|
||||||
|
"objectsFlowers": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAFKUlEQVR42rXWT2hcRRgA8O9l0p3ELjuvtwTXfSuKeChlwUuEZV9KQTyoZ4/NxV5EGjyYwpI3azDpqSsI2pMVEb0KHj1klpQkB+32qCDlrSn0UtwJoXTSvr7xm5n33u4mm4MH9xCyv2Vn5vsz31vQU18C/jc/OMPFGQ7hVE/P8ASCM5xNdXWGS2CH0zwGJsLpjjuf8h0BFdzhlIOA8hRPrdNTroBPdYk+9x88tn56XzHp25Oex/Wimzv3OPiwlnnCJj0OTjoYJ5xZ/0qNe71BgVrfmHCoVzLvTPjy1QUgpxxuLscN62koEpaGue/3hPMkQE8K//1AXHXO4oTlKwEMP+PC7pvQuM1UkMXlJ8EGWE+JbDOZ+4JkmwAmrtSTzSDO1uflZS8FsHkA1QriKMsn5ZAARAKONW+3ApHnmQCsgYf5VJFo1oKeC6ATU4D6dVNHGcS1WtBR1uE6M4tHxolE37AbJ7C0jr5n6iY9xSoBFYHtnloNfdu4gia9FTDObJdQPLy7L3hvaLfF7K2SQPDwC57xFNhGv1UD1z3QArhoz6k52Rk2l0jmJYBrNi6tvMNhG4/snHEY8CwPN4ZrLm/oa8KTy66+Inx6w+UHHSRVYOoiA8z9UU/nrlPnMUSsN2SK5P64DeAZp8NqOxKZk6ePm5lDuvJWCtTGBfTHj2vW8f/q8rYElzcIPnrsHHcp85BTdxuhtXv3vHWTRv4tuLpzeLE55vBldp3w8LPmCrj+TC4Ho4tXNm77B7C+o4s3z8H1myDPIBzNh0UOZtSAOblYApLPgQuYIpNPrNfRE+xXmh3IMw0UmvNHPf1IuC9gANhY62D7QX/xz6pyLq1HQ9s/+txuQ8csSzQ2XGT7h6Xzu0uhDk64itILu9UgHyc43ZxjuN5mmRVeK1y9ulmh+VgyDZS5vFxipPCo8JiUqJeHC7pwjs5z9wpPPUKJiLIhTwtPZmbQ8/seoLs5r2ZKlMSjTPPMZblEPOzP4QmPq+jYiz/lFfO2nS9VzpsJtFVc4TtufVWe7yQRo3nlaZDloTzPU124ZCzLQ3Uew9raep7FpruFd5C3jvKT5t5cRN/bGuTed562F/d0Z2erl/te9vxKXu7r3kF356TrX/F0B10bQOqezM6f6yO52u927WnG/EjLtbf7FVN88/5wzKuL/So1BcC3x2Neqd5bCkyBI7uW8wOtyK0H10PzPhzzR1p79/4S+OmYH1qPP/lzB9tK1NGTyNbL+CAJn3fRP603ck/6GKBgt1vrRPmi/V2kU+sDgokS8Ox9SZM5DlfR7XNcblh/nfEoOdcE3MB5+ppJuI4veTopzbzr48bOfesP32QYbe0HH6Nzz8f9EBuAr2I11NxLospyf4iuiKpGWvmeb35udK3/jZ/H7ME6UOnv3zeBOR+E+L3wm18EUfXv+XLhyZ1Qx9HsH5omt680jPedfxDqXnrxt2iYzr7jG99zXjG5eu9uiC3/ho/x5n7J5HZuN8CqNOo3C09L+K+c22M6foV2qK2TrcvX6L25HZxDHsyQkd9F/9zf2TBeJrbert/Qwb/SwyvU/3nccY+yf3mgzW8EYhsod11trDzRDBp2nmWutGKqsYJ55zZtI8eHw+qKKY5vB/Kx82Mdh2rFuPTtKC0c79fgmvGG6UNcwHk6g6saSD5cm3BzCjtRNmftWHF+aDx1T6qK9cj6kflt6TwJxl157mLh3wmXhesJf+i5ZOSeZr5PpvrT+yO/M+aPsOf1i3EPnQt3ObNZgq9Q/AsPqgGNrWWh1wAAAABJRU5ErkJggg==",
|
||||||
|
"objectsForest": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAEt0lEQVR42r2W0WscRRzHZ1nJRozZQh9MMWYsgtYXvZAHo8ZMpWAf/RcSheZFJDUPTej1ZsshVyH2kDwYoe09+OCrvhez8SQnNOYUXyqU3l63cCKlN0cKmfMmO/5mZncvJHugYLynu8/ezO/7+87v95tFMvPjo/+D7/1L3vqPeHjMfHMAvzqAo2weIZrJBSIDOM7k+76bHdd3srk3iNcG6L80QP8gndl6OMqOGyArk/sIZXKEjgRWXADH2ToP8vYAXjvAR+L96SGe6FfLqrKX5mX3uXiPdNK8Ev0umcmfKTRj7qHk4EfIGPDTh/NqXCNjhTPRS4ZHSV6izi6uy3b0ej9fZTRfrj35pS0fP3ebas6AK0E8t3VpvS6fOvEH1hzkaKNFTizd+FW8kfvpiuZgsxYanXqyUlm7scTvc829mMvWSe/KRrkrGoYrrBNwnhlZnLr5iH5xgEMCYqoYTb74+w7JGe6PIItBAvxyb4XkOjvjy93EN0tWpLzXe2tydmWtMdyQJc2ZCVu7Mz0/Q+vSKks78VMfyGcnw2keSrt8ykn8VL61vmrJ0+yuU6w/X0781IUogsLQJPaK7bXUT3WQb4uPIhdjz+7+pjk3/kT4liumyMRrNr9AEj/VshdKlrgo83VbXMCJnxB49J2SN/Yt3/+8KOpu6qcrh14u+U+v85VrRUgy9dORxQecWBXx9Xo1muz7Zsnrn8jwakM63Spb7HPIePzncFP+sCerFlNcyUfYJ53t7ZovS0vQzUJxgSYgbOQ2H65uz8mteenN6zrhSOh8w+C2mKNiSVq8ozizma6T2uQ+Zxi4LQLFAzcwPrwJqTv7Ujh/nlN+BsQzPrwKVsG6wKkR5UNVGh/EQ1WSqvlLFcUrApnC/VFZRQOEy1uLZ2OfIXD0sSpX2JSIRc2ZyTfKU7AKwzdeOHE28RNZD+YIRBoHabzNUz+R3ayXIdIIROpukcQfyLjzZRV2HFadoDk3HPde8ZHDht1olu4onYHhUn7IQAoiEzE3YbEcWuCWGnXX80QqbqJKaUcSXEX0U0Hlhq9M9rVvpVsUK37n+wWlHYrc19t3V/Oa/0U2FWfIMbxzfRmq16M9oblErq+PvVMPNO/utrrp3ACfm3tWRXHRgoGS1DnwludU1P7R+zPvpnUO+sXlnYbibTx+Lp0bUJ9sYYcqHuKbrXRuQKGw8/epuppCLB/TtJ5tGZTWKKylVcKG8YG6DUvfqbU0JP4Y1nUY+1le1pI/INY95b85XhA6cVdvOVZ4ti77/kOnlsxSPl5T3LNhMfYsuV+Kl+bPAwdl6t8c0W5NbQPPhCok7pq+9ijfg4UO/Coo3tGC1NzjZiD4o0TKA30tu8LMLVopp3NSDZqe0M/Djbrbn5NYzy3dT5WYe7F8tSEsC91vcL9/7fR+C0enSNy/OSMo0E93V6ebpn8tZgL75p55NIt0n0K1msBePM6W5oxvmM1pJV58PTR3tW+IsrxWnlxvTaJ9syRT1pEouWaaWNcnlALlanQkPFTcB4WMwh62SPie4mpP4GCSSK+xjfg9genfHPXfa/4JZ9ncCTJ5BHcByh/lAsE5TNMjPKm6QzyuUpyh5+j7z3HzY3wP/xtx7CF4mzMsBwAAAABJRU5ErkJggg==",
|
||||||
|
"objectsLightOff": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABkUlEQVR42u2Wu0oDQRSGRyQE0qTaevv1IVaxsI2Yg6VPYSnxQhDS5BmCTTgWvoGYgI+QPklptQqBRcKsM7Fw2PMfyIAgQqb8+Jjbf87OmgqOF7PjO/43vGxifm16iFtjUsTLRreJ+DzjG8QnRIeI3zKPe5LbBlE3lXydMXNb8pLcaALOT8x3kr9TRXQk+fzRMo8kn5yviDqST930PJa8fzFzB+gJPnjm4MA/PLly++/mgrc+nc+SJ5f+wGmd2+zN+5InK+wfYH9NM++3Bf/2h1v7WazPik9Rvk1IuR9W7gf7VYuV+yclL8Xvb3xQD4zr4dX7qN4Y19vC+6eSL70/QvXvxrHkhfcflP46Qf3lxj3o0zCuev8OQb8n2N8Elio+4JsAcsCTIK6QDxS/H8RV89H3ygcG/WkQV83vVBH+Iog35Msg3m38jyDekLuCOEO80P3jGL9Q/NIY+I6sFa69R+p7Z0weM49btw391ELf5hXeT179zrqKb9NCWbfIY/zodWPvf76HebEf939i2//wv+sL31hb+2Un18IAAAAASUVORK5CYII=",
|
||||||
|
"objectsLightOn": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABpUlEQVR42u3WMW7DIBQAUKoMHjkCR+FoTidGjpCjNJEHj71CIl8AqwuDxW/AQMB8JKOk7dIoSpQXzP8fyHcIoI8z+UVn//4qZ+Flyp0GH3IXYQKR+xCc5n7zbFjuyvvCc9d9/h48jFOb/O28unvEifXe8ziSPuYVXYAhhMU6og+g6dKB3PoE1x7esfW8AFwxF4/sUzf3jBZWuquMlu7mEIjbWofSZzjGXUz9Zg72y8IHm4wqfbSBdenSFrv0pU+4M5uj4aWPuHOZHtHopuqnijPUl96RLJ3/sH84X8jh4WfC/Irtdr9iSL1tvgq2L40uoXIeKj6uh3e3T+uh3u0zAHr+a65j8H3uSpL73VR+184ZbPqh4d5p0feYu0YUfXL1oeirJ+e3og9Ll6sq+vbqvmUlff7TuW+8yX1hdGvkG7p3+2l1X4B3e7V3kXnv9mSOd47gEH3a9tUp2fbUv9xzv8/JcXjGVdKGU9eEdJgvhFDM3f2o5f8PIbxlnmpcZtDxhgOeD4fXxK2MN0xV4ireMr45buv6X99wVwfcdYe7oX/0//kZ/wYyt6dnLKXVqAAAAABJRU5ErkJggg==",
|
||||||
|
"objectsLightning": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABm0lEQVR42s3WMU7DMBQGYKeuGpAqooqFAckDJ2Ark4/AITp0ZmRybtAj9CqpGDJyhUhcIGOGKCGuO9h5/4/oBJmiT0ml917+V6sRXpX6cx+Uv4zw/uwWeDG95ODzYy+98z+zHbG/SG+9vxHfEa+lNxNnn8QP2LWRXk2eW+wr4OXka0d8xP4A3Jf1TPyJ+F76ELdn7gfpfozZkbjBvrDS/XhXDvuS+A34Pv14N8TvgTdxe2aeE38F7sdbEDfELfDyB3fA/VhG7BlxlNPh4g65ljm9PC9yGraAeicuctoF/8Ke1di1yGMb3GCXuQt+J3LXnP2R+Fb0s1I4d8F3xGW+ShWvmbkfsWuZr7Tcma9FjsIYZY6Cb4ijvPiO7onXyJtonaSeGewLlIvpdumww1xMnbslviGuocfrIfUC+RCvgdTtNd7HayB1+H/dxWsgcU08h97GZf3Cm7jcxC1xBz09kUSeYS/1dZ6UG3tB3EAfkrJid9B7NV7nGfZOE8+xtwVxQ9xib5g77BU5T56IfxCviR+IH4lb4u6fnLe/AYeBsM+fqRuCAAAAAElFTkSuQmCC",
|
||||||
|
"objectsNight": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACL0lEQVR42tWWO27kMAyGqVEQuxistjSwA9hHmDLABus9io+QMlWsImUOkyPoKAb2Ai5dGKNYsqiX6UGmWCBR4bG+oUXqJ0UI4PuOWvrXdjTPcp10HWKhtVp+TnbCZIW813paftY5h6PDXGs9+DUPcBeW0cHt3fKP86r1jFRFfDEfAy+BheWVw2wIvIiWF5fAF7cX68/YzIE7t/eWT4H3q9vWyMLHwN2ukGOczIVTQ8pNmBL5IeiAYf5CtZxuLkw/UGcRqRPnpc65y2O7JmUz+kjNjA8U1/tcEZhd4ZLgPOJlxvG9inic3VPKvWyPgHlO+R/zOEIus7CC/IBc5sJyt5uIcytIr3L5mTVtJXIvf8g/wdsd/nuHw3b9fxIaCIdo8pUj4Snicdq7lFebvFzn8GV47Xio9SrWh73BOa4K5Pwenin7w8HbQ8bhU1z49Td8XuMhOeRntciPNVHnn+F8n2vYOadww/mFDX/Y6Q+V7zPKdDs/yrj/cCrxw7XEY1vOEmDKnxQauKSF5ooWrlC0QGKghch574SoR3JjPNdPrBur8/7tAhX5QXCBFhud1kC5z8M5OFZ2H3LtJk+pY/sVU8uHwYFxbL0sorJLtDPzxPmc3hN83U3pvUJv7F24yF93eDbmF5qPNc1V8b9uTkzexrm6jQuXcCHjNLpMmZOlUjkxI+cuk9+ZNA38Bd//llKbaI5+m4YlJYf2545PFK8UbS9kyk8PXqn3mP8sv+sd+gPiXI5c60PqyAAAAABJRU5ErkJggg==",
|
||||||
|
"objectsPirate": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACYUlEQVR42s3WvW4cIRAA4CErhcYSbYpIvELKdJsoL+QyxSmsdYVfa08u8hp0aSmJhJbAwMHws5VjyZbOp/tuj99hGPDTvx3+v5tl6geAnPkGAGr08Dj5QXUbnY9uoi+j79FhdOQva+/YLVxk7w79l+gdhwOS967R+a33NByme9/Q4VHN/WvvieHz2vqR/UG27rJ/FHP/0LnNvvC5s+fWTXa4nvjLif9oXd/9+4mz1/l+d3j3fgnhs4/OwtZLM7oIL3WMLsNaxHAZ3bCZr94uMex6V95x+vmd+LDvZ76ibxPH+Q6e14f1cSu8/haO2dI797tWbvTFg5G2dwvMMrsYmJyvxdUMR88puhjPOz9qpqT5gcd/65h/hK8JkeYx6WtipXlPhmgQb+LP6HGcrbOSyJo8fEDjC/WcEMN0D1Zd5S/i467zLa9Odd+4PXFD2hHUy3gcRs0TbOh7cVxjf33Sj9GhtGPw4rrezM8VP9xd4834O3m6JYuHjbqZi8KAWbPvKY+8mDqq6tL/+Zvztyy+3xNkePxTcQ32vgbh3VZnPkdm+B1vXKeQioN0pd9wsHLIxgm6Mn6HCSb2HI9Zdc/TxRAtRUF7Ly8YMZP7Xfl5ncBn9QbM6w2cgpi4G+uHLajEJW7rhDDzsNuGFCI5HmRoRB0pQA2vLvbYxI5D1SROHrAJ3Cy1MxI/6UbD0mIDEj+pS12uEuKy3PKt1+qiceHpE7VfVcuLOn6oeY04yUeWeuyO7ELdX1MXXqcm767ILojqzJPycS2uiRvwU7evcHPillS8jvghqmNamtXPy1vV4Y3/A9znMVqMtuZiAAAAAElFTkSuQmCC",
|
||||||
|
"objectsSnow": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAE/0lEQVR42o2WwWskRRTGX1shNYE2FdlLDos94+59I+shsCHNopCjR48mrLi3NSEgOUSn1yzqYWHBs5D9Jzx5sIcFRwi4B6/L2u0Ec5KpYVamYzrVvvequnqSibhDMpn5pbrq1Vffe6+guvKVwmvx9w6v5o9ieh/O8EV1JTf/wc+PJ/Snf5mXxydXz7ND/Pfh2SWuIcD3o2d95uUlPv70+SVejmieVw9uMX/85OK65gO7bhr5B37t0n8PusQnWdzl4P2+Dnj8uKhYlVP8/Zo+lQ95/Pjxc+a61s18YsfPCc9/IJ31A0X8WvuawG8Tfe4WH9/n+MXqrsRvuS66lh8d/Ua8d/M7CjTbzhx3uiU3lyg6vZTUuxi+JB622z2vDb/6fxFfBcgpahB+fE5cJ4ATHxqQ1eE0H3x1HdeNqiSqnIDDtIvcyAC5qjAcVbuH+EAK4mNddmvO82RJSDzT2vM6nh3ksJKqC9zGr2Ap8fyl26+spAIAxceSO9+yPoEKQagWcr11YLlYQT1xDsAfDKDoSMtZf+RpdJHzeWUqzHYVCVKCcjzE8y1EuPIsJEUNPeT9UAByq3TN2T8ZhEsHQPOgOFXX+g0nTCyP8NG0ojfrTwN6HuZBS4MhkOjEXwwrIwrcb1ASzysT1T43MkMOX0pEnrOfEuLou+g0H5i4ySPYBFp2EmV5r7zjuQk0wLasRuqXrWS/43kps8WgEKhH0oH9oOGoWbJI/FGntSea+UvkQlRa/gzLRcPN28TxVIJ+speJqfmRKzwHOElPU+h6HhQqMKICuJGOEoiJd1l1jB/nhW2Ra9Fw3m9bVbJALnXNjWJ9YjxayLPI5vsXyIUmXhLvJJZPbtP0xTzMQSExbTqUIMhPPyTZIIQD2KTExRfzf27xOfM5osBrOIK5iTnryA8IegbijPk5zeP9068gLpj//RFlNfptTH5L90GlPk7yZxKTP5t1eb/ez7S/oOHe/wbjj2qu6nyRsQlIh5+szsrnlyxRN1XGU5zzEfZI58Ryg3Kpp1p/rOhceiOw+lclCqUGusTn6BxH9TnyeFsf6NyL+txHLV9PtOzDau0TDb7+oH86y3vOb5ryquB6xX6rfWgEP0QfsydJJ9m/y9x0QuIrVA/HKt1Ky9s2X0S44etndJ5PXF6UMhRUbzUZpsmjP9blokwrrGOV4zYf31lXSqaHXM8rzkfL32gvLwDmds1Tx5P4YSvGHnPKxm7yPYl7zM/qzIxt3fh2LWjJpif5OlOGIpTi0Pewui7puSCcb9qkr2ODdNTa3uvOcFSmlZqmd9Z10ujloDdpmm0+dOu+gmB+MHt/KO9jUpzMcnMvgbV+04M9f1dD8c0sp8rW9CjXpWe5VWSGuy5N87+lQfsW77o08RspLPt4XJem+O8BzG14brs08c9bAfj9ui6N/M9iFdLjmrsujTzXO63U6+y6NPEc9V+quevSyL/ncyRGJ++6NPnhehBy62TuunTtk6Tmtks3nIIe46/t0sShvYA+rMfbLs3+XH9zQRGfnGGHsF3a+pz8TBeaHHdtu7TNI/Q/n9SPG5Xr0i6PFu3V4U48HT/l1/veydyl3b0uDz9jnl3Qx9YHem2Sniu7fnwRNBnR6G/rA68bTZ+XrSccJ1ZY7tKOn9l7w4j21fjB1ivW/3zaP1Ocnaaa+7C7f4wu+LPhPP7F8Gpezt6rz9y18vXv5//P/wU3cEY41pvMeQAAAABJRU5ErkJggg==",
|
||||||
|
"objectsTarget": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAADzElEQVR42q2Wv0/bQBTHL7WCBwSeKiSq1p3pkC6oQ0XMn8BQR50i5i6wgTAlDqjtv8EcGBgz1JGl/gNZIjEgc90iVGEPEY6a4Pa98/nu7MTAgKfk4+/dO797v8i/uY9P5O/Eeh5Otbk8IkSfxwk8rVk+Rm7Mch95ZZYTsvBebiT4lGh/LUrMIo+I1asdiRMJ7lcm17HnV4rcNbzQCcakwBPyMYi98IhYeT4l9yCPPdfM80hDuRNQPc/pEpOH+1qe+2+YPP5ZyXN3h8mda5LnJJV7odtSeaKl8iCmlsqnOpc7fVPl40Uu94aGyqPXXB6MdJXTemb3QFO5v5PZ9SoqdzO5E7gqbwt5uKlyTcjj05bkiSbkTvphnFcR9mr4JlL4dJnJP7CrNCUfG6i8ZVe5byh8BZWRzm5A4RFTErKHr3WFb7AYIQbupnDaBPk2IRpupCkc3eO+eMtuTeE+/if1OsFjtRU+wUi4eefjNSi8DfJL3R7sLmeO4xy/f7XTOddhI1/yE4zAddtuoF+p5C9w+U2nc4YLaUtwjJ62Dc8mLpQco+e4A88pLNwVPNFheRX1W7DwwhIcr2UB9RfgqL7kcOzbJdR/hjgaSg7XMlpF/bkJfhV8Crl4+BL1n+CC9k3BIWq7a6jv4C/JwV2X66hvQJpdSQ7JNfyC8jM4wR/JwVpkswccN5IcrO2mevjyQ8lfwVcOmP4HXJDgY7DbBzF49BvYNQQHu3RgN+BIx2BXcghYCrvDJ5w4wZ3klhf+HtjNDdv+BbVGcB/8TNY6F+BS0owvKoKDn8m6vVW1G2TH6Uu+EHuZfs+LKnJ/J8j2nwSJtAuJss3PA5ktOXzvaXr+E54YD34v+jlK/fN9xs/cnzN+5v4v+rmb6hdVP5feL9zqMI0H/CU5xlUaPyYvBDzewFoabxhXMg7BWi+NT0j87uPxDH4O0/hv8gLE8wXSIc0XLCtKfkEepfmFdULhkEc+y8es8D2cv21MQ5bvuFDhsLyL9QG7jMJ9WH6F9QS7jFpnWHmD+oP1qf14vaJYCCnUN6xXWqFOYj2cVydjwsqbWifHrNtFrCmNjMfr85RtfMd26yr1nBWg8IA1pb7aFzTRRjy1X7DCx9/Q1hP6kSv7Ua5/+U2xUa7f0Vom7+X6Y7SSya/0p/TfaTWzG5n5/p7Z3bby88AkO2YrPz985RuRp80b1Ejll1pxnuHe1IvzTzqeFOefhFjsKovzUtl8BfNYEN+Hs/MYzG8H9WR2foN5L6nNmffK5sPSebJs/iybV0vn27J5+Nnm7bJ5Psf/A67d6k1IisxZAAAAAElFTkSuQmCC",
|
||||||
|
"progressBar0": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAiUlEQVR42u3UoQ2AQAwF0KKQWNzNwATHSjgkNwFho0tOgGAIEgSaYCBpDhjg11+glU80TftTumF5UldXT9G5CBfyM3cH9LGEvq/lJvhssU8Guht66EHwu+rhnLGBnsfWwD0w29/mYSFQmSeP/NUOek0Fas9EBnlU/4pLd5dyIuVKyqH+bXX15P0BRBCejozMPEMAAAAASUVORK5CYII=",
|
||||||
|
"progressBar1": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAA7klEQVR42u3UMQrCMBTG8YhIwcVJ6JYr6NYtbp0LehC3bk0vYPECLi7iKQJZHDyE0sFV6FKhJCqVqu33dsG88cef9kEfZRaOYs6dO/9BV2Vf34DLuJ8WwFeB9ZFvHn4BboKRfxRdrwLPP/Cul4lO11nXrzbXyM82t1PgutBmCVxOPBOD98qAV5X423s4MTA9xRTyh0roMzbc15N9Pr5ibLyoh3+6YU0vWv7q5wnudxb3kcX9luhDos+InhO9wP33+u/+e/13H1ncb4k+JPqM6DnRC9y31m/61vpPH4D1n9+duhPqrqg7dP9t585/3u93SkjFUCzChQAAAABJRU5ErkJggg==",
|
||||||
|
"progressBar2": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAA5klEQVR42u3UsQqCUBTG8dMQQotT4OYzuDkIt81ZqAdxc0ufQHoGF+kpBAcbeojAoTlaCi7edDA1v7ML3TP++KOX60FScArSrl37Aj32zPKN3DWSJ/D0VVnQH7V1R89p/SqAh7V1secunTo5pXNvnLpkXDnAPbdqQuAUGU0E3ptIU0rxt/twIzCrggrkrcbQd7Q5j6a/fkm0PYymv/6Gpr0YfNzvj7jPFe4DhfuM6X2mT5neZnqB++/xf/pc4T5QuM+Y3mf6lOltphe4H44/7Yfjd74Gx+++O7cn3F5xe6j/29q1L94/+ZwRM/Tj2IYAAAAASUVORK5CYII=",
|
||||||
|
"progressBar3": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAA5klEQVR42u3UsQqCUBTG8RMRQktTcLf7DG1ut61ZqAdpcyunRukZXKKnEO5QQw8ROLQaLgbiSYUW/c4udE/bjz900IPEcFJy7tz5CJ38qf1gjwrglc8KesjqBbwMF+phgJeeuuuh52yjczz0N2cWedb8VsBtYes98Fvu1SH431Opq8r87T08CcwkpRR5o0foa5pf+9M804pouevN9sBc07C/cOeDPmDcJ0K/EfpY6LXQG9y366O+XR/1AeM+EfqN0MdCr4Xe4L5bH/Td+qAPGPfJz2dg/fa9S3ci3ZV0h+677dz56P0LdFTgaNorlhkAAAAASUVORK5CYII=",
|
||||||
|
"progressBar4": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAo0lEQVR42mP4jxUcYBgVHxUfFR984vIH/vAf/okh/k++oYK98TOG+A/5norjEtjE5QwfSzzHYj5I/Iw9dvET8ljFGyf2YxU/jEP8vyEWcaA7/xViiP9gBvrrX4U8pjgwHP78sR+x6eEBAxbAeIDhADZxoGgDVnEHBq5VWMAKBgbRUCwghAG7+lWj6oeaelYc6nGlE1zpClc6HC23R8VHxQe9OACi8J4xH2oOzQAAAABJRU5ErkJggg==",
|
||||||
|
"progressDial0": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACXElEQVR42u3Wv27TQBzA8Z8bKR5Q604whMZPwMBSVULB4jlYIhhgyCXNgpBA2BAhXoNH6IAu3WorA2vHqFeplpiDzBJ5cByc+2Pf/XxIMIAYakWK81H89SVxfAdb6xbDrf9zD+xe+n/X9w4Dm8d7h2DxAir32h7vHFpeAjz2AXzsOXjf7xXgYo9hQ3sT7aXcAY+yAS0gML2Ad4ys2STyTM8cRmj1SDumpx5n9tYxPRpwJnMIdS9hLTos9nUvOpJJ5umeu5Lp0tU9PZLMxo7u8SvVmUe6R4qrE4eaOyvFJA0aL9yaae41nh80nZFb+4+sR5oDOrVn6aBh5nyrfbhumEQL5flDjWkyU17oefbcVV56VD/Aq8fZ1fnaV76Z6Z3XQX3ehd45e1H7M71z+bUef6h3pvU4U53JxXvlsf5xq19AeWIwSZUbwyQ0C5UbzE6Vd83OeSC8dM3O0pe+b3ZG0ou+2dl9odx7Jl9JzwdmZ+JKPzY7c+nZG7PDZtIRE+VrNJ6F8BQxeyJ9hTqJ8AQxTaXjzlD4Ao/nTPgMdy5D7h9w51T4J9w5F/4Rd5bCu7jzMuDutjrC93HnWvgB7oy4l3dw54vPvd0Rji8HNhbewx0q/AjzlfC79k7R7njc2x3hx7gzEf4Id+bCH+AO+0WH/GZnY++M+/ZOffM2OtXNOGl3bqp5DaatzjarGE5Weme7pdXTbrsv/yA3/PqMOtsIhD+V1yGElYMzFAx9mf8MAfcL+f6+nDVS7lVH9UM5+fGO3N25Zd7fjf/Evh6IpnaPE7vn7p+tN27Xe/+R/wQBUibT3x/mZwAAAABJRU5ErkJggg==",
|
||||||
|
"progressDial1": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACw0lEQVR42u3Wv27TQBwH8J9rqR5QcScY2sZPwNClQiqpxXOwVHSAIU7KEkWC4oMIsfAQPAJI6JKhCEcZOtIxyqFgqQNTkLtElnAd7Pvnn9NbGEAMjTr4Ps19ffe7OzuwNH4iuPF/7r7Zc+/v+tqmb/JobRMMnkHh7nWPSodrngMceADeqqfg/rybgbPqEVzRrQ5qygtwKWvSDPy6Z/CSBQvWIW7dE4sFtPiL7brHLmf2wqo7aXIOBhBiz2EhcljkYc9syUHiYk8dyXTiYI93JLO2hT3qqpwBwU4UFzcOkVtzxUHsV545mmnqVp7ernJajvbLZCuoOtjak7hZMbMutB8uKg7IWHm6i5iO+sozHM+OHOW5S3EHV49zHfM3T/lVH+f0fH3fMc758ET7Y5xzfqbHH+KcZ3qcMebgyyvl0eIX/k+kfMQ+4w6x8n4wwzdOQuX0B845Vr7OjnDO0BeeO8FHnDPxpG/QyRx1aEnPGqzVXSko96L8+4in0tMmne6gnI4jfY918AoMpCfPg0FtBfrSi8sRnoDyYpfEeDxj4aUlJ6jDQ+nFpHoN1GEkvMw+dVFOLL24nKGdzg6Fj8tjZeMdIbxfzgWdGHoecn9dtki3tjClvy1bEarcUPgbPgZUuYlwXrNjdMSe+tz5M2Bo1xa49A2+uy2004XzhDagBeae3+ItqHI+edx5DoMDfGJKF6UkVeXawsVpjFDlhIsZHVaVmwq/I4pYVU7kyFM9gQXacKWLnBbsow1X+p5oga5cR7j43hR05QbC74kvgX6GMpwzILaeAM5hERhzghhOTDk0gYYxp6dvXM85BcuYM4NdY04b7s9xznKpXi3bsnLf+f4kqvBk+5HchxAWDpZ60DbkxXvwucthkIbcuzF3Il9xy3cPQvny4zn68zUzv/fPUrNfXJo9Hpk9df7s98bN773/yH8D54AvVfwldP8AAAAASUVORK5CYII=",
|
||||||
|
"progressDial2": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACjUlEQVR42u3WsW7TQBjA8XMs4qGk7lSGqPUTMLB0QcHiOVgqGOiQS2CpkEDYECEWBkZGXgApQ3WpBBKOMnSkY9SLwFLnIHeJPLgO9n3fOXcXd2CgYmhUWddffH9fL64csqx9ReTGr939es+9f+uNLb/Oo8YWqfGMFO6ue1Q6WfOckAceIZ7pKXF/38mIY3pELlm7r/yKA+Iy3mEZ8XXPyGtOF7wfuronFqes+Ilt3WNXMH9l6R52WNmhIxKonpPC2NdiQuSpntll5EsxJ3FVTx3IUzZ1VI93GHZ6lurRoeyMQtVDLjs8ChS35uWpZYfG/sozR5wqLpK6K083RWS7PHadyi+SdskjcWR25UncWXW4dV75/mLVoeFEenqPK53xQHoGgJ0njvTcZUqHudU6m2pn5km/HKidF3513YmA/q6YNnxa+WMIb4jj6Um1/kDAWUtMe16tM4Z8D3bp+xvp0ULt8Ej6mKsdGksfaB2WBNKZ1nkmval3jn3w3NE7Uw+9pXe66Bn8/eynfN9Fx+3vyuugp/Dp0iO8Tt9B34PzZrfg/RF68lLv8AE61TtU+kLvsAl4zI3OQ/S50RmDj5nRidHNzj74BKd/k50huNz+qY2D00D4W5x+0ODVB1P6e5x+bMsB+DuzMwVvmp0DX7iz1gFvmZ0Z+KbZ6QrPN8zOkSd8vQO+a3Z64G2zw8B35LZYODgD35bbYmkdeVvRoUWrG6709Q74ntnpg983OyPwu2aHX9Gh19uJr+jsk/pOROZqZ7nE6RHBf5Bf4v4MbZwekke4MBIUTuQyPjZw8Jn4wrHzqXmICxMe4iNu+eF2gA8/0aleP7L65/5JWu/nF/Uej+s9df7u+8bN973/yP8AnFAiX5+Wj+sAAAAASUVORK5CYII=",
|
||||||
|
"progressDial3": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACtElEQVR42u3Wv2/TQBQH8OdGqgdo3akMUfBfwMDCUgWL/6SiAwxxEpaqEhU2RIiN/gcVf0IG5IQJR5HIBh2rXAQndQY5S+TBdcjdvfM9u14YQAyNqurykf31u58OrGs/Mdz6P3ev3nP37/rWnlfn8dYe1HgGG3dueiwcbngO8NgFcKuegvPrXgZ21WO4jpo98hUb4ESsHWXglT2DV8xfsV7olD2xmB9t/nij7NyRzE6tsodtyf4IAuo5rFQOi13qWQPZTxzqqY0cXdrUeQuZdS3q8bHOGYXUQ82bBwfErZ+afe4Zz+yCo9Qxnu6anI5d+DJp+uaGRuEJbxtm1lXhhyvDfjjVnj4kHE0G2jMaz45s7bkT0Rucos5tygtX+/WA5px4xXOnNGf4rPCnNOdiVtQf0JwXRZ2csv/5tfaYdnfEYu0TVrqBay+V2V0lgXZ69SfW117q7tIfe8pzuzRs0aWLvkNzvrAOenaflnkmB1R6afhb0Rw9pbPb3Wc9G/0RyRkf+CP05CXJSTb/B+g0XiwN7XTYxFhNlXNaphirJ+hmMUffxQqeKJ+Q+I5YwRydlin6eKh8SssUG22onA4/F328CKS/oYtZ9LGv/B0pE0RtY+VvSZmW3NvKyTSeyvPguSedTONQtsfKyTRy2V4oJ5s0llPakZ7fIWXKKf3oSt8hZbZxxwg3y2EB8lzpKjfL4QRUQ3nLlKnOlbnyfVNmIzI5ZFnF23oHCy9yeqBO17lys6xAXdJTfmDKVI8aKX9gysRLKjkJYKOSE+MpXc0J8SVQyelCozZnDHiMVnI47NbmHEGzNmeG3cWc9RpzvgLe+UOuz1C/Q94DbrQ+BBsHC3POdXc/gCcdc87hWBfmyRx8RZ7dDfDlJ3OKz7es/r0/S+v9alnvfFLvqf1nvzduf+/9R/4b6couiYOY0EIAAAAASUVORK5CYII=",
|
||||||
|
"progressDial4": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACWUlEQVR42u3Wv27TQBzA8Z8bKTeg1p1giFo/AQNLFxQs3qSiAwy5JCwICYQNEWLrIyAeoQNysuEoQzfUMepVwlLnIrNYHhwb5/7Ydz8fEgwghp4yJB8pX//iWLqDyrpiuPV/7r7dS+/v+s6+b/N4Zx8sXkDtbtfjrUPHS4BHHoCHPQf3+70CCPYYNtFgon2Ub8CN2DAqwDe9gDeMZmwSuqanDqNR/Up6picuZ/baMT0ccqZzCHQvIRMdFnu6Fz3JNHV1z4nkaE10Tw4ks7Gje/xCdeah7qHi+sKB5s6NYpr4rRek4Sh3W8/32s6INP4jHdD2C73G02TYMnOuGz/OWqbhSnn+QONoOVNe6Hl2QpSXbqR/wW3m7Ot85SnfzPTOS7+57krvnD1t/IneuThv5g/0zvNmzkRn+uWt8lj/ufU/oHxpME2UG2PSKA2UG8ymyvtmZ+ELL4nZWXvSd83OSHpxaHa2N5T7wORL6fnQ7EyI9COzM5eevjI7bCYdMVWeoXlWwhPE7LH0G9RZCl8ijhLpuHMsfIXnORM+w52LgPs73JkK/4A7C+HvcWctvI87z3zupNMRvos7V8L3cGfEvbyDO5897t2OcPw4sLHwAe5Ewg8wXwq/a+8U3Y7LvdsRfoQ7E+EPcWcu/D7usF906G92NvbO+NDeWRB7J6mfS1vnJASnsnTOoV5BqTpVJTtft17veNk3/nyGag85BbGCKQS1gyM7H6U7n8DnLjvKg4R7KLe46lT2q5R3msWvG3T3/XpOx3YeuA7t54TtfbB5Tv7svHF73vuP/Ce0kyhgevPCZQAAAABJRU5ErkJggg==",
|
||||||
|
"progressDots0": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAoElEQVR42mP4jxUcYBgVHxUfFR8VH1DxP+woBFz88Q8UAi4+/789MgEXr2G/j0zAxP99/vkeiYCL/z3/rxyJgIv/3v9/NxIBF/9e//8uEgEX//b//1skAi7+DoQQBFz8LUgLgiAofhvopHoEQZQ4gzSMoEycFHtJ9Reu8MEVnrjCH1d84YpfXOkBV/rBmd5wpU9c6Xk0v4+Kj4qPitNfHACn+Bo8YhiGeAAAAABJRU5ErkJggg==",
|
||||||
|
"progressDots1": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAwElEQVR42u3TQQqCUBDG8S+CXNUFopO06FhtAruJB2mRN2gbRLRoWxYEz8J8kzU2KDSUBLUZF3/hh6DvvRH08ophbm5u/le/BrWIb8+1iEc0qkZ8Emyqebo/tg7kT5cy4nmMMeULX0Y8m2JI2ZxmHPEUGFAa0poj7oAuOaI9RzwBepQUd474Dujcn3Oct74E2uGq+C7OR45+QY98503e23Rd2v5o+6ntv3Ze2vlq86DNjzpv2nxq82z/u7m5+e/9Btpp4iJQL2EkAAAAAElFTkSuQmCC",
|
||||||
|
"progressDots2": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAxElEQVR42u3TQQqCUBAG4D+CXNU6iE7SomO5CewmHaRF3qBtENGibWoQaGG+SRsaFBpKgtqMyPDzweM9542gl08Ic3Nz87/6zWsU8cOlUcQXNK0X8Zm3r5enu/M1IXfqJJzEi7XzqQjhcxLPV7SkfI4JJ/EsoB1lwJiTeEoUUQr0OYnH1RsDA07iUbXkCPQ4vfVteaRgA3SDR/rIMSwdo6+9zb5tv0vrj9ZPrf/afWn3q82DNj/qvGnzqc2z/e/m5ua/9zvyr+IiXMvuKQAAAABJRU5ErkJggg==",
|
||||||
|
"progressDots3": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAvElEQVR42mP4jxUcYBgVHxUfFR8VH1DxP+woBFz88Q8UAi4+/789MgEXr2G/j0zAxP99/vkeSnxgfI8Q/3v+XzmUOMBQjhD/vf//bijRwGCNEP9e//8ulGBgkEWIf/v//y2UYGDgRYi/AyEIwcDAhxB/C9ICJt4wMLARFr8NdFI9mLjBwMBcT5Q4gzSIkKBYnBR7SfUXrvDBFZ64wh9XfOGKX1zpAVf6wZnecKVPXOl5NL+Pio+Kj4rTXxwACwTiIq5kKFcAAAAASUVORK5CYII=",
|
||||||
|
"progressHourglass0": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAB8UlEQVR42t2WsU4CQRRFMRZWZHsavoKab7AgWpgQYkdFaeV08B3GxkAi2FmYDHGifAEfsKGzWgqTDVn2uW8X2WHenQSjRONUm7M3s/fNzrszFYJjWvldHlc242SXR5/8eH9+xA8LoFceXvfwL3zX559mm/fuOkw3+n25b57/yl9a+Th3+eswH3ff1c88+udCP3H5otCfCl7oH1weFvqOy5eFfuHyaJ7rjcvjLstHA5cnDZafBS5Pa6y/r4u+q7L+oil4n/WPSnDD+p7s35D1oeR5AUZyLmBr3+JcwNa+xbmArX07N6qWfZv3Lfs2N5Z9m4eWfZtnBRjE425p3+ZJo7Rv87RW2t/JvWppf4f3S/s73PRwfoY3mC8vPfzWM08HczPBfHCFfQZPsK60fg3XIWlquG6xUnCdI9Lwv4Sk4H80pCPEB6RitE8C0gnYV2mdVAr2YabVBPZtNrcisM8zL5pAX2TeFYE+MqyPJB+wPpZ9GrA+EX3N1hWlIgdYqYlEbvDMikjkDDvRRCKXlpTrRY6FhT4UOVnol4hrwPmDbdouhH1epCN8jqxbmL8NMZ+3FOLpcDhGfJ3lFeKrLN8Q5zxEnPNTA85525Z8xfqx5O95/ktenC/xvued93w87L3lJ+973ntd08ODA973/ti9WvAPeLUJTL11Ut0AAAAASUVORK5CYII=",
|
||||||
|
"progressHourglass1": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAB00lEQVR42u2WsWrDMBCGUzp0Ct6z+Cky+ylEOhRC6ZYpY6Zqi5+jdCkKNB0zFBQQbZ8gD2CydXKGgAmO1XPiIMv6BSkktJRqiMyX39JZuvu5loZj3vpZnrWqcWXz9MAvj+cX5cMS6LmHhx7+jX198euP6v/mOcwr/bHct84/Py1X1T03eZUfq2N5Yk2Gr6zXDE+t7Q3P+G6KmzyPdlPQ5EVofq26C/S2f3irzuNCTA671LnaMsZTt36TTyFk4vJ0wVhfuTwbCDGJXZ53GesFLi86QjyHwDfajN1EgI+FmHHAFWND5D+JEAni9AEK8Wxgwq/zvGvCr/OiY8K3fK9twrf42IRvcTXE/pk8YL668/BHzzq3mKsXzOMRjjN4hd9VhPfwHPJIwnPLOIfnnGoJ7yXRHN6j0jJFPNY8Q3kSaJmDvKIS4gXIQ9JKDfKW1uYa5DnFIjWoC4qda1BHqtSDuotLPajTQBcS1DWFTvXu+gApN1PgG7Tyugd8hiIRAvgS+Rj5g+tjiS7IH1zfW+o1+QPyT0H+4PLSfmoGZHx7Q3oxdf18UeqZy8VuuHwnZ6Mmf9/rZ03+ttdfe/RPf01/5r7llP2et6+LPDw4Y7/3y/pqh38B9mUeE1Ss9HoAAAAASUVORK5CYII=",
|
||||||
|
"progressHourglass2": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABqElEQVR42u2VsU7DMBCG3alb/QQoPAIj6kBeAledQH2IbkgpUxhQty4s7Gml9g1AyjN0b9ZOHTtYDT5foTn/RgKEYEmkRs6nz7XvbJ9VHX1eVctb/tf8XqDsg4tOk/TH/LLJp1/gSmmGVqme4B3mm5CrjAeV/LnepJ53ajsV3CbUOOiQ135gmwLPqbHPgJfU2NXAK2pUyHfUKJHvKYAcuaVPjfyQ8C/k3k0jPOcxgJc8J+AVxwB8xzEDd3+ex7ibjI7xQ0LTl3xGb+1DFvzphQLwKZL+LQXgUyr9JQVQAZ8ZCqBEv6AAuhHfDWB1xF9y9iW/mBnzvp0FfyqoA/PHEz93vsmQK+cXxZE/NDj55iYB7v0Fz3MS+sMucO+vyrg/quL+Mc/gu3UxEX+u7VUR8Qdu3V1awV+kda+Yoz90+8plCfyVW3nqFvojt/JrY65Dn/b5NuLTuRijP6dz1Ed/QOfuDP0FffbQH/pzjf7K1wH0R75urMHnOrMFn+vSOPSXvBn6oX93rHvSb9bJJm/WVSX4qQ5LfqrbKv31e+S7/LN7rb33W/7P/A2qqP8PNx6qQwAAAABJRU5ErkJggg==",
|
||||||
|
"progressTimer0": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACJUlEQVR42rXWO27cMBAA0BFUqJRvwCukdKdruTBA2jmIr6JUuQaNAHbLII0ECBzzI4kzIpmVkM02KzxwqeEsORzA4meE265AFh1gKLkFEEUXtuwD3sdr8ze66NjoYvz4osvr/f0LT/u0Pf/kbiQagBbxO3cXigJwiW64j2JxDL0F7q+99t4sD5J51/lpAJ4eB+q2f3WTuKkengX1RYw+GBeS7alPgw5/LjTYUTdyDAFqWBewukYVxk0gf1B/t3EvuK93Nn5xS/1wU6mejTdPzrzrjs0/fXNRfs5uQMviWaCPHh7Iev1rva/v3/PjV+UdYeCOq488b361Ph7UPG/t5obnzUf3Iben5P3mC89n8pblR2xuG+bD5sh8lFs8qKgr4pI62bHUm+TxcPzdbZvciNu+Lj6l5Jb3yRfiE/WOeDroaE+4od4SH0gpPOGaenPCJfGXf/DnPdFaEB+pK+p/9mneqC/Ex//hezyTOONYmedeLit5qOStlue7/Y8X98/V/Vnb51fPS+3c1c7p1fN+tZ5crVfVuqdSyWZ1ciSe1eEZszoc6vaMWd0OdX7GrM5PybvsHpkxu0fCrwPxeye8LbgW2b02f2b3GqphdZCHfiP6sd/QffTl0J+YNrppD/1PE+PRHXd/73tXPffUJxz6q72vOPjehxzcxL6lPfoU+5zu6Db2RSLr62IfJTOPfVfeB8Y+rdAfKjIN9dgHFvrJ2vPVvp35F2dRFhdh12CjAAAAAElFTkSuQmCC",
|
||||||
|
"progressTimer1": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAACuUlEQVR42rXWPW7bMBQHcAoaNCo34BU6dtMpBLdL3bkn8GCUTHqMDNnpwRcoanXqCbwzKGCvLLxIgCCWH5L4nkjDLtp6CfHDPzRJWXyP6OSnIbedE5Z0QqqUD4TQpNMh7ZX+N35t/kwmXWcyuX79KNP7/fVT3+3tNP6BXTGtCMm1/oLdLIUTYg46w97Q3jApB4L9qZTWs/6BIS8KOw0hm7cV9KF8MpOYqR62FHpPG7sYs6ShhN5W0j1ckukCumKNW6Ak4wZGl5q7XEvYd+ivg/st7M2fV5TvzVZP2VHzEuXVxkx/ysRBFmj+9o1Z5bk7rlSO1tOT0rrYuQHYr/3a8/tjPRC0X213ZfLiQCrs2s1frxt8bna3Zj1iL/G55c6P9Urhc7OrOzEhdi1aZ1s6P9Z1j8/T+SchhJsxnA+d8p8z5NU4vzggb9i4nnrNoXM2rl/s3XB2v2uTXzXQx1+fye/8y4G8th/oQz7FxU7RyF0e+rh5mxfuSLC7/AZ6GfJfgfv/9fltAZyG/LfYXf4DcAXzOfAq5Nexu/weuIT5LHKfh85CfvUYuY2bayiZZ8i3+ZSXFHjj3eY/Ug79Ms//DL2/zPO/NJG75/vcJPPrK/kDzs/reUdj948Iur7MN+rL/3AGnEfn5t9AHp2z9/i5jGXjL7wCnt12BT2/w0MBHN9N9F54L+7wMnhfRO+pDmP0Xocr8IYPefDEfRL5dF+Fs7rhHFRqtrwn/ZWN7skGeHQPd+Cr4L3dzZUD3/PdXDlwXejAkcA60s0jXHcc4brjvs25pFFd684WcL3j1eiELfoN78t+Q5be+0V/onLvKl/0P5lfjyyw27pvnZfYxzo9levQX819xcLnPmThyvct+dJb3+cUSx98X0Sjvs73USxy33fFfaDv0xL9IQfTQPd9YKKfvDb+074d+W/1dr0hXblJ3QAAAABJRU5ErkJggg==",
|
||||||
|
"progressTimer2": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAC3klEQVR42q2WsW7bMBCGKQioRmXPwFfo2E1PIahZ6s59Ag9GKaePkaE7PXjtUMTq1CfwzqCAvbLIIgOCWPIoW3cihTppvUT58Pt8dyLvfmain4b9nddMRDljRYz3jPEo532cF+b/8Ln4iYpyk6ho/mat4vX+/mWu5u35+SflWhjNWGrMF8ptKjVjttEJ5Q3vLGZ5zyi/z5XjSXcjCM8yF4ax5bsC8z6/t0FsqJsVx7zjjUvGptTnmLeFgpfLEpNhrkUDCSo2FDBwZWrQtUz8wPyph7OwtX+eiL6zpR6SvalzotdLG/6QyJ3KSPz2rc3yeNpXOiX5dCx3XG7gAdXrfvZ4ty97Ruo1riqrlztWUG4gfrloaN9ctTYfuVW0bynwfVlp2jeX3UFIuWlJnm0OfF+WHe0n8E9SSog49oef9Z8TwoshvtwR3oghn3JRY16LIX+5hccL91VbfdVgPpw+q9/4y0F46T6Y9+lZLjeaBxz0mA/FO72EllAO+iXm+aj/jrj/rtevMsT5qH8MOeg/IK6xPkW8GPWLkIN+i7jC+iTgXo+5GPXVOuBObsdQVC8IX6VnveKIN547/UdeY/58if+Aefd8if+1CTi834cmql/M6HdUf8nnPQ+503+7xdzMxDcz8Ud9OaM3RC9QvXXQN+jnbR302ffzX96XQOdhHT8/1RXn56XnU+Pzn77+vrT4PmbBPfX3MX/9fUfzRF4zT4a5JGfmlftCRbife71rD5l7MBzbzOnJnARR+wbmZzCHT+Zy3cncPrn4j0kw5+16se1Jg70AeroXYHtAfLpH4L64fDZ078CecvlXigd77XSw14XuNVPbf09HezyZmPgNr5/6DZV7fTfxJzoF/VanE/+TQD4LlVHu9r7N3+59yv2ers7revRXzlf0zldM+MWHTLj2viWd8tb7nGzKe++LeODrvI8SAfe+K/SB3qdF/GGNwmDufWDET849v9S3E/4HKuJgRipvQikAAAAASUVORK5CYII=",
|
||||||
|
"progressTimer3": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAADJUlEQVR42q2WvW7bMBCAKQioRmXPwFfo2KXVUwiqlzhz1y4e3FBJHyNDdnrQmgBBrE59Au8MCtiAJxWGATVQyPJHou4kGW2BckiED18ud/w9oiZHSf7Mc8ImOSHJFJeE0ElO5TRP1P/hp+IHYpKrQEzmr67FdL0/f6i/5nX3/R3ziqmKkFCpr5jrVHJC9EQHmJe00ZjEkmB+EwvDg+aMIR5FJgwhi3cJ5DK+0UF0qLMlhbyhpUlGpyRjyOtE2MUlgYogr1hpExSkLaDlQuXWqwn7BvmztHuh0L+ekd/oUrfBRuUx8quFDr8N+FpEKH79Vme5+7XJqhDl05DYcL6yH6Be8293s00qCapXmaq0z9ckwVzZ+Om8xPNmqtX58ELgeQst36RZhefNZLdlnK9qlGcdW75J0wbPp+WfOOc2Yj8/tPOvAsSTNj5fI16yNp90nkOeszZ/XthPz13V2s9KyNvdp/2VOxyIp2ZALsNO56uKjrj1IW+LNz63U4K59ReQx73/CLj7W+cvI8Bp7z+NufUvAK+gHwKe9P58zK1fAC6gH4y48yFnvZ9dj7jR9TU06TPEl2HnCwp46bjxL2kO+cHHv4W8Ofj4d+WI2/W9LSf9+Ql/jX2fz0eKOW/H/Tnk6pC2A8dXh87H8Y+fOz894SvkMx+f3cF5WPh8xHmO5rnzLyleFx9/sF4+PuJX3I8C8vc+/TSD++QD8AO4D3sf7U/oQ057/yKE56L38XkBPuRx7z9G8JxuvL9E53rvfXzeex+edxn2Pr5Pjt6HXAUvnT64r17NzJhFyBDPpdk65keB7r38i9makfHRPVmaBbt/Y+9PfA9rdab8ce/vba0+mPhPAb7ndcEzOz0hfhf2rY/fhTo6tvHxO9KELy6fFX53pCnY5J+JwXunN+jDVteM3zWVJ5t0ttPbk7BBv7G3/rDfEPHR+s2gP6lCafyiCgf9T6BMPnMRYa7f/b3OX7/7mOt3+nWusu657vsr01dI01cMuO9DBrxyfUs45LXrc6Ihl64voqO+zvVRbMRd3zXuA12fNtEf5iAM5K4PnOgnT33/a9+O+G9KZg5hxzWVdwAAAABJRU5ErkJggg==",
|
||||||
|
"progressTimer4": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAADGUlEQVR42q2WsW7bMBCGSQioRmXPwFfo2KXVUxCKl6pTA3Tt4sENlfQxMnSnB68JUMTq1CfwzqBAAnhSERhQAoXsUbKkO1lGk7QabOHDj8PP0/HumBt9cvZ3njE1yhmLx7hlTIxyYcd57P4P3xefm1HuuBn1707N+Hl//3JP5mX7/pPyQrmCscC5r5SDlYwxSDSnPBcVYBZZRvlZZDzn1YEiPAx9GMamb2LMbXQGQSDUwUxgXoncmwFLNsK8jE39cRl3IeaFymuDhm0PsOXGZbWuZOoH5teWCevcAv6uib5iavORr1wWEX0x5U7fcL00IYlfvg4e5fH9KikC4qdi0YO+vddzeCHnZWIjjycraRk5r2Ox9nq9ZDHlTvr4Ms1p3rjV3o9eGJo3sCPBv0wKmrfwAfRK63lJfJbRBvRqJWVF8xmtQf9Ja10FJD9itdWfcMLBfh1fLwnPlWz8yDTDPDvRjX+9yBTmYF8qB/okx5yDfe0c/Myby9FysL99MLeB19fPvBCY93rMq3Dd6nUZYb7q9FPMo06uvyNeRr1+FiIuev0V4Z1cvke8wPoA8bjXp5i/6/ULxA3Wc8SxHvMvvT45RVy5Vg5tiPBWrgifBa3eCMTzWdDqP4gM87su/jnm1V0X/1tOePd9z/NRfbpHv6T6zs+RoLzVXxxi7vbEd3vibz53+dyjd0Sv0HlxHqZ9Pg8zkuc+n//yvU5QPWD+FtXDE+rnufVZ4PoPXn5fSnwfQ3xP0X2MXn7fbdDrn9JPmn7V1CftV76/pf4jJIRn1peO/1mQvpf5C3kUej3pk7n/YBev6v5J+zBIJ6677n3fBumlj3/FaZ+HA0/q9AR0Lqy3ejoXynCzjU/nSOUbrvczp3PH+gN7/4kZzDso0MsbODOday6LV3JyC+XJ1GDfWNf64b5hYIB5fTXYT4rAev2iCAb7D3feT2pCymHur8E/zH3KYU4/pi5px3W/X/m9wvq9YsC7PWTAi2ZvCYa8bPaccMhtsxeJnb2u2aPUDm/2rt09sNnTRvbDDIXBvNkDR/bJfe/P3dsJ/wMGWMEfZruZ5wAAAABJRU5ErkJggg==",
|
||||||
|
"progressWaterLevel0": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAz0lEQVR42u2NMQ7CMBAE11jCDSJtCgRfoKTLV3gJBCHR8iVX8AzMCzBdJILDLhIdBSXFnbSXu/HExvC1IowbN27cuHHjxo0b/4k/9b2pbZmHhot4p+nMlIbtru0onqXtmX7BlsSDeJLmmK7SxbSKFz9RKzVR1mUHWr0T99T6mlq8ko9pddhGFB+ozri2awpB27KJ6PyOr03CULBshvcWV1VE8nyqnTr+vaqG5Lih9hFw2WcELFrM0QM5JEyhahgeASTARkPEpyZqa2b0Gf6rXmaqYCuI4ImXAAAAAElFTkSuQmCC",
|
||||||
|
"progressWaterLevel1": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAzklEQVR42u2NMQ7CMBRDHSKRBdG1A4IrMLL1KpwEipBYuVImOAbhBIStEiXFRmJjYWP4lvz7/eImGL4qwrhx48aNGzf+A3/qe9PY0g8tF/FO25kuDcdd6SieVdvT/YIjiQfxpJqju0oXs1W8+Im1UhNlXXZgq3finrW+Zi1eycdsddhGFB9YnTG2axaC0rKJ6PyOr03CULBshneKqyoieT7VTh3/XlVDckyofQRc9hkBixZz9EAOCVNIDc0jgATYaIn4aKKxpkefxWQy/YtegRuKvotww9gAAAAASUVORK5CYII=",
|
||||||
|
"progressWaterLevel2": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAAAzUlEQVR42u2NMQ7CMBRDHSKRBdG1A4IrMLL1KpwEipBYuVImOAbhBIStEiXFRmJjhO1b8u/3i5tg+KoI48aNG/87f+p709jSDy0X8U7bmS4Nx13pKJ5V29P9giOJB/GkmqO7ShezVbz4ibVSE2VddmCrd+Ketb5mLV7Jx2x12EYUH1idMbZrFoLSsono/I6vTcJQsGyGd4qrKiJ5PtVOHf9eVUNyTKh9BFz2GQGLFnP0QA4JU0gNzSOABNhoifhoorGmR5/FZDKZTKbf6wUwPOKl8QPByAAAAABJRU5ErkJggg==",
|
||||||
|
"progressWaterLevel3": "iVBORw0KGgoAAAANSUhEUgAAALIAAACAAQAAAACHQw5jAAABP0lEQVR42u2VMWrEMBBFRxGsGrNqXYT4CltuFV9lj5EqVlhImyPkKoKFbJcrrHKCKJ2XKFb+BGxsGBdbBRJ/mGHm+VtjJGNT/srQO6cG8cnFKXvKLVdHRFcjfXD3xDyybY9IFVJgbpgHtilEa5E8XJ1m/gJbVwJFXuwRrqSYa9hSCZt/A1/B1VLjqdMG1mu0bgeD4W5Te2r1A6YVJne0qfNP57fWU9AY5dYKd29tDgodldoTqagjGaoc3VAiiibQmlg1ApeIQIjuufDUq+C0Q1z1xaJFi/60iluZ28aJ3Jy9yPU5iFxlmesZvsry+kUz8/z/5qTuZKyizM2F3IYZfnDyuR7kc61fL+P4qYmq0mCZ+tuhfHZjPvhV8iKnMVejuZNXrjnK3O77aeo03hEzNGqyUcbNnJdfPjqLFv2+vgH+JtBJ4nz/SAAAAABJRU5ErkJggg==",
|
||||||
|
"systemAccept1": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAQAQAAAAAkX4I4AAAAQElEQVR42mM4wMDMsP//X4b6//+AWI6h/p8dQ/2fOob6H/8YKj/+Y6h4/I+hxvkfQx07UJ4fiOf/A6sF6QHqBQDsYh9jNdETHwAAAABJRU5ErkJggg==",
|
||||||
|
"systemAccept2": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAQAQAAAAAkX4I4AAAAQUlEQVR42mM4wMDMsP//X4YEBjYGB4ZHDA6MhxgcmJsYHNiZGNz4mBjcZZgYnPcwMTj+YGJw+ADECUxgtSA9QL0A+IIPxwiZFtwAAAAASUVORK5CYII=",
|
||||||
|
"systemAlert": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAVAQAAAAB0khOLAAAARUlEQVR42iXD0QmAIAAE0IvWCtqmMbLG8MtVhAZwjBvALyE85XzwoE/QO8f5WPsd0K+An6c3Jq8sThIUUVg9qfmDDRn7AD/WMAQEJ+pCAAAAAElFTkSuQmCC",
|
||||||
|
"systemBox": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAQAQAAAAAkX4I4AAAAGklEQVR42mM4wMDMsP//X4b6//9IwiA9QL0AlQYkzY8nCoAAAAAASUVORK5CYII=",
|
||||||
|
"systemBusy0": "iVBORw0KGgoAAAANSUhEUgAAABMAAAAPAQAAAAAuP8mBAAAAMElEQVR42mPY/38Bg/x/BgbnHw4Msd8dGKLeA+k4IL0XSGdB6TioOFAepA6kHqgPAJCPFdTsOCPGAAAAAElFTkSuQmCC",
|
||||||
|
"systemBusy1": "iVBORw0KGgoAAAANSUhEUgAAAA8AAAATAQAAAABnuWoHAAAAOUlEQVR42mNoYGKw/8EAJO9/A6GrYQyv1jF8jWP4tY/hbx3D730M3+4xvH/HcO8bw90yhlvbGGDqAdjhGYsKgwC5AAAAAElFTkSuQmCC",
|
||||||
|
"systemDecline1": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAQAQAAAAAkX4I4AAAANUlEQVR42mM4wMDMsP//X4b6//8Y6urtGOrt6hjq5/xjqD8JxI+hGMQGiQHlwGqAakF6gHoBybUeX0RcSJEAAAAASUVORK5CYII=",
|
||||||
|
"systemDecline2": "iVBORw0KGgoAAAANSUhEUgAAABgAAAAQAQAAAAAkX4I4AAAANUlEQVR42mM4wMDMsP//X4YEBjYGx4ZDDA4HmxgckpkYHMyAWAaKQWyQGFAOpAakFqQHqBcAGz4QyzSHE/gAAAAASUVORK5CYII=",
|
||||||
|
"systemDotEmpty": "iVBORw0KGgoAAAANSUhEUgAAAB8AAAAfAQAAAAA31SuUAAAAYklEQVR42oWOMQ5AQBRE5yZ7FEfSKTmC25CQuILehkahkc12IvgjRqHUTPX/ew+MzsByNlhxGq7ochz90mFL9gmBFjCSGTxZoSUb1OTwTkquP/Md61cU8USWQzZ5VaCWp+oGeLZn9EklJaAAAAAASUVORK5CYII=",
|
||||||
|
"systemDotFull": "iVBORw0KGgoAAAANSUhEUgAAAB8AAAAfAQAAAAA31SuUAAAAX0lEQVR42mP4/0H+H8P//sf/GP7V//nH8PeDfB3D7wPs+xi+MzDeY3jHAER3GBjKGG4wMJgx7GBgsGLYwMAgBSESGBh4CBAIxWC9YFPA5oFNBtsBtg1sL9gFYLeAXAUAPIwyHWLMTS8AAAAASUVORK5CYII=",
|
||||||
|
"systemEv3small": "iVBORw0KGgoAAAANSUhEUgAAACsAAAANAQAAAAAY06pGAAAAPUlEQVR42mNg4LFvYwACFEr+n32fPYiS5/8P5PLLyz8AUXwQqs8eSMn/b7H/D6IO1NmDBA/UgbTzP/gHpwBcwBWO2QYBDwAAAABJRU5ErkJggg==",
|
||||||
|
"systemPlay": "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQAAAAA3iMLMAAAAMElEQVR42mP4Y8/wsZ/h+XOG858Z5v5k2POXwcaGoUYOhIAMIBcoCJQCKgAq+2MPAAFKFVmziLfGAAAAAElFTkSuQmCC",
|
||||||
|
"systemSlider0": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAbAQAAAABg3VNpAAAAEklEQVR42mM4YMBwfwPV0AEDAHmKKNims3dJAAAAAElFTkSuQmCC",
|
||||||
|
"systemSlider1": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAbAQAAAABg3VNpAAAAGklEQVR42mM4YMBwfwNFCAKuGjCc2sBwwAAAT7olG9TpXdAAAAAASUVORK5CYII=",
|
||||||
|
"systemSlider2": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAbAQAAAABg3VNpAAAAG0lEQVR42mM4YMBwfwM5CAJObWC4aoAgDxgAACpUJGftPg+WAAAAAElFTkSuQmCC",
|
||||||
|
"systemSlider3": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAbAQAAAABg3VNpAAAAG0lEQVR42mM4YMBwfwMJCAKuGjCc2oCFPGAAAPSIIz417p4OAAAAAElFTkSuQmCC",
|
||||||
|
"systemSlider4": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAbAQAAAABg3VNpAAAAG0lEQVR42mM4YMBwfwNhBAGnNjBcNcBHHjAAAMJ6IooqNLP/AAAAAElFTkSuQmCC",
|
||||||
|
"systemSlider5": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAbAQAAAABg3VNpAAAAG0lEQVR42mM4YMBwfwNOBAFXDRhObSCKPGAAAHfbIWHuFKlNAAAAAElFTkSuQmCC",
|
||||||
|
"systemSlider6": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAbAQAAAABg3VNpAAAAG0lEQVR42mM4YMBwfwM6goBTGxiuGpBGHjAAADklIK1PooVQAAAAAElFTkSuQmCC",
|
||||||
|
"systemSlider7": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAbAQAAAABg3VNpAAAAG0lEQVR42mM4YMBwfwMUQcBVA4ZTG8gkDxgAANmVH4SOiUHMAAAAAElFTkSuQmCC",
|
||||||
|
"systemSlider8": "iVBORw0KGgoAAAANSUhEUgAAAAwAAAAbAQAAAABg3VNpAAAAFElEQVR42mM4YMBwagPDVSqRBwwASoohT92wVBIAAAAASUVORK5CYII="
|
||||||
|
}
|
260
libs/core/images.ts
Normal file
@ -0,0 +1,260 @@
|
|||||||
|
namespace images {
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const expressionsBigSmile = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const expressionsHeartLarge = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const expressionsHeartSmall = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const expressionsMouth1open = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const expressionsMouth1shut = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const expressionsMouth2open = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const expressionsMouth2shut = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const expressionsSad = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const expressionsSick = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const expressionsSmile = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const expressionsSwearing = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const expressionsTalking = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const expressionsWink = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const expressionsZzz = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesAngry = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesAwake = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesBlackEye = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesBottomLeft = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesBottomRight = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesCrazy1 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesCrazy2 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesDisappointed = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesDizzy = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesDown = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesEvil = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesHurt = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesKnockedOut = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesLove = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesMiddleLeft = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesMiddleRight = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesNeutral = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesNuclear = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesPinchLeft = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesPinchMiddle = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesPinchRight = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesSleeping = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesTear = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesTiredLeft = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesTiredMiddle = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesTiredRight = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesToxic = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesUp = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const eyesWinking = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const informationAccept = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const informationBackward = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const informationDecline = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const informationForward = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const informationLeft = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const informationNoGo = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const informationQuestionMark = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const informationRight = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const informationStop1 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const informationStop2 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const informationThumbsDown = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const informationThumbsUp = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const informationWarning = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const legoColorSensor = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const legoEv3icon = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const legoEv3 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const legoGyroSensor = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const legoIrBeacon = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const legoIrSensor = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const legoLego = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const legoLargeMotor = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const legoMindstorms = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const legoMediumMotor = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const legoSoundSensor = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const legoTempSensor = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const legoTouchSensor = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const legoUsSensor = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const objectsBomb = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const objectsBoom = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const objectsFire = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const objectsFlowers = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const objectsForest = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const objectsLightOff = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const objectsLightOn = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const objectsLightning = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const objectsNight = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const objectsPirate = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const objectsSnow = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const objectsTarget = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressBar0 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressBar1 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressBar2 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressBar3 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressBar4 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressDial0 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressDial1 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressDial2 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressDial3 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressDial4 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressDots0 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressDots1 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressDots2 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressDots3 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressHourglass0 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressHourglass1 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressHourglass2 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressTimer0 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressTimer1 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressTimer2 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressTimer3 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressTimer4 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressWaterLevel0 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressWaterLevel1 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressWaterLevel2 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const progressWaterLevel3 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemAccept1 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemAccept2 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemAlert = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemBox = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemBusy0 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemBusy1 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemDecline1 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemDecline2 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemDotEmpty = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemDotFull = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemEv3small = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemPlay = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemSlider0 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemSlider1 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemSlider2 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemSlider3 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemSlider4 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemSlider5 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemSlider6 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemSlider7 = screen.unpackPNG(hex``);
|
||||||
|
//% fixedInstance jres
|
||||||
|
export const systemSlider8 = screen.unpackPNG(hex``);
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
namespace input.internal {
|
namespace sensors.internal {
|
||||||
//% shim=pxt::unsafePollForChanges
|
//% shim=pxt::unsafePollForChanges
|
||||||
export function unsafePollForChanges(
|
export function unsafePollForChanges(
|
||||||
periodMs: number,
|
periodMs: number,
|
||||||
@ -27,30 +27,27 @@ namespace input.internal {
|
|||||||
let analogMM: MMap
|
let analogMM: MMap
|
||||||
let uartMM: MMap
|
let uartMM: MMap
|
||||||
let devcon: Buffer
|
let devcon: Buffer
|
||||||
let sensors: SensorInfo[]
|
let sensorInfos: SensorInfo[]
|
||||||
let autoSensors: Sensor[]
|
|
||||||
|
|
||||||
class SensorInfo {
|
class SensorInfo {
|
||||||
port: number
|
port: number
|
||||||
sensor: Sensor
|
sensor: Sensor
|
||||||
|
sensors: Sensor[]
|
||||||
connType: number
|
connType: number
|
||||||
devType: number
|
devType: number
|
||||||
manual: boolean
|
|
||||||
|
|
||||||
constructor(p: number) {
|
constructor(p: number) {
|
||||||
this.port = p
|
this.port = p
|
||||||
this.connType = DAL.CONN_NONE
|
this.connType = DAL.CONN_NONE
|
||||||
this.devType = DAL.DEVICE_TYPE_NONE
|
this.devType = DAL.DEVICE_TYPE_NONE
|
||||||
this.sensor = null
|
this.sensors = []
|
||||||
this.manual = false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function init() {
|
function init() {
|
||||||
if (sensors) return
|
if (sensorInfos) return
|
||||||
sensors = []
|
sensorInfos = []
|
||||||
for (let i = 0; i < DAL.NUM_INPUTS; ++i) sensors.push(new SensorInfo(i))
|
for (let i = 0; i < DAL.NUM_INPUTS; ++i) sensorInfos.push(new SensorInfo(i))
|
||||||
autoSensors = []
|
|
||||||
devcon = output.createBuffer(DevConOff.Size)
|
devcon = output.createBuffer(DevConOff.Size)
|
||||||
|
|
||||||
analogMM = control.mmap("/dev/lms_analog", AnalogOff.Size, 0)
|
analogMM = control.mmap("/dev/lms_analog", AnalogOff.Size, 0)
|
||||||
@ -64,7 +61,7 @@ namespace input.internal {
|
|||||||
loops.pause(500)
|
loops.pause(500)
|
||||||
})
|
})
|
||||||
|
|
||||||
for (let info_ of sensors) {
|
for (let info_ of sensorInfos) {
|
||||||
let info = info_
|
let info = info_
|
||||||
unsafePollForChanges(50, () => {
|
unsafePollForChanges(50, () => {
|
||||||
if (info.sensor) return info.sensor._query()
|
if (info.sensor) return info.sensor._query()
|
||||||
@ -90,7 +87,7 @@ namespace input.internal {
|
|||||||
let conns = analogMM.slice(AnalogOff.InConn, DAL.NUM_INPUTS)
|
let conns = analogMM.slice(AnalogOff.InConn, DAL.NUM_INPUTS)
|
||||||
let numChanged = 0
|
let numChanged = 0
|
||||||
|
|
||||||
for (let info of sensors) {
|
for (let info of sensorInfos) {
|
||||||
let newConn = conns[info.port]
|
let newConn = conns[info.port]
|
||||||
if (newConn == info.connType)
|
if (newConn == info.connType)
|
||||||
continue
|
continue
|
||||||
@ -117,77 +114,44 @@ namespace input.internal {
|
|||||||
if (numChanged == 0)
|
if (numChanged == 0)
|
||||||
return
|
return
|
||||||
|
|
||||||
let autos = sensors.filter(s => !s.manual)
|
for (let si of sensorInfos) {
|
||||||
|
if (si.sensor && si.sensor._deviceType() != si.devType) {
|
||||||
// first free up disconnected sensors
|
si.sensor = null
|
||||||
for (let info of autos) {
|
|
||||||
if (info.sensor && info.devType == DAL.DEVICE_TYPE_NONE)
|
|
||||||
info.sensor._setPort(0)
|
|
||||||
}
|
}
|
||||||
|
if (si.devType != DAL.DEVICE_TYPE_NONE) {
|
||||||
for (let info of autos) {
|
// TODO figure out compiler problem when '|| null' is added here!
|
||||||
if (!info.sensor && info.devType != DAL.DEVICE_TYPE_NONE) {
|
si.sensor = si.sensors.filter(s => s._deviceType() == si.devType)[0]
|
||||||
let found = false
|
if (si.sensor == null) {
|
||||||
for (let s of autoSensors) {
|
control.dmesg(`sensor not found for type=${si.devType} at ${si.port}`)
|
||||||
if (s.getPort() == 0 && s._deviceType() == info.devType) {
|
} else {
|
||||||
s._setPort(info.port + 1)
|
control.dmesg(`sensor connected type=${si.devType} at ${si.port}`)
|
||||||
found = true
|
si.sensor._activated()
|
||||||
break
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!found)
|
|
||||||
control.dmesg(`sensor not found for type=${info.devType} at ${info.port}`)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Sensor extends control.Component {
|
export class Sensor extends control.Component {
|
||||||
protected port: number
|
protected _port: number // this is 0-based
|
||||||
|
|
||||||
constructor() {
|
constructor(port_: number) {
|
||||||
super()
|
super()
|
||||||
|
if (!(1 <= port_ && port_ <= DAL.NUM_INPUTS))
|
||||||
|
control.panic(120)
|
||||||
|
this._port = port_ - 1
|
||||||
init()
|
init()
|
||||||
this.port = -1
|
sensorInfos[this._port].sensors.push(this)
|
||||||
let tp = this._deviceType()
|
|
||||||
if (autoSensors.filter(s => s._deviceType() == tp).length == 0) {
|
|
||||||
autoSensors.push(this)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 0 - disable, 1-4 port number
|
_activated() { }
|
||||||
_setPort(port: number, manual = false) {
|
|
||||||
port = Math.clamp(0, 4, port | 0) - 1;
|
// 1-based
|
||||||
if (port == this.port) return
|
port() {
|
||||||
this.port = port
|
return this._port + 1
|
||||||
control.dmesg(`sensor set port ${port} on devtype=${this._deviceType()}`)
|
|
||||||
for (let i = 0; i < sensors.length; ++i) {
|
|
||||||
if (i != this.port && sensors[i].sensor == this) {
|
|
||||||
sensors[i].sensor = null
|
|
||||||
sensors[i].manual = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this.port >= 0) {
|
|
||||||
let prev = sensors[this.port].sensor
|
|
||||||
if (prev && prev != this)
|
|
||||||
prev._setPort(0)
|
|
||||||
sensors[this.port].sensor = this
|
|
||||||
sensors[this.port].manual = manual
|
|
||||||
}
|
|
||||||
this._portUpdated()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected _portUpdated() { }
|
isActive() {
|
||||||
|
return sensorInfos[this._port].sensor == this
|
||||||
setPort(port: number) {
|
|
||||||
this._setPort(port, true)
|
|
||||||
}
|
|
||||||
|
|
||||||
getPort() {
|
|
||||||
return this.port + 1
|
|
||||||
}
|
|
||||||
|
|
||||||
isManual() {
|
|
||||||
return this.port >= 0 && sensors[this.port].manual
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_query() {
|
_query() {
|
||||||
@ -203,57 +167,127 @@ namespace input.internal {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class AnalogSensor extends Sensor {
|
export class AnalogSensor extends Sensor {
|
||||||
constructor() {
|
constructor(port: number) {
|
||||||
super()
|
super(port)
|
||||||
}
|
}
|
||||||
|
|
||||||
_readPin6() {
|
_readPin6() {
|
||||||
if (this.port < 0) return 0
|
if (!this.isActive()) return 0
|
||||||
return analogMM.getNumber(NumberFormat.Int16LE, AnalogOff.InPin6 + 2 * this.port)
|
return analogMM.getNumber(NumberFormat.Int16LE, AnalogOff.InPin6 + 2 * this._port)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export enum ThresholdState {
|
||||||
|
Normal = 1,
|
||||||
|
High = 2,
|
||||||
|
Low = 3,
|
||||||
|
}
|
||||||
|
|
||||||
|
export class ThresholdDetector {
|
||||||
|
public id: number;
|
||||||
|
private min: number;
|
||||||
|
private max: number;
|
||||||
|
private lowThreshold: number;
|
||||||
|
private highThreshold: number;
|
||||||
|
private level: number;
|
||||||
|
private state: ThresholdState;
|
||||||
|
|
||||||
|
constructor(id: number, min = 0, max = 100, lowThreshold = 20, highThreshold = 80) {
|
||||||
|
this.id = id;
|
||||||
|
this.min = min;
|
||||||
|
this.max = max;
|
||||||
|
this.lowThreshold = lowThreshold;
|
||||||
|
this.highThreshold = highThreshold;
|
||||||
|
this.level = Math.ceil((max - min) / 2);
|
||||||
|
this.state = ThresholdState.Normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
public setLevel(level: number) {
|
||||||
|
this.level = this.clampValue(level);
|
||||||
|
|
||||||
|
if (this.level >= this.highThreshold) {
|
||||||
|
this.setState(ThresholdState.High);
|
||||||
|
}
|
||||||
|
else if (this.level <= this.lowThreshold) {
|
||||||
|
this.setState(ThresholdState.Low);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.setState(ThresholdState.Normal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public setLowThreshold(value: number) {
|
||||||
|
this.lowThreshold = this.clampValue(value);
|
||||||
|
this.highThreshold = Math.max(this.lowThreshold + 1, this.highThreshold);
|
||||||
|
}
|
||||||
|
|
||||||
|
public setHighThreshold(value: number) {
|
||||||
|
this.highThreshold = this.clampValue(value);
|
||||||
|
this.lowThreshold = Math.min(this.highThreshold - 1, this.lowThreshold);
|
||||||
|
}
|
||||||
|
|
||||||
|
private clampValue(value: number) {
|
||||||
|
if (value < this.min) {
|
||||||
|
return this.min;
|
||||||
|
}
|
||||||
|
else if (value > this.max) {
|
||||||
|
return this.max;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private setState(state: ThresholdState) {
|
||||||
|
if (this.state == state) return;
|
||||||
|
|
||||||
|
this.state = state;
|
||||||
|
switch (state) {
|
||||||
|
case ThresholdState.High:
|
||||||
|
control.raiseEvent(this.id, ThresholdState.High);
|
||||||
|
break;
|
||||||
|
case ThresholdState.Low:
|
||||||
|
control.raiseEvent(this.id, ThresholdState.Low);
|
||||||
|
break;
|
||||||
|
case ThresholdState.Normal:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export class UartSensor extends Sensor {
|
export class UartSensor extends Sensor {
|
||||||
protected mode: number
|
protected mode: number // the mode user asked for
|
||||||
protected realmode: number
|
protected realmode: number // the mode the hardware is in
|
||||||
|
|
||||||
constructor() {
|
constructor(port: number) {
|
||||||
super()
|
super(port)
|
||||||
this.mode = 0
|
this.mode = 0
|
||||||
this.realmode = -1
|
this.realmode = -1
|
||||||
}
|
}
|
||||||
|
|
||||||
protected _portUpdated() {
|
_activated() {
|
||||||
this.realmode = -1
|
|
||||||
if (this.port >= 0) {
|
|
||||||
if (this.isManual()) {
|
|
||||||
uartReset(this.port)
|
|
||||||
} else {
|
|
||||||
this.realmode = 0
|
this.realmode = 0
|
||||||
}
|
// uartReset(this.port) // TODO is it ever needed?
|
||||||
this._setMode(this.mode)
|
this._setMode(this.mode)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
protected _setMode(m: number) {
|
protected _setMode(m: number) {
|
||||||
//control.dmesg(`_setMode p=${this.port} m: ${this.realmode} -> ${m}`)
|
//control.dmesg(`_setMode p=${this.port} m: ${this.realmode} -> ${m}`)
|
||||||
let v = m | 0
|
let v = m | 0
|
||||||
this.mode = v
|
this.mode = v
|
||||||
if (this.port < 0) return
|
if (!this.isActive()) return
|
||||||
if (this.realmode != this.mode) {
|
if (this.realmode != this.mode) {
|
||||||
this.realmode = v
|
this.realmode = v
|
||||||
setUartMode(this.port, v)
|
setUartMode(this._port, v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getBytes(): Buffer {
|
getBytes(): Buffer {
|
||||||
return getUartBytes(this.port)
|
return getUartBytes(this.isActive() ? this._port : -1)
|
||||||
}
|
}
|
||||||
|
|
||||||
getNumber(fmt: NumberFormat, off: number) {
|
getNumber(fmt: NumberFormat, off: number) {
|
||||||
return getUartNumber(fmt, off, this.port)
|
if (!this.isActive())
|
||||||
|
return 0
|
||||||
|
return getUartNumber(fmt, off, this._port)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
143
libs/core/ir.ts
@ -1,143 +0,0 @@
|
|||||||
const enum IrSensorMode {
|
|
||||||
None = -1,
|
|
||||||
Proximity = 0,
|
|
||||||
Seek = 1,
|
|
||||||
RemoteControl = 2,
|
|
||||||
}
|
|
||||||
|
|
||||||
const enum IrRemoteChannel {
|
|
||||||
Ch0 = 0, // top
|
|
||||||
Ch1 = 1,
|
|
||||||
Ch2 = 2,
|
|
||||||
Ch3 = 3,
|
|
||||||
}
|
|
||||||
|
|
||||||
const enum IrRemoteButton {
|
|
||||||
None = 0x00,
|
|
||||||
CenterBeacon = 0x01,
|
|
||||||
TopLeft = 0x02,
|
|
||||||
BottomLeft = 0x04,
|
|
||||||
TopRight = 0x08,
|
|
||||||
BottomRight = 0x10,
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace input {
|
|
||||||
function mapButton(v: number) {
|
|
||||||
switch (v) {
|
|
||||||
case 0: return IrRemoteButton.None
|
|
||||||
case 1: return IrRemoteButton.TopLeft
|
|
||||||
case 2: return IrRemoteButton.BottomLeft
|
|
||||||
case 3: return IrRemoteButton.TopRight
|
|
||||||
case 4: return IrRemoteButton.TopRight | IrRemoteButton.BottomRight
|
|
||||||
case 5: return IrRemoteButton.TopLeft | IrRemoteButton.TopRight
|
|
||||||
case 6: return IrRemoteButton.TopLeft | IrRemoteButton.BottomRight
|
|
||||||
case 7: return IrRemoteButton.BottomLeft | IrRemoteButton.TopRight
|
|
||||||
case 8: return IrRemoteButton.BottomLeft | IrRemoteButton.BottomRight
|
|
||||||
case 9: return IrRemoteButton.CenterBeacon
|
|
||||||
case 10: return IrRemoteButton.BottomLeft | IrRemoteButton.TopLeft
|
|
||||||
case 11: return IrRemoteButton.TopRight | IrRemoteButton.BottomRight
|
|
||||||
default: return IrRemoteButton.None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class IrSensor extends internal.UartSensor {
|
|
||||||
private channel: IrRemoteChannel
|
|
||||||
private buttons: Button[];
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super()
|
|
||||||
this.channel = IrRemoteChannel.Ch0
|
|
||||||
this.buttons = []
|
|
||||||
// otherwise button events won't work
|
|
||||||
this.mode = IrSensorMode.RemoteControl
|
|
||||||
for (let i = 0; i < 5; ++i) {
|
|
||||||
this.buttons.push(new Button())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
button(id: IrRemoteButton) {
|
|
||||||
let num = -1
|
|
||||||
while (id) {
|
|
||||||
id >>= 1;
|
|
||||||
num++;
|
|
||||||
}
|
|
||||||
num = Math.clamp(0, this.buttons.length - 1, num)
|
|
||||||
return this.buttons[num]
|
|
||||||
}
|
|
||||||
|
|
||||||
_query() {
|
|
||||||
if (this.mode == IrSensorMode.RemoteControl)
|
|
||||||
return mapButton(this.getNumber(NumberFormat.UInt8LE, this.channel))
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
_update(prev: number, curr: number) {
|
|
||||||
for (let i = 0; i < this.buttons.length; ++i) {
|
|
||||||
let v = !!(curr & (1 << i))
|
|
||||||
this.buttons[i].update(v)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_deviceType() {
|
|
||||||
return DAL.DEVICE_TYPE_IR
|
|
||||||
}
|
|
||||||
|
|
||||||
setRemoteChannel(c: IrRemoteChannel) {
|
|
||||||
c = Math.clamp(0, 3, c | 0)
|
|
||||||
this.channel = c
|
|
||||||
this.setMode(IrSensorMode.RemoteControl)
|
|
||||||
}
|
|
||||||
|
|
||||||
setMode(m: IrSensorMode) {
|
|
||||||
this._setMode(m)
|
|
||||||
}
|
|
||||||
|
|
||||||
getDistance() {
|
|
||||||
this.setMode(IrSensorMode.Proximity)
|
|
||||||
return this.getNumber(NumberFormat.UInt8LE, 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
getRemoteCommand() {
|
|
||||||
this.setMode(IrSensorMode.RemoteControl)
|
|
||||||
return this.getNumber(NumberFormat.UInt8LE, this.channel)
|
|
||||||
}
|
|
||||||
|
|
||||||
getDirectionAndDistance() {
|
|
||||||
this.setMode(IrSensorMode.Seek)
|
|
||||||
return this.getNumber(NumberFormat.UInt16LE, this.channel * 2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//% whenUsed
|
|
||||||
export const ir: IrSensor = new IrSensor()
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remote top-left button.
|
|
||||||
*/
|
|
||||||
//% whenUsed block="remote top-left" weight=95 fixedInstance
|
|
||||||
export const remoteTopLeft = ir.button(IrRemoteButton.TopLeft)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remote top-right button.
|
|
||||||
*/
|
|
||||||
//% whenUsed block="remote top-right" weight=95 fixedInstance
|
|
||||||
export const remoteTopRight = ir.button(IrRemoteButton.TopRight)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remote bottom-left button.
|
|
||||||
*/
|
|
||||||
//% whenUsed block="remote bottom-left" weight=95 fixedInstance
|
|
||||||
export const remoteBottomLeft = ir.button(IrRemoteButton.BottomLeft)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remote bottom-right button.
|
|
||||||
*/
|
|
||||||
//% whenUsed block="remote bottom-right" weight=95 fixedInstance
|
|
||||||
export const remoteBottomRight = ir.button(IrRemoteButton.BottomRight)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remote beacon (center) button.
|
|
||||||
*/
|
|
||||||
//% whenUsed block="remote center" weight=95 fixedInstance
|
|
||||||
export const remoteCenter = ir.button(IrRemoteButton.CenterBeacon)
|
|
||||||
}
|
|
BIN
libs/core/jres/icons/brickButtons-icon.png
Normal file
After Width: | Height: | Size: 5.2 KiB |
BIN
libs/core/jres/icons/brickDisplay-icon.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
libs/core/jres/icons/colorSensor-icon.png
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
libs/core/jres/icons/gyroSensor-icon.png
Normal file
After Width: | Height: | Size: 2.7 KiB |
BIN
libs/core/jres/icons/infraredSensor-icon.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
BIN
libs/core/jres/icons/motorLarge-icon.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
BIN
libs/core/jres/icons/motorMedium-icon.png
Normal file
After Width: | Height: | Size: 6.1 KiB |
BIN
libs/core/jres/icons/port1-icon.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
libs/core/jres/icons/port2-icon.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
libs/core/jres/icons/port3-icon.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
BIN
libs/core/jres/icons/port4-icon.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
libs/core/jres/icons/portA-icon.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
libs/core/jres/icons/portB-icon.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
BIN
libs/core/jres/icons/portC-icon.png
Normal file
After Width: | Height: | Size: 1.8 KiB |
BIN
libs/core/jres/icons/portD-icon.png
Normal file
After Width: | Height: | Size: 1.6 KiB |
BIN
libs/core/jres/icons/touchSensor-icon.png
Normal file
After Width: | Height: | Size: 3.6 KiB |
BIN
libs/core/jres/icons/ultrasonicSensor-icon.png
Normal file
After Width: | Height: | Size: 5.6 KiB |
@ -6,7 +6,6 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <cstdarg>
|
#include <cstdarg>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <assert.h>
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
@ -15,6 +14,8 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#define THREAD_DBG(...)
|
||||||
|
|
||||||
void *operator new(size_t size) {
|
void *operator new(size_t size) {
|
||||||
return malloc(size);
|
return malloc(size);
|
||||||
}
|
}
|
||||||
@ -229,6 +230,8 @@ static void runAct(Thread *thr) {
|
|||||||
disposeThread(thr);
|
disposeThread(thr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mainThread(Thread *) {}
|
||||||
|
|
||||||
void setupThread(Action a, TValue arg = 0, void (*runner)(Thread *) = NULL, TValue d0 = 0,
|
void setupThread(Action a, TValue arg = 0, void (*runner)(Thread *) = NULL, TValue d0 = 0,
|
||||||
TValue d1 = 0) {
|
TValue d1 = 0) {
|
||||||
if (runner == NULL)
|
if (runner == NULL)
|
||||||
@ -242,8 +245,13 @@ void setupThread(Action a, TValue arg = 0, void (*runner)(Thread *) = NULL, TVal
|
|||||||
thr->data0 = incr(d0);
|
thr->data0 = incr(d0);
|
||||||
thr->data1 = incr(d1);
|
thr->data1 = incr(d1);
|
||||||
pthread_cond_init(&thr->waitCond, NULL);
|
pthread_cond_init(&thr->waitCond, NULL);
|
||||||
|
if (runner == mainThread) {
|
||||||
|
thr->pid = pthread_self();
|
||||||
|
} else {
|
||||||
pthread_create(&thr->pid, NULL, (void *(*)(void *))runner, thr);
|
pthread_create(&thr->pid, NULL, (void *(*)(void *))runner, thr);
|
||||||
|
THREAD_DBG("setup thread: %p (pid %p)", thr, thr->pid);
|
||||||
pthread_detach(thr->pid);
|
pthread_detach(thr->pid);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void runInBackground(Action a) {
|
void runInBackground(Action a) {
|
||||||
@ -263,21 +271,26 @@ void runForever(Action a) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void waitForEvent(int source, int value) {
|
void waitForEvent(int source, int value) {
|
||||||
|
THREAD_DBG("waitForEv: %d %d", source, value);
|
||||||
auto self = pthread_self();
|
auto self = pthread_self();
|
||||||
for (auto t = allThreads; t; t = t->next) {
|
for (auto t = allThreads; t; t = t->next) {
|
||||||
|
THREAD_DBG("t: %p", t);
|
||||||
if (t->pid == self) {
|
if (t->pid == self) {
|
||||||
pthread_mutex_lock(&eventMutex);
|
pthread_mutex_lock(&eventMutex);
|
||||||
t->waitSource = source;
|
t->waitSource = source;
|
||||||
t->waitValue = value;
|
t->waitValue = value;
|
||||||
|
stopUser();
|
||||||
// spourious wake ups may occur they say
|
// spourious wake ups may occur they say
|
||||||
while (t->waitSource) {
|
while (t->waitSource) {
|
||||||
pthread_cond_wait(&t->waitCond, &eventMutex);
|
pthread_cond_wait(&t->waitCond, &eventMutex);
|
||||||
}
|
}
|
||||||
pthread_mutex_unlock(&eventMutex);
|
pthread_mutex_unlock(&eventMutex);
|
||||||
|
startUser();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assert(0);
|
DMESG("current thread not registered!");
|
||||||
|
target_panic(901);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dispatchEvent(Event &e) {
|
static void dispatchEvent(Event &e) {
|
||||||
@ -340,7 +353,8 @@ void raiseEvent(int id, int event) {
|
|||||||
auto e = mkEvent(id, event);
|
auto e = mkEvent(id, event);
|
||||||
pthread_mutex_lock(&eventMutex);
|
pthread_mutex_lock(&eventMutex);
|
||||||
if (eventTail == NULL) {
|
if (eventTail == NULL) {
|
||||||
assert(eventHead == NULL);
|
if (eventHead != NULL)
|
||||||
|
target_panic(902);
|
||||||
eventHead = eventTail = e;
|
eventHead = eventTail = e;
|
||||||
} else {
|
} else {
|
||||||
eventTail->next = e;
|
eventTail->next = e;
|
||||||
@ -350,7 +364,8 @@ void raiseEvent(int id, int event) {
|
|||||||
pthread_mutex_unlock(&eventMutex);
|
pthread_mutex_unlock(&eventMutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void registerWithDal(int id, int event, Action a) {
|
void registerWithDal(int id, int event, Action a, int flags) {
|
||||||
|
// TODO support flags
|
||||||
setBinding(id, event, a);
|
setBinding(id, event, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -464,6 +479,7 @@ void initRuntime() {
|
|||||||
pthread_t disp;
|
pthread_t disp;
|
||||||
pthread_create(&disp, NULL, evtDispatcher, NULL);
|
pthread_create(&disp, NULL, evtDispatcher, NULL);
|
||||||
pthread_detach(disp);
|
pthread_detach(disp);
|
||||||
|
setupThread(0, 0, mainThread);
|
||||||
target_init();
|
target_init();
|
||||||
screen_init();
|
screen_init();
|
||||||
startUser();
|
startUser();
|
||||||
@ -505,4 +521,4 @@ void dmesg(const char *format, ...) {
|
|||||||
fflush(dmesgFile);
|
fflush(dmesgFile);
|
||||||
fdatasync(fileno(dmesgFile));
|
fdatasync(fileno(dmesgFile));
|
||||||
}
|
}
|
||||||
}
|
} // namespace pxt
|
||||||
|
@ -1,4 +1,9 @@
|
|||||||
|
//% weight=100
|
||||||
|
namespace brick {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
//% color="#B4009E" weight=98 icon="\uf192"
|
//% color="#B4009E" weight=98 icon="\uf192"
|
||||||
namespace input {
|
//% groups='["Ultrasonic Sensor", "Touch Sensor", "Color Sensor", "Infrared Sensor", "Remote Infrared Beacon", "Gyro Sensor"]'
|
||||||
|
namespace sensors {
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,13 @@
|
|||||||
enum Output {
|
enum Output {
|
||||||
|
//% block="A"
|
||||||
A = 0x01,
|
A = 0x01,
|
||||||
|
//% block="B"
|
||||||
B = 0x02,
|
B = 0x02,
|
||||||
|
//% block="C"
|
||||||
C = 0x04,
|
C = 0x04,
|
||||||
|
//% block="D"
|
||||||
D = 0x08,
|
D = 0x08,
|
||||||
|
//% block="All"
|
||||||
ALL = 0x0f
|
ALL = 0x0f
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -12,10 +17,9 @@ enum OutputType {
|
|||||||
MiniTacho = 8,
|
MiniTacho = 8,
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace output {
|
namespace motors {
|
||||||
let pwmMM: MMap
|
let pwmMM: MMap
|
||||||
let motorMM: MMap
|
let motorMM: MMap
|
||||||
let currentSpeed: number[] = []
|
|
||||||
|
|
||||||
const enum MotorDataOff {
|
const enum MotorDataOff {
|
||||||
TachoCounts = 0, // int32
|
TachoCounts = 0, // int32
|
||||||
@ -31,13 +35,7 @@ namespace output {
|
|||||||
if (!pwmMM) control.fail("no PWM file")
|
if (!pwmMM) control.fail("no PWM file")
|
||||||
motorMM = control.mmap("/dev/lms_motor", MotorDataOff.Size * DAL.NUM_OUTPUTS, 0)
|
motorMM = control.mmap("/dev/lms_motor", MotorDataOff.Size * DAL.NUM_OUTPUTS, 0)
|
||||||
|
|
||||||
stop(Output.ALL)
|
resetMotors()
|
||||||
|
|
||||||
currentSpeed[Output.A] = -1;
|
|
||||||
currentSpeed[Output.B] = -1;
|
|
||||||
currentSpeed[Output.C] = -1;
|
|
||||||
currentSpeed[Output.D] = -1;
|
|
||||||
currentSpeed[Output.ALL] = -1;
|
|
||||||
|
|
||||||
let buf = output.createBuffer(1)
|
let buf = output.createBuffer(1)
|
||||||
buf[0] = DAL.opProgramStart
|
buf[0] = DAL.opProgramStart
|
||||||
@ -55,71 +53,199 @@ namespace output {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function mkCmd(out: Output, cmd: number, addSize: number) {
|
function mkCmd(out: Output, cmd: number, addSize: number) {
|
||||||
let b = createBuffer(2 + addSize)
|
const b = output.createBuffer(2 + addSize)
|
||||||
b.setNumber(NumberFormat.UInt8LE, 0, cmd)
|
b.setNumber(NumberFormat.UInt8LE, 0, cmd)
|
||||||
b.setNumber(NumberFormat.UInt8LE, 1, out)
|
b.setNumber(NumberFormat.UInt8LE, 1, out)
|
||||||
return b
|
return b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function resetMotors() {
|
||||||
|
reset(Output.ALL)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Turn a motor on for a specified number of milliseconds.
|
* Stops all motors
|
||||||
* @param out the output connection that the motor is connected to
|
|
||||||
* @param ms the number of milliseconds to turn the motor on, eg: 500
|
|
||||||
* @param useBrake whether or not to use the brake, defaults to false
|
|
||||||
*/
|
*/
|
||||||
//% blockId=output_turn block="turn motor %out| on for %ms|milliseconds"
|
//% blockId=motorStopAll block="stop all `icons.motorLarge`"
|
||||||
//% weight=100 group="Motors"
|
//% weight=10 group="Motors" blockGap=8
|
||||||
export function turn(out: Output, ms: number, useBrake = false) {
|
export function stopAllMotors() {
|
||||||
// TODO: use current power / speed configuration
|
const b = mkCmd(Output.ALL, DAL.opOutputStop, 0)
|
||||||
output.step(out, {
|
writePWM(b)
|
||||||
speed: 100,
|
}
|
||||||
|
|
||||||
|
//% fixedInstances
|
||||||
|
export class Motor extends control.Component {
|
||||||
|
private port: Output;
|
||||||
|
private large: boolean;
|
||||||
|
private brake: boolean;
|
||||||
|
|
||||||
|
constructor(port: Output, large: boolean) {
|
||||||
|
super();
|
||||||
|
this.port = port;
|
||||||
|
this.large = large;
|
||||||
|
this.brake = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the motor power level from ``-100`` to ``100``.
|
||||||
|
* @param motor the output connection that the motor is connected to
|
||||||
|
* @param power the power from ``100`` full forward to ``-100`` full backward, eg: 50
|
||||||
|
*/
|
||||||
|
//% blockId=motorSetPower block="power `icons.motorLarge` %motor|to %power|%"
|
||||||
|
//% weight=99 group="Motors" blockGap=8
|
||||||
|
//% power.min=-100 power.max=100
|
||||||
|
power(power: number) {
|
||||||
|
power = Math.clamp(-100, 100, power >> 0);
|
||||||
|
|
||||||
|
// per LEGO: call it power, use speed
|
||||||
|
const b = mkCmd(this.port, DAL.opOutputSpeed, 1)
|
||||||
|
b.setNumber(NumberFormat.Int8LE, 2, power)
|
||||||
|
writePWM(b)
|
||||||
|
if (power) {
|
||||||
|
const b = mkCmd(this.port, DAL.opOutputStart, 0)
|
||||||
|
writePWM(b);
|
||||||
|
} else {
|
||||||
|
this.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Moves the motor by a number of degrees
|
||||||
|
* @param degrees the angle to turn the motor
|
||||||
|
* @param angle the degrees to rotate, eg: 360
|
||||||
|
* @param power the power from ``100`` full forward to ``-100`` full backward, eg: 50
|
||||||
|
*/
|
||||||
|
//% blockId=motorMove block="move `icons.motorLarge` %motor|by %angle|degrees at %power|%"
|
||||||
|
//% weight=98 group="Motors" blockGap=8
|
||||||
|
//% power.min=-100 power.max=100
|
||||||
|
move(angle: number, power: number) {
|
||||||
|
angle = angle >> 0;
|
||||||
|
power = Math.clamp(-100, 100, power >> 0);
|
||||||
|
|
||||||
|
step(this.port, {
|
||||||
|
speed: power,
|
||||||
step1: 0,
|
step1: 0,
|
||||||
step2: ms,
|
step2: angle,
|
||||||
step3: 0,
|
step3: 0,
|
||||||
useSteps: false,
|
useSteps: true,
|
||||||
useBrake: useBrake
|
useBrake: this.brake
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Turn motor off.
|
* Stops the motor
|
||||||
* @param out the output connection that the motor is connected to
|
|
||||||
*/
|
*/
|
||||||
//% blockId=output_stop block="turn motor %out|off"
|
//% blockId=motorStop block="stop `icons.motorLarge` %motor"
|
||||||
//% weight=90 group="Motors"
|
//% weight=97 group="Motors"
|
||||||
export function stop(out: Output, useBrake = false) {
|
stop() {
|
||||||
let b = mkCmd(out, DAL.opOutputStop, 1)
|
const b = mkCmd(this.port, DAL.opOutputStop, 1)
|
||||||
b.setNumber(NumberFormat.UInt8LE, 2, useBrake ? 1 : 0)
|
b.setNumber(NumberFormat.UInt8LE, 2, this.brake ? 1 : 0)
|
||||||
|
writePWM(b);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the automatic brake on or off when the motor is off
|
||||||
|
* @param brake a value indicating if the motor should break when off
|
||||||
|
*/
|
||||||
|
//% blockId=outputMotorSetBrakeMode block="set `icons.motorLarge` %motor|brake %brake"
|
||||||
|
//% brake.fieldEditor=toggleonoff
|
||||||
|
//% weight=60 group="Motors" blockGap=8
|
||||||
|
setBrake(brake: boolean) {
|
||||||
|
this.brake = brake;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverses the motor polarity
|
||||||
|
*/
|
||||||
|
//% blockId=motorSetReversed block="set `icons.motorLarge` %motor|reversed %reversed"
|
||||||
|
//% reversed.fieldEditor=toggleonoff
|
||||||
|
//% weight=59 group="Motors"
|
||||||
|
setReversed(reversed: boolean) {
|
||||||
|
const b = mkCmd(this.port, DAL.opOutputPolarity, 1)
|
||||||
|
b.setNumber(NumberFormat.Int8LE, 2, reversed ? -1 : 1);
|
||||||
writePWM(b)
|
writePWM(b)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Turn motor on.
|
* Gets motor actual speed.
|
||||||
* @param out the output connection that the motor is connected to
|
* @param motor the port which connects to the motor
|
||||||
*/
|
*/
|
||||||
//% blockId=output_start block="turn motor %out|on"
|
//% blockId=motorSpeed block="`icons.motorLarge` %motor|speed"
|
||||||
//% weight=95 group="Motors"
|
//% weight=72 group="Motors" blockGap=8
|
||||||
export function start(out: Output) {
|
speed(): number {
|
||||||
if (currentSpeed[out] == -1) setSpeed(out, 50)
|
return getMotorData(this.port).actualSpeed;
|
||||||
let b = mkCmd(out, DAL.opOutputStart, 0)
|
|
||||||
writePWM(b)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function reset(out: Output) {
|
/**
|
||||||
let b = mkCmd(out, DAL.opOutputReset, 0)
|
* Gets motor step count.
|
||||||
writePWM(b)
|
* @param motor the port which connects to the motor
|
||||||
|
*/
|
||||||
|
//% blockId=motorCount block="`icons.motorLarge` %motor|count"
|
||||||
|
//% weight=71 group="Motors" blockGap=8
|
||||||
|
count(): number {
|
||||||
|
return getMotorData(this.port).count;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function clearCount(out: Output) {
|
/**
|
||||||
let b = mkCmd(out, DAL.opOutputClearCount, 0)
|
* Gets motor tacho count.
|
||||||
|
* @param motor the port which connects to the motor
|
||||||
|
*/
|
||||||
|
//% blockId=motorTachoCount block="`icons.motorLarge` %motor|tacho count"
|
||||||
|
//% weight=70 group="Motors"
|
||||||
|
tachoCount(): number {
|
||||||
|
return getMotorData(this.port).tachoCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clears the motor count
|
||||||
|
*/
|
||||||
|
clearCount() {
|
||||||
|
const b = mkCmd(this.port, DAL.opOutputClearCount, 0)
|
||||||
writePWM(b)
|
writePWM(b)
|
||||||
for (let i = 0; i < DAL.NUM_OUTPUTS; ++i) {
|
for (let i = 0; i < DAL.NUM_OUTPUTS; ++i) {
|
||||||
if (out & (1 << i)) {
|
if (this.port & (1 << i)) {
|
||||||
motorMM.setNumber(NumberFormat.Int32LE, i * MotorDataOff.Size + MotorDataOff.TachoSensor, 0)
|
motorMM.setNumber(NumberFormat.Int32LE, i * MotorDataOff.Size + MotorDataOff.TachoSensor, 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resets the motor.
|
||||||
|
*/
|
||||||
|
reset() {
|
||||||
|
reset(this.port);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//% whenUsed fixedInstance block="large A"
|
||||||
|
export const largeMotorA = new Motor(Output.A, true);
|
||||||
|
|
||||||
|
//% whenUsed fixedInstance block="large B"
|
||||||
|
export const largeMotorB = new Motor(Output.B, true);
|
||||||
|
|
||||||
|
//% whenUsed fixedInstance block="large C"
|
||||||
|
export const largeMotorC = new Motor(Output.C, true);
|
||||||
|
|
||||||
|
//% whenUsed fixedInstance block="large D"
|
||||||
|
export const largeMotorD = new Motor(Output.D, true);
|
||||||
|
|
||||||
|
//% whenUsed fixedInstance block="medium A"
|
||||||
|
export const mediumMotorA = new Motor(Output.A, false);
|
||||||
|
|
||||||
|
//% whenUsed fixedInstance block="medium B"
|
||||||
|
export const mediumMotorB = new Motor(Output.B, false);
|
||||||
|
|
||||||
|
//% whenUsed fixedInstance block="medium C"
|
||||||
|
export const mediumMotorC = new Motor(Output.C, false);
|
||||||
|
|
||||||
|
//% whenUsed fixedInstance block="medium D"
|
||||||
|
export const mediumMotorD = new Motor(Output.D, false);
|
||||||
|
|
||||||
|
function reset(out: Output) {
|
||||||
|
let b = mkCmd(out, DAL.opOutputReset, 0)
|
||||||
|
writePWM(b)
|
||||||
|
}
|
||||||
|
|
||||||
function outOffset(out: Output) {
|
function outOffset(out: Output) {
|
||||||
for (let i = 0; i < DAL.NUM_OUTPUTS; ++i) {
|
for (let i = 0; i < DAL.NUM_OUTPUTS; ++i) {
|
||||||
if (out & (1 << i))
|
if (out & (1 << i))
|
||||||
@ -128,14 +254,14 @@ namespace output {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface MotorData {
|
interface MotorData {
|
||||||
actualSpeed: number; // -100..+100
|
actualSpeed: number; // -100..+100
|
||||||
tachoCount: number;
|
tachoCount: number;
|
||||||
count: number;
|
count: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
// only a single output at a time
|
// only a single output at a time
|
||||||
export function getMotorData(out: Output): MotorData {
|
function getMotorData(out: Output): MotorData {
|
||||||
let buf = motorMM.slice(outOffset(out), MotorDataOff.Size)
|
let buf = motorMM.slice(outOffset(out), MotorDataOff.Size)
|
||||||
return {
|
return {
|
||||||
actualSpeed: buf.getNumber(NumberFormat.Int8LE, MotorDataOff.Speed),
|
actualSpeed: buf.getNumber(NumberFormat.Int8LE, MotorDataOff.Speed),
|
||||||
@ -144,52 +270,7 @@ namespace output {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
interface StepOptions {
|
||||||
* Get motor speed.
|
|
||||||
* @param out the output connection that the motor is connected to
|
|
||||||
*/
|
|
||||||
//% blockId=output_getCurrentSpeed block="motor %out|speed"
|
|
||||||
//% weight=70 group="Motors"
|
|
||||||
export function getCurrentSpeed(out: Output) {
|
|
||||||
return getMotorData(out).actualSpeed;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set motor speed.
|
|
||||||
* @param out the output connection that the motor is connected to
|
|
||||||
* @param speed the desired speed to use. eg: 100
|
|
||||||
*/
|
|
||||||
//% blockId=output_setSpeed block="set motor %out| speed to %speed"
|
|
||||||
//% weight=81 group="Motors"
|
|
||||||
//% speed.min=-100 speed.max=100
|
|
||||||
export function setSpeed(out: Output, speed: number) {
|
|
||||||
currentSpeed[out] = speed;
|
|
||||||
let b = mkCmd(out, DAL.opOutputSpeed, 1)
|
|
||||||
b.setNumber(NumberFormat.Int8LE, 2, Math.clamp(-100, 100, speed))
|
|
||||||
writePWM(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set motor power.
|
|
||||||
* @param out the output connection that the motor is connected to
|
|
||||||
* @param power the desired power to use. eg: 100
|
|
||||||
*/
|
|
||||||
//% blockId=output_setPower block="set motor %out| power to %power"
|
|
||||||
//% weight=80 group="Motors"
|
|
||||||
//% power.min=-100 power.max=100
|
|
||||||
export function setPower(out: Output, power: number) {
|
|
||||||
let b = mkCmd(out, DAL.opOutputPower, 1)
|
|
||||||
b.setNumber(NumberFormat.Int8LE, 2, Math.clamp(-100, 100, power))
|
|
||||||
writePWM(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
export function setPolarity(out: Output, polarity: number) {
|
|
||||||
let b = mkCmd(out, DAL.opOutputPolarity, 1)
|
|
||||||
b.setNumber(NumberFormat.Int8LE, 2, Math.clamp(-1, 1, polarity))
|
|
||||||
writePWM(b)
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface StepOptions {
|
|
||||||
power?: number;
|
power?: number;
|
||||||
speed?: number; // either speed or power has to be present
|
speed?: number; // either speed or power has to be present
|
||||||
step1: number;
|
step1: number;
|
||||||
@ -199,7 +280,7 @@ namespace output {
|
|||||||
useBrake?: boolean;
|
useBrake?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function step(out: Output, opts: StepOptions) {
|
function step(out: Output, opts: StepOptions) {
|
||||||
let op = opts.useSteps ? DAL.opOutputStepSpeed : DAL.opOutputTimeSpeed
|
let op = opts.useSteps ? DAL.opOutputStepSpeed : DAL.opOutputTimeSpeed
|
||||||
let speed = opts.speed
|
let speed = opts.speed
|
||||||
if (speed == null) {
|
if (speed == null) {
|
||||||
|
130
libs/core/png.cpp
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
#include "pxt.h"
|
||||||
|
#include "ev3const.h"
|
||||||
|
#include <zlib.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
struct PNGHeader {
|
||||||
|
uint8_t pngHeader[8];
|
||||||
|
uint32_t lenIHDR;
|
||||||
|
uint8_t IHDR[4];
|
||||||
|
uint32_t width;
|
||||||
|
uint32_t height;
|
||||||
|
uint8_t bitDepth;
|
||||||
|
uint8_t colorType;
|
||||||
|
uint8_t compressionMethod;
|
||||||
|
uint8_t filterMethod;
|
||||||
|
uint8_t interlaceMethod;
|
||||||
|
uint32_t hdCRC;
|
||||||
|
uint32_t lenIDAT;
|
||||||
|
uint8_t IDAT[4];
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
namespace screen {
|
||||||
|
|
||||||
|
static uint32_t swap(uint32_t num) {
|
||||||
|
return ((num >> 24) & 0xff) | ((num << 8) & 0xff0000) | ((num >> 8) & 0xff00) |
|
||||||
|
((num << 24) & 0xff000000);
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t revbits(uint8_t v) {
|
||||||
|
v = (v & 0xf0) >> 4 | (v & 0x0f) << 4;
|
||||||
|
v = (v & 0xcc) >> 2 | (v & 0x33) << 2;
|
||||||
|
v = (v & 0xaa) >> 1 | (v & 0x55) << 1;
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Decompresses a 1-bit gray scale PNG image to image format. */
|
||||||
|
//%
|
||||||
|
Image unpackPNG(Buffer png) {
|
||||||
|
if (!png) {
|
||||||
|
DMESG("PNG: Missing image");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (png->length < sizeof(PNGHeader) + 4) {
|
||||||
|
DMESG("PNG: File too small");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (memcmp(png->data, "\x89PNG\r\n\x1A\n", 8) != 0) {
|
||||||
|
DMESG("PNG: Invalid header");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct PNGHeader hd;
|
||||||
|
memcpy(&hd, png->data, sizeof(hd));
|
||||||
|
|
||||||
|
if (memcmp(hd.IHDR, "IHDR", 4) != 0) {
|
||||||
|
DMESG("PNG: missing IHDR");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
hd.lenIHDR = swap(hd.lenIHDR);
|
||||||
|
hd.width = swap(hd.width);
|
||||||
|
hd.height = swap(hd.height);
|
||||||
|
hd.lenIDAT = swap(hd.lenIDAT);
|
||||||
|
|
||||||
|
if (hd.lenIHDR != 13) {
|
||||||
|
DMESG("PNG: bad IHDR len");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (hd.bitDepth != 1 || hd.colorType != 0 || hd.compressionMethod != 0 ||
|
||||||
|
hd.filterMethod != 0 || hd.interlaceMethod != 0) {
|
||||||
|
DMESG("PNG: not 1-bit grayscale");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (memcmp(hd.IDAT, "IDAT", 4) != 0) {
|
||||||
|
DMESG("PNG: missing IDAT");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (hd.lenIDAT + sizeof(hd) >= png->length) {
|
||||||
|
DMESG("PNG: buffer too short");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (hd.width > 300 || hd.height > 300) {
|
||||||
|
DMESG("PNG: too big");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t byteW = (hd.width + 7) >> 3;
|
||||||
|
uint32_t expSize = (byteW + 1) * hd.height;
|
||||||
|
unsigned long sz = expSize;
|
||||||
|
uint8_t *tmp = (uint8_t *)malloc(sz);
|
||||||
|
int code = uncompress(tmp, &sz, png->data + sizeof(hd), hd.lenIDAT);
|
||||||
|
if (code != 0) {
|
||||||
|
DMESG("PNG: zlib failed: %d", code);
|
||||||
|
free(tmp);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (sz != expSize) {
|
||||||
|
DMESG("PNG: invalid compressed size");
|
||||||
|
free(tmp);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Buffer res = mkBuffer(NULL, 2 + byteW * hd.height);
|
||||||
|
res->data[0] = 0xf0;
|
||||||
|
res->data[1] = hd.width;
|
||||||
|
uint8_t *dst = res->data + 2;
|
||||||
|
uint8_t *src = tmp;
|
||||||
|
uint8_t lastMask = (1 << (hd.width & 7)) - 1;
|
||||||
|
if (lastMask == 0)
|
||||||
|
lastMask = 0xff;
|
||||||
|
for (uint32_t i = 0; i < hd.height; ++i) {
|
||||||
|
if (*src++ != 0) {
|
||||||
|
DMESG("PNG: unsupported filter");
|
||||||
|
free(tmp);
|
||||||
|
decrRC(res);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
for (uint32_t j = 0; j < byteW; ++j) {
|
||||||
|
*dst = ~revbits(*src++);
|
||||||
|
if (j == byteW - 1) {
|
||||||
|
*dst &= lastMask;
|
||||||
|
}
|
||||||
|
dst++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(tmp);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
}
|
@ -7,6 +7,8 @@ namespace pxt {
|
|||||||
void raiseEvent(int id, int event);
|
void raiseEvent(int id, int event);
|
||||||
int allocateNotifyEvent();
|
int allocateNotifyEvent();
|
||||||
void sleep_core_us(uint64_t us);
|
void sleep_core_us(uint64_t us);
|
||||||
|
void startUser();
|
||||||
|
void stopUser();
|
||||||
|
|
||||||
class Button;
|
class Button;
|
||||||
typedef Button *Button_;
|
typedef Button *Button_;
|
||||||
@ -27,6 +29,10 @@ class MMap : public RefObject {
|
|||||||
|
|
||||||
extern volatile bool paniced;
|
extern volatile bool paniced;
|
||||||
|
|
||||||
|
// Buffer, Sound, and Image share representation.
|
||||||
|
typedef Buffer Image;
|
||||||
|
typedef Buffer Sound;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DEVICE_EVT_ANY 0
|
#define DEVICE_EVT_ANY 0
|
||||||
|
@ -11,20 +11,19 @@
|
|||||||
"mmap.cpp",
|
"mmap.cpp",
|
||||||
"control.cpp",
|
"control.cpp",
|
||||||
"buttons.ts",
|
"buttons.ts",
|
||||||
|
"png.cpp",
|
||||||
"screen.cpp",
|
"screen.cpp",
|
||||||
"screen.ts",
|
"screen.ts",
|
||||||
"output.cpp",
|
"output.cpp",
|
||||||
"output.ts",
|
"output.ts",
|
||||||
"core.ts",
|
"core.ts",
|
||||||
"input.ts",
|
"input.ts",
|
||||||
"ir.ts",
|
|
||||||
"color.ts",
|
|
||||||
"gyro.ts",
|
|
||||||
"ultrasonic.ts",
|
|
||||||
"touch.ts",
|
|
||||||
"shims.d.ts",
|
"shims.d.ts",
|
||||||
"enums.d.ts",
|
"enums.d.ts",
|
||||||
"dal.d.ts",
|
"dal.d.ts",
|
||||||
|
"images.ts",
|
||||||
|
"images.jres",
|
||||||
|
"icons.jres",
|
||||||
"ns.ts"
|
"ns.ts"
|
||||||
],
|
],
|
||||||
"testFiles": [
|
"testFiles": [
|
||||||
|
@ -130,82 +130,6 @@ void _blitLine(int xw, int y, Buffer buf, Draw mode) {
|
|||||||
blitLineCore(XX(xw), y, YY(xw), buf->data, mode);
|
blitLineCore(XX(xw), y, YY(xw), buf->data, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t ones[] = {
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
|
||||||
};
|
|
||||||
|
|
||||||
bool isValidIcon(Buffer buf) {
|
|
||||||
return buf->length >= 3 && buf->data[0] == 0xf0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const uint8_t bitdouble[] = {
|
|
||||||
0x00, 0x03, 0x0c, 0x0f, 0x30, 0x33, 0x3c, 0x3f, 0xc0, 0xc3, 0xcc, 0xcf, 0xf0, 0xf3, 0xfc, 0xff,
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Double size of an icon. */
|
|
||||||
//%
|
|
||||||
Buffer doubleIcon(Buffer buf) {
|
|
||||||
if (!isValidIcon(buf))
|
|
||||||
return NULL;
|
|
||||||
int w = buf->data[1];
|
|
||||||
if (w > 126)
|
|
||||||
return NULL;
|
|
||||||
int bw = PIX2BYTES(w);
|
|
||||||
int h = (buf->length - 2) / bw;
|
|
||||||
int bw2 = PIX2BYTES(w * 2);
|
|
||||||
Buffer out = mkBuffer(NULL, 2 + bw2 * h * 2);
|
|
||||||
out->data[0] = 0xf0;
|
|
||||||
out->data[1] = w * 2;
|
|
||||||
uint8_t *src = buf->data + 2;
|
|
||||||
uint8_t *dst = out->data + 2;
|
|
||||||
for (int i = 0; i < h; ++i) {
|
|
||||||
for (int jj = 0; jj < 2; ++jj) {
|
|
||||||
auto p = src;
|
|
||||||
for (int j = 0; j < bw; ++j) {
|
|
||||||
*dst++ = bitdouble[*p & 0xf];
|
|
||||||
*dst++ = bitdouble[*p >> 4];
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
src += bw;
|
|
||||||
}
|
|
||||||
return out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Draw an icon on the screen. */
|
|
||||||
//%
|
|
||||||
void drawIcon(int x, int y, Buffer buf, Draw mode) {
|
|
||||||
if (!isValidIcon(buf))
|
|
||||||
return;
|
|
||||||
if (mode & (Draw::Double | Draw::Quad)) {
|
|
||||||
buf = doubleIcon(buf);
|
|
||||||
if (mode & Draw::Quad) {
|
|
||||||
auto pbuf = buf;
|
|
||||||
buf = doubleIcon(buf);
|
|
||||||
decrRC(pbuf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int pixwidth = buf->data[1];
|
|
||||||
int ptr = 2;
|
|
||||||
int bytewidth = PIX2BYTES(pixwidth);
|
|
||||||
pixwidth = min(pixwidth, LCD_WIDTH);
|
|
||||||
while (ptr + bytewidth <= buf->length) {
|
|
||||||
if (mode & (Draw::Clear | Draw::Xor | Draw::Transparent)) {
|
|
||||||
// no erase of background
|
|
||||||
} else {
|
|
||||||
blitLineCore(x, y, pixwidth, ones, Draw::Clear);
|
|
||||||
}
|
|
||||||
blitLineCore(x, y, pixwidth, &buf->data[ptr], mode);
|
|
||||||
y++;
|
|
||||||
ptr += bytewidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mode & Draw::Double)
|
|
||||||
decrRC(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Clear screen and reset font to normal. */
|
/** Clear screen and reset font to normal. */
|
||||||
//%
|
//%
|
||||||
void clear() {
|
void clear() {
|
||||||
@ -256,7 +180,7 @@ void init() {
|
|||||||
mappedFrameBuffer = (uint8_t *)mmap(NULL, FB_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
|
mappedFrameBuffer = (uint8_t *)mmap(NULL, FB_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
|
||||||
DMESG("map %p", mappedFrameBuffer);
|
DMESG("map %p", mappedFrameBuffer);
|
||||||
if (mappedFrameBuffer == MAP_FAILED) {
|
if (mappedFrameBuffer == MAP_FAILED) {
|
||||||
target_panic(111);
|
target_panic(903);
|
||||||
}
|
}
|
||||||
clear();
|
clear();
|
||||||
|
|
||||||
@ -309,11 +233,23 @@ extern "C" void drawPanic(int code) {
|
|||||||
updateLCD();
|
updateLCD();
|
||||||
|
|
||||||
int fd = open("/dev/lms_ui", O_RDWR);
|
int fd = open("/dev/lms_ui", O_RDWR);
|
||||||
uint8_t cmd[] = { 48 + 5, 0 };
|
uint8_t cmd[] = {48 + 5, 0};
|
||||||
write(fd, cmd, 2);
|
write(fd, cmd, 2);
|
||||||
close(fd);
|
close(fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isValidImage(Buffer buf) {
|
||||||
|
return buf != NULL && buf->length >= 3 && buf->data[0] == 0xf0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Makes an image bound to a buffer. */
|
||||||
|
//%
|
||||||
|
Image imageOf(Buffer buf) {
|
||||||
|
if (!isValidImage(buf))
|
||||||
|
return NULL;
|
||||||
|
incrRC(buf);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace pxt {
|
namespace pxt {
|
||||||
@ -321,3 +257,105 @@ void screen_init() {
|
|||||||
screen::init();
|
screen::init();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//% fixedInstances
|
||||||
|
namespace ImageMethods {
|
||||||
|
|
||||||
|
using namespace screen;
|
||||||
|
|
||||||
|
static const uint8_t bitdouble[] = {
|
||||||
|
0x00, 0x03, 0x0c, 0x0f, 0x30, 0x33, 0x3c, 0x3f, 0xc0, 0xc3, 0xcc, 0xcf, 0xf0, 0xf3, 0xfc, 0xff,
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint8_t ones[] = {
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
|
};
|
||||||
|
|
||||||
|
/** Returns the underlaying Buffer object. */
|
||||||
|
//% property
|
||||||
|
Buffer buffer(Image ic) {
|
||||||
|
incrRC(ic);
|
||||||
|
return ic;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns the width of an image. */
|
||||||
|
//% property
|
||||||
|
int width(Image ic) {
|
||||||
|
if (!isValidImage(ic))
|
||||||
|
return 0;
|
||||||
|
return ic->data[1];
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Returns the height of an image. */
|
||||||
|
//% property
|
||||||
|
int height(Image ic) {
|
||||||
|
if (!isValidImage(ic))
|
||||||
|
return 0;
|
||||||
|
int bw = PIX2BYTES(ic->data[1]);
|
||||||
|
return (ic->length - 2) / bw;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Double size of an image. */
|
||||||
|
//%
|
||||||
|
Image doubled(Image buf) {
|
||||||
|
if (!isValidImage(buf))
|
||||||
|
return NULL;
|
||||||
|
int w = buf->data[1];
|
||||||
|
if (w > 126)
|
||||||
|
return NULL;
|
||||||
|
int bw = PIX2BYTES(w);
|
||||||
|
int h = (buf->length - 2) / bw;
|
||||||
|
int bw2 = PIX2BYTES(w * 2);
|
||||||
|
Buffer out = mkBuffer(NULL, 2 + bw2 * h * 2);
|
||||||
|
out->data[0] = 0xf0;
|
||||||
|
out->data[1] = w * 2;
|
||||||
|
uint8_t *src = buf->data + 2;
|
||||||
|
uint8_t *dst = out->data + 2;
|
||||||
|
for (int i = 0; i < h; ++i) {
|
||||||
|
for (int jj = 0; jj < 2; ++jj) {
|
||||||
|
auto p = src;
|
||||||
|
for (int j = 0; j < bw; ++j) {
|
||||||
|
*dst++ = bitdouble[*p & 0xf];
|
||||||
|
*dst++ = bitdouble[*p >> 4];
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
src += bw;
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Draw an image on the screen. */
|
||||||
|
//%
|
||||||
|
void draw(Image buf, int x, int y, Draw mode) {
|
||||||
|
if (!isValidImage(buf))
|
||||||
|
return;
|
||||||
|
if (mode & (Draw::Double | Draw::Quad)) {
|
||||||
|
buf = doubled(buf);
|
||||||
|
if (mode & Draw::Quad) {
|
||||||
|
auto pbuf = buf;
|
||||||
|
buf = doubled(buf);
|
||||||
|
decrRC(pbuf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int pixwidth = buf->data[1];
|
||||||
|
int ptr = 2;
|
||||||
|
int bytewidth = PIX2BYTES(pixwidth);
|
||||||
|
pixwidth = min(pixwidth, LCD_WIDTH);
|
||||||
|
while (ptr + bytewidth <= buf->length) {
|
||||||
|
if (mode & (Draw::Clear | Draw::Xor | Draw::Transparent)) {
|
||||||
|
// no erase of background
|
||||||
|
} else {
|
||||||
|
blitLineCore(x, y, pixwidth, ones, Draw::Clear);
|
||||||
|
}
|
||||||
|
blitLineCore(x, y, pixwidth, &buf->data[ptr], mode);
|
||||||
|
y++;
|
||||||
|
ptr += bytewidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode & (Draw::Double | Draw::Quad))
|
||||||
|
decrRC(buf);
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
namespace screen {
|
namespace brick {
|
||||||
//% shim=screen::_setPixel
|
//% shim=screen::_setPixel
|
||||||
function _setPixel(p0: uint32, p1: uint32, mode: Draw): void { }
|
function _setPixel(p0: uint32, p1: uint32, mode: Draw): void { }
|
||||||
|
|
||||||
@ -27,7 +27,7 @@ namespace screen {
|
|||||||
currFont = f
|
currFont = f
|
||||||
}
|
}
|
||||||
|
|
||||||
export const heart = hex`f007 367f7f3e1c08`
|
export const heart = screen.imageOf(hex`f007 367f7f3e1c08`)
|
||||||
|
|
||||||
export function defaultFont(): Font {
|
export function defaultFont(): Font {
|
||||||
return {
|
return {
|
||||||
@ -78,24 +78,32 @@ namespace screen {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function setPixel(x: number, y: number, mode = Draw.Normal) {
|
/**
|
||||||
|
* Sets a pixel on or off
|
||||||
|
* @param on a value indicating if the pixel should be on or off
|
||||||
|
* @param x the starting position's x coordinate, eg: 0
|
||||||
|
* @param y the starting position's x coordinate, eg: 0
|
||||||
|
*/
|
||||||
|
//% blockId=screen_setpixel block="`icons.brickDisplay` set pixel %on| at x: %x| y: %y"
|
||||||
|
//% weight=98 group="Screen"
|
||||||
|
//% x.min=0 x.max=178 y.min=0 y.max=128 on.fieldEditor=toggleonoff
|
||||||
|
export function setPixel(on: boolean, x: number, y: number) {
|
||||||
x |= 0
|
x |= 0
|
||||||
y |= 0
|
y |= 0
|
||||||
if (0 <= x && x < DAL.LCD_WIDTH && 0 <= y && y < DAL.LCD_HEIGHT)
|
if (0 <= x && x < DAL.LCD_WIDTH && 0 <= y && y < DAL.LCD_HEIGHT)
|
||||||
_setPixel(x, y, mode)
|
_setPixel(x, y, on ? Draw.Normal : Draw.Clear)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show text on the screen.
|
* Show text on the screen.
|
||||||
* @param text the text to print on the screen, eg: "Hello world"
|
* @param text the text to print on the screen, eg: "Hello world"
|
||||||
* @param x the starting position's x coordinate, eg: 0
|
* @param x the starting position's x coordinate, eg: 0
|
||||||
* @param y the starting position's x coordinate, eg: 0
|
* @param y the starting position's x coordinate, eg: 0
|
||||||
*/
|
*/
|
||||||
//% blockId=screen_drawText block="print %text| at x: %x| y: %y"
|
//% blockId=screen_print block="`icons.brickDisplay` print %text| at x: %x| y: %y"
|
||||||
//% weight=99 group="Screen" blockNamespace=output inlineInputMode="inline"
|
//% weight=99 group="Screen" inlineInputMode="inline" blockGap=8
|
||||||
//% x.min=0 x.max=178 y.min=0 y.max=128
|
//% x.min=0 x.max=178 y.min=0 y.max=128
|
||||||
export function drawText(text: string, x: number, y: number, mode = Draw.Normal) {
|
export function print(text: string, x: number, y: number, mode = Draw.Normal) {
|
||||||
x |= 0
|
x |= 0
|
||||||
y |= 0
|
y |= 0
|
||||||
if (!currFont) currFont = defaultFont()
|
if (!currFont) currFont = defaultFont()
|
||||||
@ -103,10 +111,11 @@ namespace screen {
|
|||||||
let cp = 0
|
let cp = 0
|
||||||
let byteWidth = (currFont.charWidth + 7) >> 3
|
let byteWidth = (currFont.charWidth + 7) >> 3
|
||||||
let charSize = byteWidth * currFont.charHeight
|
let charSize = byteWidth * currFont.charHeight
|
||||||
let iconBuf = output.createBuffer(2 + charSize)
|
let imgBuf = output.createBuffer(2 + charSize)
|
||||||
let double = (mode & Draw.Quad) ? 4 : (mode & Draw.Double) ? 2 : 1
|
let double = (mode & Draw.Quad) ? 4 : (mode & Draw.Double) ? 2 : 1
|
||||||
iconBuf[0] = 0xf0
|
imgBuf[0] = 0xf0
|
||||||
iconBuf[1] = currFont.charWidth
|
imgBuf[1] = currFont.charWidth
|
||||||
|
let img = screen.imageOf(imgBuf)
|
||||||
while (cp < text.length) {
|
while (cp < text.length) {
|
||||||
let ch = text.charCodeAt(cp++)
|
let ch = text.charCodeAt(cp++)
|
||||||
if (ch == 10) {
|
if (ch == 10) {
|
||||||
@ -115,15 +124,42 @@ namespace screen {
|
|||||||
}
|
}
|
||||||
if (ch < 32) continue
|
if (ch < 32) continue
|
||||||
let idx = (ch - currFont.firstChar) * charSize
|
let idx = (ch - currFont.firstChar) * charSize
|
||||||
if (idx < 0 || idx + iconBuf.length - 1 > currFont.data.length)
|
if (idx < 0 || idx + imgBuf.length - 1 > currFont.data.length)
|
||||||
iconBuf.fill(0, 2)
|
imgBuf.fill(0, 2)
|
||||||
else
|
else
|
||||||
iconBuf.write(2, currFont.data.slice(idx, charSize))
|
imgBuf.write(2, currFont.data.slice(idx, charSize))
|
||||||
drawIcon(x, y, iconBuf, mode)
|
img.draw(x, y, mode)
|
||||||
x += double * currFont.charWidth
|
x += double * currFont.charWidth
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shows an image on screen
|
||||||
|
* @param image image to draw
|
||||||
|
*/
|
||||||
|
//% blockId=screen_show_image block="`icons.brickDisplay` show image %image=scren_image_picker"
|
||||||
|
//% weight=95 group="Screen" blockGap=8
|
||||||
|
export function showImage(image: Image, delay: number = 400) {
|
||||||
|
if (!image) return;
|
||||||
|
image.draw(0, 0, Draw.Normal);
|
||||||
|
delay = Math.max(0, delay);
|
||||||
|
if (delay > 0)
|
||||||
|
loops.pause(delay);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An image
|
||||||
|
* @param image the image
|
||||||
|
*/
|
||||||
|
//% blockId=scren_image_picker block="%image" shim=TD_ID
|
||||||
|
//% image.fieldEditor="imagedropdown"
|
||||||
|
//% image.fieldOptions.columns=6
|
||||||
|
//% image.fieldOptions.hasSearchBar=true
|
||||||
|
//% group="Screen" weight=0 blockHidden=1
|
||||||
|
export function _imagePicker(image: Image): Image {
|
||||||
|
return image;
|
||||||
|
}
|
||||||
|
|
||||||
export function drawRect(x: number, y: number, w: number, h: number, mode = Draw.Normal) {
|
export function drawRect(x: number, y: number, w: number, h: number, mode = Draw.Normal) {
|
||||||
x |= 0;
|
x |= 0;
|
||||||
y |= 0;
|
y |= 0;
|
||||||
|
41
libs/core/shims.d.ts
vendored
@ -72,17 +72,44 @@ declare namespace serial {
|
|||||||
}
|
}
|
||||||
declare namespace screen {
|
declare namespace screen {
|
||||||
|
|
||||||
/** Double size of an icon. */
|
/** Decompresses a 1-bit gray scale PNG image to image format. */
|
||||||
//% shim=screen::doubleIcon
|
//% shim=screen::unpackPNG
|
||||||
function doubleIcon(buf: Buffer): Buffer;
|
function unpackPNG(png: Buffer): Image;
|
||||||
|
}
|
||||||
/** Draw an icon on the screen. */
|
declare namespace screen {
|
||||||
//% shim=screen::drawIcon
|
|
||||||
function drawIcon(x: int32, y: int32, buf: Buffer, mode: Draw): void;
|
|
||||||
|
|
||||||
/** Clear screen and reset font to normal. */
|
/** Clear screen and reset font to normal. */
|
||||||
//% shim=screen::clear
|
//% shim=screen::clear
|
||||||
function clear(): void;
|
function clear(): void;
|
||||||
|
|
||||||
|
/** Makes an image bound to a buffer. */
|
||||||
|
//% shim=screen::imageOf
|
||||||
|
function imageOf(buf: Buffer): Image;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//% fixedInstances
|
||||||
|
declare interface Image {
|
||||||
|
/** Returns the underlaying Buffer object. */
|
||||||
|
//% property shim=ImageMethods::buffer
|
||||||
|
buffer: Buffer;
|
||||||
|
|
||||||
|
/** Returns the width of an image. */
|
||||||
|
//% property shim=ImageMethods::width
|
||||||
|
width: int32;
|
||||||
|
|
||||||
|
/** Returns the height of an image. */
|
||||||
|
//% property shim=ImageMethods::height
|
||||||
|
height: int32;
|
||||||
|
|
||||||
|
/** Double size of an image. */
|
||||||
|
//% shim=ImageMethods::doubled
|
||||||
|
doubled(): Image;
|
||||||
|
|
||||||
|
/** Draw an image on the screen. */
|
||||||
|
//% shim=ImageMethods::draw
|
||||||
|
draw(x: int32, y: int32, mode: Draw): void;
|
||||||
}
|
}
|
||||||
declare namespace output {
|
declare namespace output {
|
||||||
|
|
||||||
|
@ -1,48 +1,48 @@
|
|||||||
screen.clear()
|
screen.clear()
|
||||||
screen.drawText("PXT!", 10, 30, Draw.Quad)
|
screen.print("PXT!", 10, 30, Draw.Quad)
|
||||||
|
|
||||||
screen.drawRect(40, 40, 20, 10, Draw.Fill)
|
screen.drawRect(40, 40, 20, 10, Draw.Fill)
|
||||||
output.setLights(LightsPattern.Orange)
|
motors.setStatusLight(LightsPattern.Orange)
|
||||||
|
|
||||||
screen.drawIcon(100, 50, screen.doubleIcon(screen.heart), Draw.Double | Draw.Transparent)
|
screen.heart.doubled().draw(100, 50, Draw.Double | Draw.Transparent)
|
||||||
|
|
||||||
input.buttonEnter.onEvent(ButtonEvent.Click, () => {
|
sensors.buttonEnter.onEvent(ButtonEvent.Click, () => {
|
||||||
screen.clear()
|
screen.clear()
|
||||||
})
|
})
|
||||||
|
|
||||||
input.buttonLeft.onEvent(ButtonEvent.Click, () => {
|
sensors.buttonLeft.onEvent(ButtonEvent.Click, () => {
|
||||||
screen.drawRect(10, 70, 20, 10, Draw.Fill)
|
screen.drawRect(10, 70, 20, 10, Draw.Fill)
|
||||||
output.setLights(LightsPattern.Red)
|
motors.setStatusLight(LightsPattern.Red)
|
||||||
screen.setFont(screen.microbitFont())
|
screen.setFont(screen.microbitFont())
|
||||||
})
|
})
|
||||||
|
|
||||||
input.buttonRight.onEvent(ButtonEvent.Click, () => {
|
sensors.buttonRight.onEvent(ButtonEvent.Click, () => {
|
||||||
screen.drawText("Right!", 10, 60)
|
screen.print("Right!", 10, 60)
|
||||||
})
|
})
|
||||||
|
|
||||||
input.buttonDown.onEvent(ButtonEvent.Click, () => {
|
sensors.buttonDown.onEvent(ButtonEvent.Click, () => {
|
||||||
screen.drawText("Down! ", 10, 60)
|
screen.print("Down! ", 10, 60)
|
||||||
})
|
})
|
||||||
|
|
||||||
input.buttonUp.onEvent(ButtonEvent.Click, () => {
|
sensors.buttonUp.onEvent(ButtonEvent.Click, () => {
|
||||||
screen.drawText("Up! ", 10, 60)
|
screen.print("Up! ", 10, 60)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
let num = 0
|
let num = 0
|
||||||
|
|
||||||
input.touchSensor.onEvent(ButtonEvent.Click, () => {
|
sensors.touchSensor1.onEvent(TouchSensorEvent.Bumped, () => {
|
||||||
screen.drawText("Click! " + num, 10, 60)
|
screen.print("Click! " + num, 10, 60)
|
||||||
num++
|
num++
|
||||||
})
|
})
|
||||||
|
|
||||||
input.remoteTopLeft.onEvent(ButtonEvent.Click, () => {
|
sensors.remoteButtonTopLeft.onEvent(ButtonEvent.Click, () => {
|
||||||
screen.drawText("TOPLEFT " + num, 10, 60)
|
screen.print("TOPLEFT " + num, 10, 60)
|
||||||
num++
|
num++
|
||||||
})
|
})
|
||||||
|
|
||||||
input.remoteTopRight.onEvent(ButtonEvent.Down, () => {
|
sensors.remoteButtonTopRight.onEvent(ButtonEvent.Down, () => {
|
||||||
screen.drawText("TOPRIGH " + num, 10, 60)
|
screen.print("TOPRIGH " + num, 10, 60)
|
||||||
num++
|
num++
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -54,7 +54,7 @@ loops.forever(() => {
|
|||||||
/*
|
/*
|
||||||
loops.forever(() => {
|
loops.forever(() => {
|
||||||
let v = input.color.getColor()
|
let v = input.color.getColor()
|
||||||
screen.drawText(10, 60, v + " ")
|
screen.print(10, 60, v + " ")
|
||||||
loops.pause(200)
|
loops.pause(200)
|
||||||
})
|
})
|
||||||
*/
|
*/
|
@ -1,28 +0,0 @@
|
|||||||
namespace input {
|
|
||||||
export class TouchSensor extends internal.AnalogSensor {
|
|
||||||
button: Button;
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super()
|
|
||||||
this.button = new Button()
|
|
||||||
}
|
|
||||||
|
|
||||||
_query() {
|
|
||||||
return this._readPin6() > 2500 ? 1 : 0
|
|
||||||
}
|
|
||||||
|
|
||||||
_update(prev: number, curr: number) {
|
|
||||||
this.button.update(curr > 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
_deviceType() {
|
|
||||||
return DAL.DEVICE_TYPE_TOUCH
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//% whenUsed
|
|
||||||
export const touchSensorImpl: TouchSensor = new TouchSensor()
|
|
||||||
|
|
||||||
//% whenUsed
|
|
||||||
export const touchSensor: Button = touchSensorImpl.button
|
|
||||||
}
|
|
@ -1,22 +0,0 @@
|
|||||||
namespace input {
|
|
||||||
|
|
||||||
export class UltraSonicSensor extends internal.UartSensor {
|
|
||||||
constructor() {
|
|
||||||
super()
|
|
||||||
}
|
|
||||||
|
|
||||||
_deviceType() {
|
|
||||||
return DAL.DEVICE_TYPE_ULTRASONIC
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Get distance in mm */
|
|
||||||
getDistance() {
|
|
||||||
// it supposedly also has an inch mode, but we stick to mm
|
|
||||||
this._setMode(0)
|
|
||||||
return this.getNumber(NumberFormat.UInt16LE, 0) & 0x0fff
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//% whenUsed
|
|
||||||
export const ultrasonic: UltraSonicSensor = new UltraSonicSensor()
|
|
||||||
}
|
|
@ -1,12 +1,16 @@
|
|||||||
|
|
||||||
//% color="#D42878"
|
//% color="#00A5C8" weight=100
|
||||||
//% groups='["Brick buttons"]'
|
//% groups='["Light", "Buttons", "Screen"]'
|
||||||
namespace input {
|
namespace brick {
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//% color="#D42878" weight=95
|
||||||
|
namespace sensors {
|
||||||
}
|
}
|
||||||
|
|
||||||
//% color="#8AC044" weight=90 icon="\uf185"
|
//% color="#8AC044" weight=90 icon="\uf185"
|
||||||
//% groups='["Lights", "Screen", "Motors"]'
|
namespace motors {
|
||||||
namespace output {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//% color="#DF5014" weight=80
|
//% color="#DF5014" weight=80
|
||||||
|
@ -8,7 +8,11 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"base": "file:../base",
|
"base": "file:../base",
|
||||||
"core": "file:../core",
|
"core": "file:../core",
|
||||||
"music": "file:../music"
|
"music": "file:../music",
|
||||||
|
"color-sensor": "file:../color-sensor",
|
||||||
|
"touch-sensor": "file:../touch-sensor",
|
||||||
|
"ultrasonic-sensor": "file:../ultrasonic-sensor",
|
||||||
|
"gyro-sensor": "file:../gyro-sensor"
|
||||||
},
|
},
|
||||||
"public": true
|
"public": true
|
||||||
}
|
}
|
||||||
|
3
libs/gyro-sensor/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# Gyro Sensor
|
||||||
|
|
||||||
|
The library to interact with the Gyro Sensor.
|
4
libs/gyro-sensor/_locales/gyro-sensor-jsdoc-strings.json
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"sensors.GyroSensor.angle": "Get the current angle from the gyroscope.",
|
||||||
|
"sensors.GyroSensor.rate": "Get the current rotation rate from the gyroscope."
|
||||||
|
}
|
10
libs/gyro-sensor/_locales/gyro-sensor-strings.json
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"sensors.GyroSensor.angle|block": "`icons.gyroSensor` %sensor|angle",
|
||||||
|
"sensors.GyroSensor.rate|block": "`icons.gyroSensor` %sensor|rotation rate",
|
||||||
|
"sensors.gyro1|block": "1",
|
||||||
|
"sensors.gyro2|block": "2",
|
||||||
|
"sensors.gyro3|block": "3",
|
||||||
|
"sensors.gyro4|block": "4",
|
||||||
|
"{id:category}Sensors": "Sensors",
|
||||||
|
"{id:group}Gyro Sensor": "Gyro Sensor"
|
||||||
|
}
|
70
libs/gyro-sensor/gyro.ts
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
const enum GyroSensorMode {
|
||||||
|
None = -1,
|
||||||
|
Angle = 0,
|
||||||
|
Rate = 1,
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace sensors {
|
||||||
|
//% fixedInstances
|
||||||
|
export class GyroSensor extends internal.UartSensor {
|
||||||
|
constructor(port: number) {
|
||||||
|
super(port)
|
||||||
|
}
|
||||||
|
|
||||||
|
_deviceType() {
|
||||||
|
return DAL.DEVICE_TYPE_GYRO
|
||||||
|
}
|
||||||
|
|
||||||
|
setMode(m: GyroSensorMode) {
|
||||||
|
this._setMode(m)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current angle from the gyroscope.
|
||||||
|
* @param sensor the gyroscope to query the request
|
||||||
|
*/
|
||||||
|
//% help=input/gyro/angle
|
||||||
|
//% block="`icons.gyroSensor` %sensor|angle"
|
||||||
|
//% blockId=gyroGetAngle
|
||||||
|
//% parts="gyroscope"
|
||||||
|
//% sensor.fieldEditor="imagedropdown"
|
||||||
|
//% sensor.fieldOptions.columns=4
|
||||||
|
//% blockNamespace=sensors
|
||||||
|
//% weight=65 blockGap=8
|
||||||
|
//% group="Gyro Sensor"
|
||||||
|
angle(): number {
|
||||||
|
this.setMode(GyroSensorMode.Angle)
|
||||||
|
return this.getNumber(NumberFormat.Int16LE, 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the current rotation rate from the gyroscope.
|
||||||
|
* @param sensor the gyroscope to query the request
|
||||||
|
*/
|
||||||
|
//% help=input/gyro/rate
|
||||||
|
//% block="`icons.gyroSensor` %sensor|rotation rate"
|
||||||
|
//% blockId=gyroGetRate
|
||||||
|
//% parts="gyroscope"
|
||||||
|
//% sensor.fieldEditor="imagedropdown"
|
||||||
|
//% sensor.fieldOptions.columns=4
|
||||||
|
//% blockNamespace=sensors
|
||||||
|
//% weight=65 blockGap=8
|
||||||
|
//% group="Gyro Sensor"
|
||||||
|
rate(): number {
|
||||||
|
this.setMode(GyroSensorMode.Rate)
|
||||||
|
return this.getNumber(NumberFormat.Int16LE, 0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//% fixedInstance whenUsed block="1" jres=icons.port1
|
||||||
|
export const gyro1: GyroSensor = new GyroSensor(1)
|
||||||
|
|
||||||
|
//% fixedInstance whenUsed block="2" weight=95 jres=icons.port2
|
||||||
|
export const gyro2: GyroSensor = new GyroSensor(2)
|
||||||
|
|
||||||
|
//% fixedInstance whenUsed block="3" jres=icons.port3
|
||||||
|
export const gyro3: GyroSensor = new GyroSensor(3)
|
||||||
|
|
||||||
|
//% fixedInstance whenUsed block="4" jres=icons.port4
|
||||||
|
export const gyro4: GyroSensor = new GyroSensor(4)
|
||||||
|
}
|