Compare commits
148 Commits
Author | SHA1 | Date | |
---|---|---|---|
f4f2e0ba0e | |||
22c31c57df | |||
6879961297 | |||
69fcb7407a | |||
4dfada877c | |||
b10b636766 | |||
ba47fb0589 | |||
f36e14fe69 | |||
8bab919db2 | |||
89a82b54dc | |||
15ee6ebe9c | |||
9bf50665fc | |||
f594cdefac | |||
5ce7a83f5d | |||
d7ef7c353c | |||
c7cb300cd9 | |||
4e194536d3 | |||
570cd7474f | |||
9ea5597734 | |||
2c0cc6a3d7 | |||
08f79c5a1a | |||
f817912e07 | |||
603932c2b6 | |||
a0907e7229 | |||
635d4a7624 | |||
69d3938d85 | |||
f08f9105ba | |||
7228cbe1cb | |||
1ea0a0172a | |||
d548dfb578 | |||
a52ce112dc | |||
ea956f1a73 | |||
ba1b9a54b4 | |||
59e39fa76d | |||
9187c47e09 | |||
fcf91caeb4 | |||
822227eb48 | |||
8a331648d6 | |||
4f70d341e4 | |||
e06659ab4c | |||
437c36b983 | |||
3d73f193a8 | |||
a71dee2923 | |||
9ef5b8d4ad | |||
8aa47f3d1e | |||
02b0716043 | |||
188d5b3aa7 | |||
16c67f0e30 | |||
104185a41e | |||
73363d11b2 | |||
61996acdd9 | |||
21deb45728 | |||
34578d2370 | |||
3f50b5c39a | |||
d371225066 | |||
387effbdd0 | |||
18480080e7 | |||
bf6a932e5f | |||
23bb316403 | |||
138de504e5 | |||
df13e40a45 | |||
511ea2374b | |||
db4ed6daf3 | |||
a60427e2cf | |||
ef5b4172e8 | |||
7baf7cfede | |||
efd6718ea3 | |||
057a1d66dc | |||
5ddfcd5508 | |||
00f0922189 | |||
41f4b64087 | |||
ea5ee1c007 | |||
603e4c0fc1 | |||
e50c88008a | |||
f057964a50 | |||
2eda2061cf | |||
a4ebf4c746 | |||
f1880897d4 | |||
ad2e82060d | |||
d1bb19e30e | |||
280963d1eb | |||
9fadf49b0e | |||
3c2be25384 | |||
e1f623a94d | |||
cb5f9648f5 | |||
9158cfe4f6 | |||
0b763978f2 | |||
25fded6afb | |||
fc6fb0811f | |||
49bedcbcc5 | |||
32876f4584 | |||
da9bea30b5 | |||
d0aa68aeee | |||
51731fbbc9 | |||
751ea1494b | |||
dfe84471e8 | |||
0f3de6cf07 | |||
21195e4abf | |||
c992100a38 | |||
20a4673f98 | |||
966fd81870 | |||
cb9d2aeb39 | |||
3cee55f4c2 | |||
3815d2fd3b | |||
1453b7e0a3 | |||
6fb5c54280 | |||
9d5ca35e83 | |||
893dd0f9c4 | |||
c3419c0b74 | |||
a4164470d8 | |||
0dd5ab9bde | |||
e93e659e8a | |||
8357372fb5 | |||
54cb076002 | |||
dbd3eb464b | |||
10cd39a4ec | |||
fddc4e647a | |||
798a351f15 | |||
e61dffff03 | |||
b9f5096480 | |||
9912d68c8b | |||
951b9be6e4 | |||
aa8635c4e7 | |||
4e4f5495da | |||
f64bf57000 | |||
f1242724b5 | |||
cd0c9df86e | |||
337d42287a | |||
ce3383f1b7 | |||
e51721303a | |||
50f6c77fdb | |||
5ed0135124 | |||
892a2d585f | |||
9890f2340a | |||
109b809909 | |||
9cbf5efd7e | |||
a27a7fcd55 | |||
85263fb84d | |||
b5ad898c9e | |||
456df3c442 | |||
1552eb05b4 | |||
d60e2c4a7d | |||
f4b78c3ee7 | |||
dd5e1957d5 | |||
d61a63f70a | |||
4207bd06c0 | |||
16b9a5027d | |||
cbe68b3199 |
3
.gitignore
vendored
@ -16,6 +16,9 @@ clients/win10/*.opendb
|
|||||||
clients/**/bin/**
|
clients/**/bin/**
|
||||||
clients/**/obj/**
|
clients/**/obj/**
|
||||||
clients/electron/projects
|
clients/electron/projects
|
||||||
|
libs/**/_locales/**
|
||||||
|
libs/**/shims.d.ts
|
||||||
|
libs/**/enums.d.ts
|
||||||
|
|
||||||
videos/**
|
videos/**
|
||||||
|
|
||||||
|
@ -4,7 +4,8 @@
|
|||||||
|
|
||||||
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
|
LEGO Auth: https://src.education.lego.com/groups/ev3-makecode (use Google Authenticator)
|
||||||
|
LEGO Chat: https://chat.internal.education.lego.com/make-code/channels/town-square
|
||||||
|
|
||||||
## Local Dev setup
|
## Local Dev setup
|
||||||
|
|
||||||
|
@ -1,5 +1,57 @@
|
|||||||
# @extends
|
# @extends
|
||||||
|
|
||||||
|
## Projects #projects
|
||||||
|
|
||||||
|
* [Maker](/maker)
|
||||||
|
* [Sound Machine](/maker/sound-machine)
|
||||||
|
* [Sound of Color](/maker/sound-of-color)
|
||||||
|
* [Security Gadget](/maker/security-gadget)
|
||||||
|
* [Intruder detector](/maker/intruder-detector)
|
||||||
|
* [Puppet](/maker/puppet)
|
||||||
|
|
||||||
|
* [Coding](/coding)
|
||||||
|
* [Three Point Turn 1](/coding/three-point-turn-1)
|
||||||
|
* [Three Point Turn 2](/coding/three-point-turn-2)
|
||||||
|
* [Three Point Turn 3](/coding/three-point-turn-3)
|
||||||
|
* [Reversing the robot 1](/coding/reversing-the-robot-1)
|
||||||
|
* [Reversing the robot 2](/coding/reversing-the-robot-2)
|
||||||
|
* [Reversing the robot 3](/coding/reversing-the-robot-3)
|
||||||
|
* [Light the way 1](/coding/light-the-way-1)
|
||||||
|
* [Light the way 2](/coding/light-the-way-2)
|
||||||
|
* [Light the way 3](/coding/light-the-way-3)
|
||||||
|
* [Traffic Lights 1](/coding/traffic-lights-1)
|
||||||
|
* [Traffic Lights 2](/coding/traffic-lights-2)
|
||||||
|
* [Traffic Lights 3](/coding/traffic-lights-3)
|
||||||
|
* [Reverse Beeper 1](/coding/reverse-beeper-1)
|
||||||
|
* [Reverse Beeper 2](/coding/reverse-beeper-2)
|
||||||
|
* [Reverse Beeper 3](/coding/reverse-beeper-3)
|
||||||
|
* [Ignition 1](/coding/ignition-1)
|
||||||
|
* [Ignition 2](/coding/ignition-2)
|
||||||
|
* [Ignition 3](/coding/ignition-3)
|
||||||
|
* [Cruise Control 1](/coding/cruise-control-1)
|
||||||
|
* [Cruise Control 2](/coding/cruise-control-2)
|
||||||
|
* [Cruise Control 3](/coding/cruise-control-3)
|
||||||
|
* [Roaming 1](/coding/roaming-1)
|
||||||
|
* [Roaming 2](/coding/roaming-2)
|
||||||
|
|
||||||
|
* [Lessons](/lessons)
|
||||||
|
* [Make it move](/lessons/make-it-move)
|
||||||
|
* [Line detection](/lessons/line-detection)
|
||||||
|
|
||||||
## Reference #reference
|
## Reference #reference
|
||||||
|
|
||||||
* [Reference](/reference)
|
* [Reference](/reference)
|
||||||
|
* [Brick](/reference/brick)
|
||||||
|
* [show string](/reference/brick/show-string)
|
||||||
|
* [show number](/reference/brick/show-number)
|
||||||
|
* [show value](/reference/brick/show-value)
|
||||||
|
* [show mood](/reference/brick/show-mood)
|
||||||
|
* [show image](/reference/brick/show-image)
|
||||||
|
* [clear screen](/reference/brick/clear-screen)
|
||||||
|
* [print ports](/reference/brick/print-ports)
|
||||||
|
* [on event](/reference/brick/button/on-event)
|
||||||
|
* [is pressed](/reference/brick/button/is-pressed)
|
||||||
|
* [was pressed](/reference/brick/button/was-pressed)
|
||||||
|
* [pause until](/reference/brick/button/pause-until)
|
||||||
|
* [set light](/reference/brick/set-light)
|
||||||
|
* [battery level](/reference/brick/battery-level)
|
||||||
|
@ -6,14 +6,14 @@ Welcome to the **Microsoft MakeCode** editor for the **@boardname@**!
|
|||||||
|
|
||||||
You can program the @boardname@ using [Blocks](/blocks) or [JavaScript](/javascript) in your web browser:
|
You can program the @boardname@ using [Blocks](/blocks) or [JavaScript](/javascript) in your web browser:
|
||||||
|
|
||||||
```block
|
```blocks
|
||||||
input.buttonA.onEvent(ButtonEvent.Click, () => {
|
brick.buttonEnter.onEvent(ButtonEvent.Bumped, () => {
|
||||||
light.showRing(`blue blue blue blue blue blue blue blue blue blue`)
|
motors.largeA.setSpeed(50)
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
```typescript
|
```typescript
|
||||||
input.buttonA.onEvent(ButtonEvent.Click, () => {
|
brick.buttonEnter.onEvent(ButtonEvent.Bumped, () => {
|
||||||
light.showRing(`blue blue blue blue blue blue blue blue blue blue`)
|
motors.largeA.setSpeed(50)
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -22,10 +22,10 @@ The editor work in [most modern browsers](/browsers), work [offline](/offline) o
|
|||||||
## [Compile and Flash: Your Program!](/device/usb)
|
## [Compile and Flash: Your Program!](/device/usb)
|
||||||
|
|
||||||
When you have your code ready, you connect your @boardname@ to a computer via a USB cable
|
When you have your code ready, you connect your @boardname@ to a computer via a USB cable
|
||||||
**then press the reset button** so it appears as a mounted drive (named **CPLAYBOOT**).
|
so it appears as a mounted drive (named **EV3**).
|
||||||
|
|
||||||
Compilation to machine code from [Blocks](/blocks) or [JavaScript](/javascript) happens in the browser. You save the binary
|
Compilation to machine code from [Blocks](/blocks) or [JavaScript](/javascript) happens in the browser. You save the binary
|
||||||
program to a **.uf2** file, which you then copy to the **CPLAYBOOT** drive, which flashes the device with the new program.
|
program to a **.uf2** file, which you then copy to the **EV3** drive, which flashes the device with the new program.
|
||||||
|
|
||||||
## Simulator: Test Your Code
|
## Simulator: Test Your Code
|
||||||
|
|
||||||
@ -33,11 +33,7 @@ You can run your code using the micro:bit simulator, all within the confines of
|
|||||||
The simulator has support for the LED screen, buttons, as well as compass, accelerometer, and digital I/O pins.
|
The simulator has support for the LED screen, buttons, as well as compass, accelerometer, and digital I/O pins.
|
||||||
|
|
||||||
```sim
|
```sim
|
||||||
loops.forever(() => {
|
brick.buttonEnter.onEvent(ButtonEvent.Bumped, () => {
|
||||||
light.pixels.showAnimation(light.animation(LightAnimation.Rainbow), 1000)
|
motors.largeA.setSpeed(50)
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
```package
|
|
||||||
light
|
|
||||||
```
|
|
||||||
|
@ -167,4 +167,5 @@
|
|||||||
"description": "Activity 2",
|
"description": "Activity 2",
|
||||||
"url":"/coding/roaming-2",
|
"url":"/coding/roaming-2",
|
||||||
"cardType": "example"
|
"cardType": "example"
|
||||||
}, {
|
}]
|
||||||
|
```
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
let speed = 0;
|
let speed = 0;
|
||||||
sensors.touch1.onEvent(TouchSensorEvent.Pressed, function () {
|
sensors.touch1.onEvent(ButtonEvent.Pressed, function () {
|
||||||
if (speed < 100)
|
if (speed < 100)
|
||||||
speed = speed + 10;
|
speed = speed + 10;
|
||||||
motors.largeBC.setSpeed(speed);
|
motors.largeBC.setSpeed(speed);
|
||||||
|
@ -2,12 +2,12 @@
|
|||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
let speed = 0;
|
let speed = 0;
|
||||||
sensors.touch1.onEvent(TouchSensorEvent.Pressed, function () {
|
sensors.touch1.onEvent(ButtonEvent.Pressed, function () {
|
||||||
if (speed < 100)
|
if (speed < 100)
|
||||||
speed = speed + 10;
|
speed = speed + 10;
|
||||||
motors.largeBC.setSpeed(speed);
|
motors.largeBC.setSpeed(speed);
|
||||||
})
|
})
|
||||||
sensors.touch2.onEvent(TouchSensorEvent.Pressed, function () {
|
sensors.touch2.onEvent(ButtonEvent.Pressed, function () {
|
||||||
if (speed > -100)
|
if (speed > -100)
|
||||||
speed = speed - 10;
|
speed = speed - 10;
|
||||||
motors.largeBC.setSpeed(speed);
|
motors.largeBC.setSpeed(speed);
|
||||||
|
@ -14,14 +14,14 @@ function accelerate() {
|
|||||||
}
|
}
|
||||||
function update() {
|
function update() {
|
||||||
brick.clearScreen()
|
brick.clearScreen()
|
||||||
brick.printLine("speed: " + speed, 1)
|
brick.showString("speed: " + speed, 1)
|
||||||
motors.largeBC.setSpeed(speed)
|
motors.largeBC.setSpeed(speed)
|
||||||
}
|
}
|
||||||
sensors.touch2.onEvent(TouchSensorEvent.Pressed, function () {
|
sensors.touch2.onEvent(ButtonEvent.Pressed, function () {
|
||||||
accelerate()
|
accelerate()
|
||||||
update()
|
update()
|
||||||
})
|
})
|
||||||
sensors.touch1.onEvent(TouchSensorEvent.Pressed, function () {
|
sensors.touch1.onEvent(ButtonEvent.Pressed, function () {
|
||||||
decelerate()
|
decelerate()
|
||||||
update()
|
update()
|
||||||
})
|
})
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# Ignition Activity 1
|
# Ignition Activity 1
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
sensors.touch1.onEvent(TouchSensorEvent.Pressed, function () {
|
sensors.touch1.onEvent(ButtonEvent.Pressed, function () {
|
||||||
brick.showImage(images.eyesDizzy)
|
brick.showImage(images.eyesDizzy)
|
||||||
})
|
})
|
||||||
sensors.ultrasonic4.onEvent(UltrasonicSensorEvent.ObjectDetected, function () {
|
sensors.ultrasonic4.onEvent(UltrasonicSensorEvent.ObjectDetected, function () {
|
||||||
|
@ -7,7 +7,7 @@ sensors.color3.onLightChanged(LightIntensityMode.Ambient, LightCondition.Bright,
|
|||||||
sensors.color3.onLightChanged(LightIntensityMode.Ambient, LightCondition.Dark, function () {
|
sensors.color3.onLightChanged(LightIntensityMode.Ambient, LightCondition.Dark, function () {
|
||||||
brick.showImage(images.objectsLightOn)
|
brick.showImage(images.objectsLightOn)
|
||||||
})
|
})
|
||||||
sensors.touch1.onEvent(TouchSensorEvent.Pressed, function () {
|
sensors.touch1.onEvent(ButtonEvent.Pressed, function () {
|
||||||
brick.showImage(images.objectsLightOn);
|
brick.showImage(images.objectsLightOn);
|
||||||
})
|
})
|
||||||
```
|
```
|
@ -7,5 +7,5 @@ loops.forever(function () {
|
|||||||
})
|
})
|
||||||
motors.largeBC.setSpeed(-20);
|
motors.largeBC.setSpeed(-20);
|
||||||
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectNear);
|
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectNear);
|
||||||
motors.stopAllMotors();
|
motors.largeBC.stop();
|
||||||
```
|
```
|
||||||
|
@ -9,5 +9,5 @@ loops.forever(function () {
|
|||||||
})
|
})
|
||||||
motors.largeBC.setSpeed(-20);
|
motors.largeBC.setSpeed(-20);
|
||||||
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectNear);
|
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectNear);
|
||||||
motors.stopAllMotors();
|
motors.largeBC.stop();
|
||||||
```
|
```
|
||||||
|
@ -3,14 +3,13 @@
|
|||||||
```blocks
|
```blocks
|
||||||
let beep = false
|
let beep = false
|
||||||
beep = true
|
beep = true
|
||||||
control.runInBackground(function () {
|
control.runInParallel(function () {
|
||||||
motors.largeB.setSpeed(-20)
|
motors.largeBC.setSpeed(-20)
|
||||||
motors.largeC.setSpeed(-20)
|
|
||||||
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectNear)
|
sensors.ultrasonic4.pauseUntil(UltrasonicSensorEvent.ObjectNear)
|
||||||
motors.stopAllMotors()
|
motors.largeBC.stop()
|
||||||
beep = false
|
beep = false
|
||||||
})
|
})
|
||||||
control.runInBackground(function () {
|
control.runInParallel(function () {
|
||||||
while (beep) {
|
while (beep) {
|
||||||
if (sensors.ultrasonic4.distance() < 20) {
|
if (sensors.ultrasonic4.distance() < 20) {
|
||||||
music.playTone(440, sensors.ultrasonic4.distance())
|
music.playTone(440, sensors.ultrasonic4.distance())
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
# Reversing the robot Activity 1
|
# Reversing the robot Activity 1
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
brick.buttonEnter.onEvent(ButtonEvent.Click, function () {
|
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||||
motors.largeBC.setSpeed(50)
|
motors.largeBC.setSpeed(50)
|
||||||
sensors.touchSensor1.pauseUntil(TouchSensorEvent.Pressed)
|
sensors.touch1.pauseUntil(ButtonEvent.Pressed)
|
||||||
motors.largeBC.setSpeed(0)
|
motors.largeBC.setSpeed(0)
|
||||||
loops.pause(1000)
|
loops.pause(1000)
|
||||||
brick.setLight(LightsPattern.OrangeFlash)
|
brick.setLight(BrickLight.OrangeFlash)
|
||||||
motors.largeBC.setSpeed(-50)
|
motors.largeBC.setSpeed(-50)
|
||||||
loops.pause(2000)
|
loops.pause(2000)
|
||||||
motors.largeBC.setSpeed(0)
|
motors.largeBC.setSpeed(0)
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
# Reversing the robot Activity 2
|
# Reversing the robot Activity 2
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
brick.buttonEnter.onEvent(ButtonEvent.Click, function () {
|
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||||
sensors.touchSensor1.pauseUntil(TouchSensorEvent.Pressed)
|
sensors.touch1.pauseUntil(ButtonEvent.Pressed)
|
||||||
motors.largeBC.setSpeed(50)
|
motors.largeBC.setSpeed(50)
|
||||||
sensors.touchSensor2.pauseUntil(TouchSensorEvent.Pressed)
|
sensors.touch2.pauseUntil(ButtonEvent.Pressed)
|
||||||
motors.largeBC.setSpeed(0)
|
motors.largeBC.setSpeed(0)
|
||||||
loops.pause(1000)
|
loops.pause(1000)
|
||||||
brick.setLight(LightsPattern.OrangeFlash)
|
brick.setLight(BrickLight.OrangeFlash)
|
||||||
motors.largeBC.setSpeed(-50)
|
motors.largeBC.setSpeed(-50)
|
||||||
loops.pause(2000)
|
loops.pause(2000)
|
||||||
motors.largeBC.setSpeed(0)
|
motors.largeBC.setSpeed(0)
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
# Reversing the robot Activity 3
|
# Reversing the robot Activity 3
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
brick.buttonEnter.onEvent(ButtonEvent.Click, function () {
|
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||||
brick.showImage(images.eyesSleeping)
|
brick.showImage(images.eyesSleeping)
|
||||||
sensors.touchSensor1.pauseUntil(TouchSensorEvent.Pressed)
|
sensors.touch1.pauseUntil(ButtonEvent.Pressed)
|
||||||
brick.showImage(images.eyesNeutral)
|
brick.showImage(images.eyesNeutral)
|
||||||
motors.largeBC.setSpeed(50)
|
motors.largeBC.setSpeed(50)
|
||||||
sensors.touchSensor2.pauseUntil(TouchSensorEvent.Pressed)
|
sensors.touch2.pauseUntil(ButtonEvent.Pressed)
|
||||||
brick.showImage(images.eyesTiredMiddle)
|
brick.showImage(images.eyesTiredMiddle)
|
||||||
motors.largeBC.setSpeed(0)
|
motors.largeBC.setSpeed(0)
|
||||||
loops.pause(1000)
|
loops.pause(1000)
|
||||||
brick.setLight(LightsPattern.OrangeFlash)
|
brick.setLight(BrickLight.OrangeFlash)
|
||||||
brick.showImage(images.eyesDizzy)
|
brick.showImage(images.eyesDizzy)
|
||||||
motors.largeBC.setSpeed(-50)
|
motors.largeBC.setSpeed(-50)
|
||||||
loops.pause(2000)
|
loops.pause(2000)
|
||||||
|
@ -2,16 +2,16 @@
|
|||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
let drive: number[] = []
|
let drive: number[] = []
|
||||||
brick.buttonLeft.onEvent(ButtonEvent.Click, function () {
|
brick.buttonLeft.onEvent(ButtonEvent.Bumped, function () {
|
||||||
drive.push(1)
|
drive.push(1)
|
||||||
})
|
})
|
||||||
brick.buttonRight.onEvent(ButtonEvent.Click, function () {
|
brick.buttonRight.onEvent(ButtonEvent.Bumped, function () {
|
||||||
drive.push(3)
|
drive.push(3)
|
||||||
})
|
})
|
||||||
brick.buttonUp.onEvent(ButtonEvent.Click, function () {
|
brick.buttonUp.onEvent(ButtonEvent.Bumped, function () {
|
||||||
drive.push(4)
|
drive.push(4)
|
||||||
})
|
})
|
||||||
brick.buttonDown.onEvent(ButtonEvent.Click, function () {
|
brick.buttonDown.onEvent(ButtonEvent.Bumped, function () {
|
||||||
drive.push(5)
|
drive.push(5)
|
||||||
})
|
})
|
||||||
pauseUntil(() => drive.length >= 5)
|
pauseUntil(() => drive.length >= 5)
|
||||||
@ -19,17 +19,13 @@ loops.pause(1000)
|
|||||||
music.playSoundEffectUntilDone(sounds.communicationGo)
|
music.playSoundEffectUntilDone(sounds.communicationGo)
|
||||||
for (let d of drive) {
|
for (let d of drive) {
|
||||||
if (d == 1) {
|
if (d == 1) {
|
||||||
motors.largeC.setSpeedFor(50, 360, MoveUnit.Degrees)
|
motors.largeC.setSpeed(50, 360, MoveUnit.Degrees)
|
||||||
motors.largeC.pauseUntilReady()
|
|
||||||
} else if (d == 3) {
|
} else if (d == 3) {
|
||||||
motors.largeB.setSpeedFor(50, 360, MoveUnit.Degrees)
|
motors.largeB.setSpeed(50, 360, MoveUnit.Degrees)
|
||||||
motors.largeB.pauseUntilReady()
|
|
||||||
} else if (d == 4) {
|
} else if (d == 4) {
|
||||||
motors.largeBC.setSpeedFor(50, 360, MoveUnit.Degrees)
|
motors.largeBC.setSpeed(50, 360, MoveUnit.Degrees)
|
||||||
motors.largeBC.pauseUntilReady()
|
|
||||||
} else {
|
} else {
|
||||||
motors.largeBC.setSpeedFor(-50, 360, MoveUnit.Degrees)
|
motors.largeBC.setSpeed(-50, 360, MoveUnit.Degrees)
|
||||||
motors.largeBC.pauseUntilReady()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
music.playSoundEffectUntilDone(sounds.communicationGameOver)
|
music.playSoundEffectUntilDone(sounds.communicationGameOver)
|
||||||
|
@ -2,38 +2,34 @@
|
|||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
let drive: number[] = []
|
let drive: number[] = []
|
||||||
brick.buttonLeft.onEvent(ButtonEvent.Click, function () {
|
brick.buttonLeft.onEvent(ButtonEvent.Bumped, function () {
|
||||||
drive.push(1)
|
drive.push(1)
|
||||||
music.playSoundEffectUntilDone(sounds.systemClick)
|
music.playSoundEffectUntilDone(sounds.systemClick)
|
||||||
})
|
})
|
||||||
brick.buttonRight.onEvent(ButtonEvent.Click, function () {
|
brick.buttonRight.onEvent(ButtonEvent.Bumped, function () {
|
||||||
drive.push(3)
|
drive.push(3)
|
||||||
music.playSoundEffectUntilDone(sounds.systemClick)
|
music.playSoundEffectUntilDone(sounds.systemClick)
|
||||||
})
|
})
|
||||||
brick.buttonUp.onEvent(ButtonEvent.Click, function () {
|
brick.buttonUp.onEvent(ButtonEvent.Bumped, function () {
|
||||||
drive.push(4)
|
drive.push(4)
|
||||||
music.playSoundEffectUntilDone(sounds.systemClick)
|
music.playSoundEffectUntilDone(sounds.systemClick)
|
||||||
})
|
})
|
||||||
brick.buttonDown.onEvent(ButtonEvent.Click, function () {
|
brick.buttonDown.onEvent(ButtonEvent.Bumped, function () {
|
||||||
drive.push(5)
|
drive.push(5)
|
||||||
music.playSoundEffectUntilDone(sounds.systemClick)
|
music.playSoundEffectUntilDone(sounds.systemClick)
|
||||||
})
|
})
|
||||||
brick.buttonEnter.pauseUntil(ButtonEvent.Click);
|
brick.buttonEnter.pauseUntil(ButtonEvent.Bumped);
|
||||||
loops.pause(1000)
|
loops.pause(1000)
|
||||||
music.playSoundEffectUntilDone(sounds.communicationGo)
|
music.playSoundEffectUntilDone(sounds.communicationGo)
|
||||||
for (let d of drive) {
|
for (let d of drive) {
|
||||||
if (d == 1) {
|
if (d == 1) {
|
||||||
motors.largeC.setSpeedFor(50, 360, MoveUnit.Degrees)
|
motors.largeC.setSpeed(50, 360, MoveUnit.Degrees)
|
||||||
motors.largeC.pauseUntilReady()
|
|
||||||
} else if (d == 3) {
|
} else if (d == 3) {
|
||||||
motors.largeB.setSpeedFor(50, 360, MoveUnit.Degrees)
|
motors.largeB.setSpeed(50, 360, MoveUnit.Degrees)
|
||||||
motors.largeB.pauseUntilReady()
|
|
||||||
} else if (d == 4) {
|
} else if (d == 4) {
|
||||||
motors.largeBC.setSpeedFor(50, 360, MoveUnit.Degrees)
|
motors.largeBC.setSpeed(50, 360, MoveUnit.Degrees)
|
||||||
motors.largeBC.pauseUntilReady()
|
|
||||||
} else {
|
} else {
|
||||||
motors.largeBC.setSpeedFor(-50, 360, MoveUnit.Degrees)
|
motors.largeBC.setSpeed(-50, 360, MoveUnit.Degrees)
|
||||||
motors.largeBC.pauseUntilReady()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
music.playSoundEffectUntilDone(sounds.communicationGameOver)
|
music.playSoundEffectUntilDone(sounds.communicationGameOver)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# Three Point Turn Activity 1
|
# Three Point Turn Activity 1
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
brick.buttonEnter.onEvent(ButtonEvent.Click, function () {
|
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||||
motors.largeBC.tank(75, 30)
|
motors.largeBC.tank(75, 30)
|
||||||
loops.pause(1500)
|
loops.pause(1500)
|
||||||
motors.largeBC.tank(-30, -75)
|
motors.largeBC.tank(-30, -75)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# Three Point Turn Activity 2
|
# Three Point Turn Activity 2
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
brick.buttonEnter.onEvent(ButtonEvent.Click, function () {
|
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||||
motors.largeBC.tank(75, 30)
|
motors.largeBC.tank(75, 30)
|
||||||
loops.pause(1500)
|
loops.pause(1500)
|
||||||
motors.largeBC.tank(-30, -75)
|
motors.largeBC.tank(-30, -75)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# Three Point Turn Activity 3
|
# Three Point Turn Activity 3
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
brick.buttonEnter.onEvent(ButtonEvent.Click, function () {
|
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||||
motors.largeBC.tank(75, 30)
|
motors.largeBC.tank(75, 30)
|
||||||
loops.pause(1500)
|
loops.pause(1500)
|
||||||
motors.largeBC.tank(-30, -75)
|
motors.largeBC.tank(-30, -75)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# Traffic Lights Activity 1
|
# Traffic Lights Activity 1
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
brick.buttonEnter.onEvent(ButtonEvent.Click, function () {
|
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||||
motors.largeBC.tank(20, 20)
|
motors.largeBC.tank(20, 20)
|
||||||
sensors.color3.pauseForColor(ColorSensorColor.Red)
|
sensors.color3.pauseForColor(ColorSensorColor.Red)
|
||||||
motors.largeBC.tank(0, 0)
|
motors.largeBC.tank(0, 0)
|
||||||
|
178
docs/examples/core-set/gyroboy-blocks.md
Normal file
@ -0,0 +1,178 @@
|
|||||||
|
# Gyroboy
|
||||||
|
|
||||||
|
Work in progress
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
let motorSpeed1 = 0
|
||||||
|
let motorSpeed2 = 0
|
||||||
|
let motorSpeed3 = 0
|
||||||
|
let motorSpeed = 0
|
||||||
|
let fallen = false
|
||||||
|
let motorSpeed0 = 0
|
||||||
|
let oldControlDrive = 0
|
||||||
|
let controlDrive = 0
|
||||||
|
let power = 0
|
||||||
|
let motorAngle = 0
|
||||||
|
let gyroAngle = 0
|
||||||
|
let controlSteering = 0
|
||||||
|
let state = 0
|
||||||
|
let motorPosition = 0
|
||||||
|
let temp = 0
|
||||||
|
let gyroRate = 0
|
||||||
|
let timestep = 0
|
||||||
|
sensors.color1.onColorDetected(ColorSensorColor.Red, function () {
|
||||||
|
music.playTone(2000, 100)
|
||||||
|
controlDrive = 0
|
||||||
|
controlSteering = 0
|
||||||
|
})
|
||||||
|
// reads the motor angle and computes the motor speed,
|
||||||
|
// position
|
||||||
|
function computeMotors() {
|
||||||
|
temp = motorAngle
|
||||||
|
// read angle on both motors
|
||||||
|
motorAngle = motors.largeD.angle() + motors.largeA.angle()
|
||||||
|
// and estimate speed as angle difference
|
||||||
|
motorSpeed0 = motorAngle - temp
|
||||||
|
// average last 4 speed readings
|
||||||
|
motorSpeed = (motorSpeed0 + motorSpeed1 + motorSpeed2 + motorSpeed3) / 4 / timestep
|
||||||
|
// shift all previous recorded speeds by one
|
||||||
|
motorSpeed3 = motorSpeed2
|
||||||
|
motorSpeed2 = motorSpeed1
|
||||||
|
motorSpeed1 = motorSpeed0
|
||||||
|
// compute position from speed
|
||||||
|
motorPosition = motorPosition + timestep * motorSpeed
|
||||||
|
}
|
||||||
|
// read the gyro rate and computes the angle
|
||||||
|
function computeGyro() {
|
||||||
|
gyroRate = sensors.gyro2.rate()
|
||||||
|
gyroAngle = gyroAngle + timestep * gyroRate
|
||||||
|
}
|
||||||
|
function reset() {
|
||||||
|
state = 0
|
||||||
|
// sleeping
|
||||||
|
moods.sleeping.show();
|
||||||
|
// reset counters
|
||||||
|
motors.largeA.reset()
|
||||||
|
motors.largeD.reset()
|
||||||
|
// motors are unregulated
|
||||||
|
motors.largeA.setRegulated(false)
|
||||||
|
motors.largeD.setRegulated(false)
|
||||||
|
// clear the gyro sensor to remove drift
|
||||||
|
sensors.gyro2.reset()
|
||||||
|
// fall detection timer
|
||||||
|
control.timer2.reset()
|
||||||
|
// timestep computation timer
|
||||||
|
control.timer3.reset()
|
||||||
|
motorAngle = 0
|
||||||
|
motorPosition = 0
|
||||||
|
motorSpeed = 0
|
||||||
|
motorSpeed0 = 0
|
||||||
|
motorSpeed1 = 0
|
||||||
|
motorSpeed2 = 0
|
||||||
|
motorSpeed3 = 0
|
||||||
|
gyroRate = 0
|
||||||
|
gyroAngle = 0
|
||||||
|
fallen = false
|
||||||
|
power = 0
|
||||||
|
controlSteering = 0
|
||||||
|
controlDrive = 0
|
||||||
|
// awake
|
||||||
|
moods.awake.show();
|
||||||
|
gyroAngle = -0.25
|
||||||
|
state = 1;
|
||||||
|
}
|
||||||
|
// compute set point for motor position and required
|
||||||
|
// motor power
|
||||||
|
function computePower() {
|
||||||
|
// apply control and compute desired motor position
|
||||||
|
motorPosition -= timestep * controlDrive;
|
||||||
|
// estimate power based on sensor readings and control
|
||||||
|
// values
|
||||||
|
power = 0.8 * gyroRate + 15 * gyroAngle + (0.08 * motorSpeed + 0.12 * motorPosition) - 0.01 * controlDrive
|
||||||
|
// ensure that power stays within -100, 100
|
||||||
|
if (power > 100) {
|
||||||
|
power = 100
|
||||||
|
} else if (power < -100) {
|
||||||
|
power = -100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// test if the robot has fallen off
|
||||||
|
function checkFallen() {
|
||||||
|
if (Math.abs(power) < 100) {
|
||||||
|
control.timer2.reset()
|
||||||
|
}
|
||||||
|
if (control.timer2.seconds() > 2) {
|
||||||
|
fallen = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// stop all motors and wait for touch button to be
|
||||||
|
// pressed
|
||||||
|
function stop() {
|
||||||
|
motors.stopAllMotors()
|
||||||
|
state = 0
|
||||||
|
moods.knockedOut.show();
|
||||||
|
sensors.touch3.pauseUntil(ButtonEvent.Pressed)
|
||||||
|
moods.neutral.show();
|
||||||
|
}
|
||||||
|
sensors.ultrasonic4.onEvent(UltrasonicSensorEvent.ObjectNear, function () {
|
||||||
|
moods.dizzy.show()
|
||||||
|
controlSteering = 0
|
||||||
|
oldControlDrive = controlDrive
|
||||||
|
controlDrive = -10
|
||||||
|
motors.mediumC.setSpeed(30, 30, MoveUnit.Degrees);
|
||||||
|
motors.mediumC.setSpeed(-30, 60, MoveUnit.Degrees);
|
||||||
|
motors.mediumC.setSpeed(30, 30, MoveUnit.Degrees);
|
||||||
|
if (Math.randomRange(-1, 1) >= 1) {
|
||||||
|
controlSteering = 70
|
||||||
|
} else {
|
||||||
|
controlSteering = -70
|
||||||
|
}
|
||||||
|
loops.pause(4000)
|
||||||
|
music.playTone(2000, 100)
|
||||||
|
controlSteering = 0
|
||||||
|
controlDrive = oldControlDrive
|
||||||
|
moods.neutral.show()
|
||||||
|
})
|
||||||
|
// compute the elapsed time since the last iteration
|
||||||
|
function computeTimestep() {
|
||||||
|
timestep = control.timer3.seconds()
|
||||||
|
control.timer3.reset()
|
||||||
|
}
|
||||||
|
sensors.color1.onColorDetected(ColorSensorColor.Green, function () {
|
||||||
|
moods.winking.show()
|
||||||
|
controlDrive = 150
|
||||||
|
controlSteering = 0
|
||||||
|
})
|
||||||
|
sensors.color1.onColorDetected(ColorSensorColor.Blue, function () {
|
||||||
|
moods.middleRight.show()
|
||||||
|
controlSteering = 70
|
||||||
|
})
|
||||||
|
// apply power to motors
|
||||||
|
function controlMotors() {
|
||||||
|
motors.largeA.setSpeed(power + controlSteering * 0.1)
|
||||||
|
motors.largeD.setSpeed(power - controlSteering * 0.1)
|
||||||
|
}
|
||||||
|
sensors.color1.onColorDetected(ColorSensorColor.Yellow, function () {
|
||||||
|
moods.middleLeft.show()
|
||||||
|
controlSteering = -70
|
||||||
|
})
|
||||||
|
sensors.color1.onColorDetected(ColorSensorColor.White, function () {
|
||||||
|
moods.sad.show();
|
||||||
|
controlDrive = -75
|
||||||
|
})
|
||||||
|
timestep = 0.014
|
||||||
|
// main loop
|
||||||
|
loops.forever(function () {
|
||||||
|
reset()
|
||||||
|
while (!fallen) {
|
||||||
|
control.timer3.pauseUntil(5)
|
||||||
|
computeTimestep()
|
||||||
|
computeGyro()
|
||||||
|
computeMotors()
|
||||||
|
computePower()
|
||||||
|
controlMotors()
|
||||||
|
checkFallen()
|
||||||
|
}
|
||||||
|
stop()
|
||||||
|
})
|
||||||
|
```
|
215
docs/examples/core-set/gyroboy-labview.md
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
# Gyroboy LabView
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
let mSum = 0;
|
||||||
|
let mPos = 0;
|
||||||
|
let mSpd = 0;
|
||||||
|
let mD = 0;
|
||||||
|
let mDP1 = 0;
|
||||||
|
let mDP2 = 0;
|
||||||
|
let mDP3 = 0;
|
||||||
|
let Crdv = 0;
|
||||||
|
let cLo = 0;
|
||||||
|
let gAng = 0;
|
||||||
|
let ok = false;
|
||||||
|
let pwr = 0;
|
||||||
|
let Cstr = 0;
|
||||||
|
let Cdrv = 0;
|
||||||
|
let gMn = 0;
|
||||||
|
let gMx = 0;
|
||||||
|
let gSum = 0;
|
||||||
|
let gyro = 0;
|
||||||
|
let gOS = 0;
|
||||||
|
let gSpd = 0;
|
||||||
|
let tInt = 0.014;
|
||||||
|
let lpwr = 0
|
||||||
|
let rpwr = 0
|
||||||
|
let tStart = 0
|
||||||
|
let st = 0
|
||||||
|
let oldDr = 0
|
||||||
|
|
||||||
|
function RST() {
|
||||||
|
motors.largeA.reset()
|
||||||
|
motors.largeD.reset()
|
||||||
|
motors.largeA.setRegulated(false)
|
||||||
|
motors.largeD.setRegulated(false)
|
||||||
|
sensors.gyro2.reset()
|
||||||
|
sensors.gyro2.rate()
|
||||||
|
control.timer2.reset()
|
||||||
|
loops.pause(5000)
|
||||||
|
mSum = 0;
|
||||||
|
mPos = 0;
|
||||||
|
mD = 0;
|
||||||
|
mDP1 = 0;
|
||||||
|
mDP2 = 0;
|
||||||
|
mDP3 = 0;
|
||||||
|
Crdv = 0;
|
||||||
|
cLo = 0;
|
||||||
|
gAng = 0;
|
||||||
|
ok = false;
|
||||||
|
pwr = 0;
|
||||||
|
st = 0;
|
||||||
|
Cstr = 0;
|
||||||
|
Cdrv = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function OS() {
|
||||||
|
// OSL
|
||||||
|
do {
|
||||||
|
gMn = 1000;
|
||||||
|
gMx = -100;
|
||||||
|
gSum = 0;
|
||||||
|
// gChk
|
||||||
|
for (let i = 0; i < 200; i++) {
|
||||||
|
gyro = sensors.gyro2.rate()
|
||||||
|
gSum = gyro;
|
||||||
|
gMx = Math.max(gMx, gyro)
|
||||||
|
gMn = Math.min(gMn, gyro)
|
||||||
|
loops.pause(4);
|
||||||
|
}
|
||||||
|
} while (gMx - gMn > 2);
|
||||||
|
gOS = gSum / 200;
|
||||||
|
}
|
||||||
|
|
||||||
|
function GT() {
|
||||||
|
if (cLo == 0) {
|
||||||
|
tInt = 0.014;
|
||||||
|
control.timer1.reset();
|
||||||
|
} else {
|
||||||
|
tInt = control.timer1.seconds() / cLo;
|
||||||
|
}
|
||||||
|
cLo++;
|
||||||
|
}
|
||||||
|
|
||||||
|
function GG() {
|
||||||
|
gyro = sensors.gyro2.rate();
|
||||||
|
gOS = 0.0005 * gyro + (1 - 0.0005) * gOS
|
||||||
|
gSpd = gyro - gOS;
|
||||||
|
gAng = gAng + tInt * gSpd;
|
||||||
|
}
|
||||||
|
|
||||||
|
function GM() {
|
||||||
|
let temp = mSum
|
||||||
|
mSum = motors.largeD.angle() + motors.largeA.angle();
|
||||||
|
mD = mSum - temp;
|
||||||
|
mPos = mPos + mD;
|
||||||
|
mSpd = ((mDP1 + mDP2 + mDP3 + mD) / 4) / tInt;
|
||||||
|
mDP3 = mDP2;
|
||||||
|
mDP2 = mDP1;
|
||||||
|
mDP1 = mD;
|
||||||
|
}
|
||||||
|
|
||||||
|
function EQ() {
|
||||||
|
mPos = mPos - Cdrv * tInt;
|
||||||
|
pwr = (0.8 * gSpd + 15 * gAng) + (0.08 * mSpd + 0.12 * mPos) - 0.01 * Cdrv
|
||||||
|
if (pwr > 100) pwr = 100
|
||||||
|
else if (pwr < -100) pwr = -100
|
||||||
|
}
|
||||||
|
|
||||||
|
function cntrl() {
|
||||||
|
mPos = mPos - tInt * Cdrv
|
||||||
|
lpwr = (pwr + Cstr * 0.1)
|
||||||
|
rpwr = (pwr - Cstr * 0.1)
|
||||||
|
}
|
||||||
|
|
||||||
|
function CHK() {
|
||||||
|
if (Math.abs(pwr) < 100)
|
||||||
|
control.timer2.reset();
|
||||||
|
if (control.timer2.seconds() > 2) {
|
||||||
|
ok = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// M
|
||||||
|
loops.forever(function () {
|
||||||
|
RST();
|
||||||
|
brick.showImage(images.eyesSleeping)
|
||||||
|
OS()
|
||||||
|
gAng = -0.25;
|
||||||
|
music.playSoundEffect(sounds.movementsSpeedUp)
|
||||||
|
brick.showImage(images.eyesAwake)
|
||||||
|
st = 1;
|
||||||
|
// BALANCE
|
||||||
|
while (!ok) {
|
||||||
|
GT();
|
||||||
|
let t1 = control.timer1.millis()
|
||||||
|
GG();
|
||||||
|
GM();
|
||||||
|
EQ();
|
||||||
|
cntrl();
|
||||||
|
motors.largeA.setSpeed(lpwr)
|
||||||
|
motors.largeD.setSpeed(rpwr)
|
||||||
|
CHK()
|
||||||
|
let t2 = control.timer1.millis();
|
||||||
|
let p = 5 - (t2 - t1);
|
||||||
|
loops.pause(Math.max(1, p))
|
||||||
|
}
|
||||||
|
motors.stopAllMotors()
|
||||||
|
st = 0;
|
||||||
|
brick.setLight(BrickLight.RedPulse);
|
||||||
|
brick.showImage(images.eyesKnockedOut)
|
||||||
|
music.playSoundEffect(sounds.movementsSpeedDown)
|
||||||
|
sensors.touch3.pauseUntil(ButtonEvent.Pressed)
|
||||||
|
brick.setLight(BrickLight.Off);
|
||||||
|
})
|
||||||
|
|
||||||
|
// BHV
|
||||||
|
loops.forever(function () {
|
||||||
|
switch (st) {
|
||||||
|
case 0:
|
||||||
|
Cdrv = 0;
|
||||||
|
Cstr = 0;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
Cdrv = 40;
|
||||||
|
loops.pause(4000);
|
||||||
|
Cdrv = 0;
|
||||||
|
music.playTone(1000, 100);
|
||||||
|
st = 2;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
switch (sensors.color1.color()) {
|
||||||
|
case ColorSensorColor.Red:
|
||||||
|
music.playTone(2000, 100);
|
||||||
|
Cdrv = 0;
|
||||||
|
Cstr = 0;
|
||||||
|
break;
|
||||||
|
case ColorSensorColor.Green:
|
||||||
|
music.playTone(2000, 100);
|
||||||
|
Cdrv = 150;
|
||||||
|
Cstr = 0;
|
||||||
|
break;
|
||||||
|
case ColorSensorColor.Blue:
|
||||||
|
music.playTone(2000, 100);
|
||||||
|
Cstr = 70;
|
||||||
|
break;
|
||||||
|
case ColorSensorColor.Yellow:
|
||||||
|
music.playTone(2000, 100);
|
||||||
|
Cstr = -70;
|
||||||
|
break;
|
||||||
|
case ColorSensorColor.White:
|
||||||
|
music.playTone(2000, 100);
|
||||||
|
Cdrv = -75;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (sensors.ultrasonic4.distance() < 25) {
|
||||||
|
Cstr = 0;
|
||||||
|
oldDr = Cdrv;
|
||||||
|
Cdrv = -10;
|
||||||
|
motors.mediumC.setSpeed(30, 30, MoveUnit.Degrees);
|
||||||
|
motors.mediumC.setSpeed(-30, 60, MoveUnit.Degrees);
|
||||||
|
motors.mediumC.setSpeed(30, 30, MoveUnit.Degrees);
|
||||||
|
if (Math.randomRange(-1, 1) >= 1)
|
||||||
|
Cstr = 70;
|
||||||
|
else
|
||||||
|
Cstr = -70;
|
||||||
|
loops.pause(4000);
|
||||||
|
music.playTone(2000, 100)
|
||||||
|
Cstr = 0;
|
||||||
|
Cdrv = oldDr;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
loops.pause(80);
|
||||||
|
})
|
||||||
|
```
|
390
docs/examples/core-set/puppy-labview.md
Normal file
@ -0,0 +1,390 @@
|
|||||||
|
# Puppy
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
let P_T = 0;
|
||||||
|
let ISS = 0;
|
||||||
|
let F_T = 0;
|
||||||
|
let P_C = 0;
|
||||||
|
let F_C = 0;
|
||||||
|
let DB_S = 0;
|
||||||
|
let NS = false;
|
||||||
|
let IBP = 0;
|
||||||
|
let IAP = 0;
|
||||||
|
let C = false;
|
||||||
|
let TC = false;
|
||||||
|
let OTC = false;
|
||||||
|
let COL = 0;
|
||||||
|
let OCOL = 0;
|
||||||
|
let _C = false;
|
||||||
|
let GTO = 0;
|
||||||
|
|
||||||
|
function DN() {
|
||||||
|
motors.largeAD.setBrake(true);
|
||||||
|
motors.largeAD.tank(50, 50, 1, MoveUnit.Seconds);
|
||||||
|
loops.pause(100);
|
||||||
|
motors.largeA.clearCounts()
|
||||||
|
motors.largeD.clearCounts()
|
||||||
|
}
|
||||||
|
|
||||||
|
function MNRH() {
|
||||||
|
motors.mediumC.setBrake(true)
|
||||||
|
brick.showImage(images.legoEv3icon)
|
||||||
|
brick.setLight(BrickLight.OrangePulse)
|
||||||
|
while (!brick.buttonEnter.wasPressed()) {
|
||||||
|
if (brick.buttonUp.wasPressed()) {
|
||||||
|
motors.mediumC.setSpeed(-100);
|
||||||
|
} else if (brick.buttonDown.wasPressed()) {
|
||||||
|
motors.mediumC.setSpeed(100);
|
||||||
|
} else {
|
||||||
|
motors.mediumC.stop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
motors.mediumC.stop();
|
||||||
|
motors.mediumC.clearCounts();
|
||||||
|
brick.setLight(BrickLight.Green);
|
||||||
|
}
|
||||||
|
|
||||||
|
function IS(t: number) {
|
||||||
|
ISS = t;
|
||||||
|
switch (t) {
|
||||||
|
case 0:
|
||||||
|
brick.showImage(images.eyesNeutral);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
brick.showImage(images.eyesSleeping);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
brick.showImage(images.eyesTear);
|
||||||
|
// draw rect...
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
brick.showImage(images.eyesHurt);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
brick.showImage(images.eyesAngry);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
brick.showImage(images.eyesTiredMiddle);
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
brick.showImage(images.eyesTiredRight);
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
brick.showImage(images.eyesTiredLeft);
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
brick.showImage(images.eyesLove);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function UP() {
|
||||||
|
if (motors.largeA.angle() > -50) {
|
||||||
|
control.runInParallel(function () {
|
||||||
|
motors.largeD.clearCounts()
|
||||||
|
motors.largeD.setSpeed(-35);
|
||||||
|
pauseUntil(() => motors.largeD.angle() < -25);
|
||||||
|
motors.largeD.stop();
|
||||||
|
motors.largeD.setRegulated(false)
|
||||||
|
motors.largeD.setSpeed(-15)
|
||||||
|
pauseUntil(() => motors.largeD.angle() < -65);
|
||||||
|
motors.largeD.stop();
|
||||||
|
})
|
||||||
|
motors.largeA.clearCounts()
|
||||||
|
motors.largeA.setSpeed(-35);
|
||||||
|
pauseUntil(() => motors.largeA.angle() < -25);
|
||||||
|
motors.largeA.stop();
|
||||||
|
motors.largeA.setRegulated(false)
|
||||||
|
motors.largeA.setSpeed(-15)
|
||||||
|
pauseUntil(() => motors.largeA.angle() < -65);
|
||||||
|
motors.largeA.stop();
|
||||||
|
|
||||||
|
loops.pause(500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function RST() {
|
||||||
|
P_T = Math.randomRange(3, 6);
|
||||||
|
F_T = Math.randomRange(2, 4);
|
||||||
|
P_C = 1;
|
||||||
|
F_C = 1;
|
||||||
|
control.timer1.reset();
|
||||||
|
control.timer2.reset();
|
||||||
|
control.timer3.reset();
|
||||||
|
CS(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function CS(db: number) {
|
||||||
|
if (DB_S != db) {
|
||||||
|
DB_S = db;
|
||||||
|
NS = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function MON() {
|
||||||
|
if (control.timer2.seconds() > 10) {
|
||||||
|
control.timer2.reset();
|
||||||
|
P_C--;
|
||||||
|
if (P_C < 0) {
|
||||||
|
P_C = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (control.timer1.seconds() > 20) {
|
||||||
|
control.timer1.reset()
|
||||||
|
F_C--;
|
||||||
|
if (F_C < 0) {
|
||||||
|
F_C = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (control.timer3.seconds() > 30) {
|
||||||
|
control.timer3.reset();
|
||||||
|
CS(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function UIS() {
|
||||||
|
if (control.timer5.seconds() > IBP) {
|
||||||
|
control.timer5.reset();
|
||||||
|
if (ISS == 1) {
|
||||||
|
ISS = 6;
|
||||||
|
IBP = Math.randomRange(1, 5);
|
||||||
|
} else {
|
||||||
|
ISS = 1;
|
||||||
|
IBP = 0.25;
|
||||||
|
}
|
||||||
|
IS(ISS);
|
||||||
|
}
|
||||||
|
if (control.timer6.seconds() > IAP) {
|
||||||
|
if (ISS != 1) {
|
||||||
|
control.timer6.reset();
|
||||||
|
IAP = Math.randomRange(1, 10)
|
||||||
|
if (ISS != 7) {
|
||||||
|
ISS = 7
|
||||||
|
} else {
|
||||||
|
ISS = 6;
|
||||||
|
}
|
||||||
|
IS(ISS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function UPDB() {
|
||||||
|
if ((P_T == P_C) && (F_T == F_C)) {
|
||||||
|
CS(6);
|
||||||
|
}
|
||||||
|
if ((P_T > P_C) && (F_T < F_C)) {
|
||||||
|
CS(3);
|
||||||
|
}
|
||||||
|
if ((P_T < P_C) && (F_T > F_C)) {
|
||||||
|
CS(5);
|
||||||
|
}
|
||||||
|
if ((P_C == 0) && (F_C > 0)) {
|
||||||
|
CS(2)
|
||||||
|
}
|
||||||
|
if (F_C == 0) {
|
||||||
|
CS(4)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function PTC() {
|
||||||
|
C = false;
|
||||||
|
OTC = TC;
|
||||||
|
TC = sensors.touch1.isPressed()
|
||||||
|
if (TC != OTC && TC) {
|
||||||
|
P_C++;
|
||||||
|
control.timer3.reset();
|
||||||
|
if (DB_S != 4) {
|
||||||
|
IS(2);
|
||||||
|
music.playSoundEffect(sounds.animalsDogSniff);
|
||||||
|
C = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return C;
|
||||||
|
}
|
||||||
|
|
||||||
|
function FDC() {
|
||||||
|
OCOL = COL;
|
||||||
|
COL = sensors.color4.color();
|
||||||
|
_C = false;
|
||||||
|
if ((COL != 0) && (OCOL != COL)) {
|
||||||
|
F_C++;
|
||||||
|
_C = true;
|
||||||
|
control.timer3.reset();
|
||||||
|
IS(2);
|
||||||
|
music.playSoundEffect(sounds.expressionsCrunching)
|
||||||
|
}
|
||||||
|
return _C;
|
||||||
|
}
|
||||||
|
|
||||||
|
function IDL() {
|
||||||
|
if (NS) {
|
||||||
|
NS = false;
|
||||||
|
UP();
|
||||||
|
}
|
||||||
|
UIS();
|
||||||
|
UPDB();
|
||||||
|
PTC();
|
||||||
|
FDC();
|
||||||
|
}
|
||||||
|
|
||||||
|
function MHT(Pos: number) {
|
||||||
|
let _R = Pos - motors.mediumC.angle();
|
||||||
|
if (_R >= 0) {
|
||||||
|
motors.mediumC.setSpeed(100, _R, MoveUnit.Degrees);
|
||||||
|
} else {
|
||||||
|
motors.mediumC.setSpeed(-100, Math.abs(_R), MoveUnit.Degrees);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function SLP() {
|
||||||
|
if (NS) {
|
||||||
|
NS = false;
|
||||||
|
IS(5)
|
||||||
|
DN()
|
||||||
|
MHT(3000)
|
||||||
|
IS(1)
|
||||||
|
music.playSoundEffect(sounds.expressionsSnoring)
|
||||||
|
}
|
||||||
|
if (sensors.touch1.isPressed() || brick.buttonEnter.isPressed()) {
|
||||||
|
music.stopAllSounds();
|
||||||
|
control.timer3.reset();
|
||||||
|
CS(7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function PLF() {
|
||||||
|
if (NS) {
|
||||||
|
NS = false
|
||||||
|
IS(0)
|
||||||
|
UP()
|
||||||
|
music.playSoundEffect(sounds.animalsDogBark2)
|
||||||
|
control.timer4.reset()
|
||||||
|
GTO = Math.randomRange(4, 8);
|
||||||
|
}
|
||||||
|
if(PTC()) {
|
||||||
|
CS(0);
|
||||||
|
}
|
||||||
|
if (control.timer4.seconds() > GTO) {
|
||||||
|
music.playSoundEffect(sounds.animalsDogBark2)
|
||||||
|
control.timer4.reset();
|
||||||
|
GTO = Math.randomRange(4, 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function NGR() {
|
||||||
|
NS = false
|
||||||
|
IS(4)
|
||||||
|
music.playSoundEffect(sounds.animalsDogGrowl);
|
||||||
|
UP();
|
||||||
|
loops.pause(1500);
|
||||||
|
music.stopAllSounds()
|
||||||
|
music.playSoundEffect(sounds.animalsDogBark1)
|
||||||
|
P_C--;
|
||||||
|
CS(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function HNG() {
|
||||||
|
if (NS) {
|
||||||
|
NS = false;
|
||||||
|
IS(3)
|
||||||
|
DN();
|
||||||
|
music.playSoundEffect(sounds.animalsDogWhine);
|
||||||
|
}
|
||||||
|
if(FDC()) {
|
||||||
|
CS(0)
|
||||||
|
}
|
||||||
|
if (PTC()) {
|
||||||
|
CS(3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function PPP() {
|
||||||
|
NS = false;
|
||||||
|
IS(2);
|
||||||
|
UP();
|
||||||
|
loops.pause(100)
|
||||||
|
motors.largeA.setSpeed(-30, 70, MoveUnit.Degrees);
|
||||||
|
loops.pause(800);
|
||||||
|
music.playSoundEffect(sounds.mechanicalHorn1);
|
||||||
|
loops.pause(1000);
|
||||||
|
for(let i = 0; i < 3; ++i) {
|
||||||
|
motors.largeA.setSpeed(-30, 20, MoveUnit.Degrees);
|
||||||
|
motors.largeA.setSpeed(30, 20, MoveUnit.Degrees);
|
||||||
|
}
|
||||||
|
motors.largeA.setSpeed(30, 70, MoveUnit.Degrees);
|
||||||
|
F_C = 1;
|
||||||
|
CS(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function HPY() {
|
||||||
|
IS(8)
|
||||||
|
MHT(0);
|
||||||
|
motors.largeAD.setSpeed(10, 0.8, MoveUnit.Seconds);
|
||||||
|
for(let i = 0; i < 3; ++i) {
|
||||||
|
music.playSoundEffect(sounds.animalsDogBark1);
|
||||||
|
motors.largeAD.setSpeed(-100, 0.2, MoveUnit.Seconds);
|
||||||
|
loops.pause(300)
|
||||||
|
motors.largeAD.setSpeed(10, 0.3, MoveUnit.Seconds)
|
||||||
|
}
|
||||||
|
loops.pause(500);
|
||||||
|
music.stopAllSounds();
|
||||||
|
DN();
|
||||||
|
RST();
|
||||||
|
}
|
||||||
|
|
||||||
|
function STL() {
|
||||||
|
UP();
|
||||||
|
motors.largeAD.setSpeed(-20, 60, MoveUnit.Degrees);
|
||||||
|
music.playSoundEffect(sounds.animalsDogWhine);
|
||||||
|
motors.largeAD.setSpeed(20, 60, MoveUnit.Degrees);
|
||||||
|
}
|
||||||
|
|
||||||
|
function WKU() {
|
||||||
|
let stateC = false;
|
||||||
|
IS(5);
|
||||||
|
music.playSoundEffect(sounds.animalsDogWhine)
|
||||||
|
MHT(0)
|
||||||
|
DN()
|
||||||
|
STL()
|
||||||
|
loops.pause(1000);
|
||||||
|
UP()
|
||||||
|
CS(0;)
|
||||||
|
}
|
||||||
|
|
||||||
|
DN();
|
||||||
|
MNRH();
|
||||||
|
// compare button state???
|
||||||
|
IS(1);
|
||||||
|
UP();
|
||||||
|
RST();
|
||||||
|
loops.forever(function () {
|
||||||
|
MON();
|
||||||
|
switch (DB_S) {
|
||||||
|
case 0:
|
||||||
|
IDL();
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
SLP();
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
PLF();
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
NGR();
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
HNG();
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
PPP();
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
HPY();
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
WKU();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
51
docs/examples/core-set/robotarm-labview.md
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
# Robot Arm
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
function INI() {
|
||||||
|
motors.largeB.setBrake(true)
|
||||||
|
motors.largeC.setBrake(true)
|
||||||
|
motors.mediumA.setBrake(true)
|
||||||
|
motors.largeB.setSpeed(-50)
|
||||||
|
pauseUntil(() => sensors.color3.light(LightIntensityMode.Reflected) > 25);
|
||||||
|
motors.largeB.stop();
|
||||||
|
motors.mediumA.setSpeed(30, 1, MoveUnit.Seconds);
|
||||||
|
motors.mediumA.setSpeed(-50, 90, MoveUnit.Degrees);
|
||||||
|
motors.largeC.setSpeed(50)
|
||||||
|
sensors.touch1.pauseUntil(ButtonEvent.Pressed);
|
||||||
|
motors.largeC.setSpeed(-50, 0.86, MoveUnit.Rotations);
|
||||||
|
}
|
||||||
|
|
||||||
|
INI()
|
||||||
|
|
||||||
|
let down = false;
|
||||||
|
loops.forever(function () {
|
||||||
|
brick.showImage(images.informationQuestionMark)
|
||||||
|
brick.setLight(BrickLight.OrangePulse);
|
||||||
|
pauseUntil(() => (down = brick.buttonDown.wasPressed()) || brick.buttonUp.wasPressed())
|
||||||
|
brick.setLight(BrickLight.Off)
|
||||||
|
music.playSoundEffect(sounds.mechanicalAirRelease)
|
||||||
|
brick.showImage(images.informationAccept)
|
||||||
|
if (down) {
|
||||||
|
brick.showImage(images.informationForward)
|
||||||
|
motors.largeC.setSpeed(65, 0.85, MoveUnit.Rotations);
|
||||||
|
} else {
|
||||||
|
brick.showImage(images.informationBackward)
|
||||||
|
motors.largeC.setSpeed(-65, 0.85, MoveUnit.Rotations);
|
||||||
|
}
|
||||||
|
motors.largeB.setSpeed(20, 275, MoveUnit.Degrees)
|
||||||
|
motors.mediumA.setSpeed(30, 1, MoveUnit.Seconds)
|
||||||
|
motors.largeB.setSpeed(-55)
|
||||||
|
pauseUntil(() => sensors.color3.light(LightIntensityMode.Reflected) > 25);
|
||||||
|
motors.largeB.stop();
|
||||||
|
if (down) {
|
||||||
|
motors.largeC.setSpeed(-65, 0.86, MoveUnit.Rotations);
|
||||||
|
} else {
|
||||||
|
motors.largeC.setSpeed(65, 0.85, MoveUnit.Rotations);
|
||||||
|
}
|
||||||
|
motors.largeB.setSpeed(20, 275, MoveUnit.Degrees);
|
||||||
|
motors.mediumA.setSpeed(-30, 90, MoveUnit.Degrees);
|
||||||
|
motors.largeB.setSpeed(-55)
|
||||||
|
pauseUntil(() => sensors.color3.light(LightIntensityMode.Reflected) > 25);
|
||||||
|
motors.largeB.stop()
|
||||||
|
})
|
||||||
|
```
|
51
docs/examples/crane-labview.md
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
# Crane LabView
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
function INI() {
|
||||||
|
motors.largeB.setBrake(true)
|
||||||
|
motors.largeC.setBrake(true)
|
||||||
|
motors.mediumA.setBrake(true)
|
||||||
|
motors.largeB.setSpeed(-50)
|
||||||
|
pauseUntil(() => sensors.color3.light(LightIntensityMode.Reflected) > 25);
|
||||||
|
motors.largeB.stop();
|
||||||
|
motors.mediumA.setSpeed(30, 1, MoveUnit.Seconds);
|
||||||
|
motors.mediumA.setSpeed(-50, 90, MoveUnit.Degrees);
|
||||||
|
motors.largeC.setSpeed(50)
|
||||||
|
sensors.touch1.pauseUntil(ButtonEvent.Pressed);
|
||||||
|
motors.largeC.setSpeed(-50, 0.86, MoveUnit.Rotations);
|
||||||
|
}
|
||||||
|
|
||||||
|
INI()
|
||||||
|
|
||||||
|
let down = false;
|
||||||
|
loops.forever(function () {
|
||||||
|
brick.showImage(images.informationQuestionMark)
|
||||||
|
brick.setLight(BrickLight.OrangePulse);
|
||||||
|
pauseUntil(() => (down = brick.buttonDown.wasPressed()) || brick.buttonUp.wasPressed())
|
||||||
|
brick.setLight(BrickLight.Off)
|
||||||
|
music.playSoundEffect(sounds.mechanicalAirRelease)
|
||||||
|
brick.showImage(images.informationAccept)
|
||||||
|
if (down) {
|
||||||
|
brick.showImage(images.informationForward)
|
||||||
|
motors.largeC.setSpeed(65, 0.85, MoveUnit.Rotations);
|
||||||
|
} else {
|
||||||
|
brick.showImage(images.informationBackward)
|
||||||
|
motors.largeC.setSpeed(-65, 0.85, MoveUnit.Rotations);
|
||||||
|
}
|
||||||
|
motors.largeB.setSpeed(20, 275, MoveUnit.Degrees)
|
||||||
|
motors.mediumA.setSpeed(30, 1, MoveUnit.Seconds)
|
||||||
|
motors.largeB.setSpeed(-55)
|
||||||
|
pauseUntil(() => sensors.color3.light(LightIntensityMode.Reflected) > 25);
|
||||||
|
motors.largeB.stop();
|
||||||
|
if (down) {
|
||||||
|
motors.largeC.setSpeed(-65, 0.86, MoveUnit.Rotations);
|
||||||
|
} else {
|
||||||
|
motors.largeC.setSpeed(65, 0.85, MoveUnit.Rotations);
|
||||||
|
}
|
||||||
|
motors.largeB.setSpeed(20, 275, MoveUnit.Degrees);
|
||||||
|
motors.mediumA.setSpeed(-30, 90, MoveUnit.Degrees);
|
||||||
|
motors.largeB.setSpeed(-55)
|
||||||
|
pauseUntil(() => sensors.color3.light(LightIntensityMode.Reflected) > 25);
|
||||||
|
motors.largeB.stop()
|
||||||
|
})
|
||||||
|
```
|
215
docs/examples/gyro-boy-labview.md
Normal file
@ -0,0 +1,215 @@
|
|||||||
|
# Gyro Boy LabView
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
let mSum = 0;
|
||||||
|
let mPos = 0;
|
||||||
|
let mSpd = 0;
|
||||||
|
let mD = 0;
|
||||||
|
let mDP1 = 0;
|
||||||
|
let mDP2 = 0;
|
||||||
|
let mDP3 = 0;
|
||||||
|
let Crdv = 0;
|
||||||
|
let cLo = 0;
|
||||||
|
let gAng = 0;
|
||||||
|
let ok = false;
|
||||||
|
let pwr = 0;
|
||||||
|
let Cstr = 0;
|
||||||
|
let Cdrv = 0;
|
||||||
|
let gMn = 0;
|
||||||
|
let gMx = 0;
|
||||||
|
let gSum = 0;
|
||||||
|
let gyro = 0;
|
||||||
|
let gOS = 0;
|
||||||
|
let gSpd = 0;
|
||||||
|
let tInt = 0.014;
|
||||||
|
let lpwr = 0
|
||||||
|
let rpwr = 0
|
||||||
|
let tStart = 0
|
||||||
|
let st = 0
|
||||||
|
let oldDr = 0
|
||||||
|
|
||||||
|
function RST() {
|
||||||
|
motors.largeA.reset()
|
||||||
|
motors.largeD.reset()
|
||||||
|
motors.largeA.setRegulated(false)
|
||||||
|
motors.largeD.setRegulated(false)
|
||||||
|
sensors.gyro2.reset()
|
||||||
|
sensors.gyro2.rate()
|
||||||
|
control.timer2.reset()
|
||||||
|
loops.pause(5000)
|
||||||
|
mSum = 0;
|
||||||
|
mPos = 0;
|
||||||
|
mD = 0;
|
||||||
|
mDP1 = 0;
|
||||||
|
mDP2 = 0;
|
||||||
|
mDP3 = 0;
|
||||||
|
Crdv = 0;
|
||||||
|
cLo = 0;
|
||||||
|
gAng = 0;
|
||||||
|
ok = false;
|
||||||
|
pwr = 0;
|
||||||
|
st = 0;
|
||||||
|
Cstr = 0;
|
||||||
|
Cdrv = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
function OS() {
|
||||||
|
// OSL
|
||||||
|
do {
|
||||||
|
gMn = 1000;
|
||||||
|
gMx = -100;
|
||||||
|
gSum = 0;
|
||||||
|
// gChk
|
||||||
|
for (let i = 0; i < 200; i++) {
|
||||||
|
gyro = sensors.gyro2.rate()
|
||||||
|
gSum = gyro;
|
||||||
|
gMx = Math.max(gMx, gyro)
|
||||||
|
gMn = Math.min(gMn, gyro)
|
||||||
|
loops.pause(4);
|
||||||
|
}
|
||||||
|
} while (gMx - gMn > 2);
|
||||||
|
gOS = gSum / 200;
|
||||||
|
}
|
||||||
|
|
||||||
|
function GT() {
|
||||||
|
if (cLo == 0) {
|
||||||
|
tInt = 0.014;
|
||||||
|
control.timer1.reset();
|
||||||
|
} else {
|
||||||
|
tInt = control.timer1.seconds() / cLo;
|
||||||
|
}
|
||||||
|
cLo++;
|
||||||
|
}
|
||||||
|
|
||||||
|
function GG() {
|
||||||
|
gyro = sensors.gyro2.rate();
|
||||||
|
gOS = 0.0005 * gyro + (1 - 0.0005) * gOS
|
||||||
|
gSpd = gyro - gOS;
|
||||||
|
gAng = gAng + tInt * gSpd;
|
||||||
|
}
|
||||||
|
|
||||||
|
function GM() {
|
||||||
|
let temp = mSum
|
||||||
|
mSum = motors.largeD.angle() + motors.largeA.angle();
|
||||||
|
mD = mSum - temp;
|
||||||
|
mPos = mPos + mD;
|
||||||
|
mSpd = ((mDP1 + mDP2 + mDP3 + mD) / 4) / tInt;
|
||||||
|
mDP3 = mDP2;
|
||||||
|
mDP2 = mDP1;
|
||||||
|
mDP1 = mD;
|
||||||
|
}
|
||||||
|
|
||||||
|
function EQ() {
|
||||||
|
mPos = mPos - Cdrv * tInt;
|
||||||
|
pwr = (0.8 * gSpd + 15 * gAng) + (0.095 * mSpd + 0.13 * mPos) - 0.01 * Cdrv
|
||||||
|
if (pwr > 100) pwr = 100
|
||||||
|
else if (pwr < -100) pwr = -100
|
||||||
|
}
|
||||||
|
|
||||||
|
function cntrl() {
|
||||||
|
mPos = mPos - tInt * Cdrv
|
||||||
|
lpwr = (pwr + Cstr * 0.1)
|
||||||
|
rpwr = (pwr - Cstr * 0.1)
|
||||||
|
}
|
||||||
|
|
||||||
|
function CHK() {
|
||||||
|
if (Math.abs(pwr) < 100)
|
||||||
|
control.timer2.reset();
|
||||||
|
if (control.timer2.seconds() > 2) {
|
||||||
|
ok = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// M
|
||||||
|
loops.forever(function () {
|
||||||
|
RST();
|
||||||
|
brick.showImage(images.eyesSleeping)
|
||||||
|
OS()
|
||||||
|
gAng = -0.25;
|
||||||
|
music.playSoundEffect(sounds.movementsSpeedUp)
|
||||||
|
brick.showImage(images.eyesAwake)
|
||||||
|
st = 1;
|
||||||
|
// BALANCE
|
||||||
|
while (!ok) {
|
||||||
|
GT();
|
||||||
|
let t1 = control.timer1.millis()
|
||||||
|
GG();
|
||||||
|
GM();
|
||||||
|
EQ();
|
||||||
|
cntrl();
|
||||||
|
motors.largeA.setSpeed(lpwr)
|
||||||
|
motors.largeD.setSpeed(rpwr)
|
||||||
|
CHK()
|
||||||
|
let t2 = control.timer1.millis();
|
||||||
|
let p = 5 - (t2 - t1);
|
||||||
|
loops.pause(Math.max(1, p))
|
||||||
|
}
|
||||||
|
motors.stopAllMotors()
|
||||||
|
st = 0;
|
||||||
|
brick.setLight(BrickLight.RedPulse);
|
||||||
|
brick.showImage(images.eyesKnockedOut)
|
||||||
|
music.playSoundEffect(sounds.movementsSpeedDown)
|
||||||
|
sensors.touch3.pauseUntil(ButtonEvent.Pressed)
|
||||||
|
brick.setLight(BrickLight.Off);
|
||||||
|
})
|
||||||
|
|
||||||
|
// BHV
|
||||||
|
loops.forever(function () {
|
||||||
|
switch (st) {
|
||||||
|
case 0:
|
||||||
|
Cdrv = 0;
|
||||||
|
Cstr = 0;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
Cdrv = 40;
|
||||||
|
loops.pause(4000);
|
||||||
|
Cdrv = 0;
|
||||||
|
music.playTone(1000, 100);
|
||||||
|
st = 2;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
switch (sensors.color1.color()) {
|
||||||
|
case ColorSensorColor.Red:
|
||||||
|
music.playTone(2000, 100);
|
||||||
|
Cdrv = 0;
|
||||||
|
Cstr = 0;
|
||||||
|
break;
|
||||||
|
case ColorSensorColor.Green:
|
||||||
|
music.playTone(2000, 100);
|
||||||
|
Cdrv = 150;
|
||||||
|
Cstr = 0;
|
||||||
|
break;
|
||||||
|
case ColorSensorColor.Blue:
|
||||||
|
music.playTone(2000, 100);
|
||||||
|
Cstr = 70;
|
||||||
|
break;
|
||||||
|
case ColorSensorColor.Yellow:
|
||||||
|
music.playTone(2000, 100);
|
||||||
|
Cstr = -70;
|
||||||
|
break;
|
||||||
|
case ColorSensorColor.White:
|
||||||
|
music.playTone(2000, 100);
|
||||||
|
Cdrv = -75;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (sensors.ultrasonic4.distance() < 25) {
|
||||||
|
Cstr = 0;
|
||||||
|
oldDr = Cdrv;
|
||||||
|
Cdrv = -10;
|
||||||
|
motors.mediumC.setSpeed(30, 30, MoveUnit.Degrees);
|
||||||
|
motors.mediumC.setSpeed(-30, 60, MoveUnit.Degrees);
|
||||||
|
motors.mediumC.setSpeed(30, 30, MoveUnit.Degrees);
|
||||||
|
if (Math.randomRange(-1, 1) >= 1)
|
||||||
|
Cstr = 70;
|
||||||
|
else
|
||||||
|
Cstr = -70;
|
||||||
|
loops.pause(4000);
|
||||||
|
music.playTone(2000, 100)
|
||||||
|
Cstr = 0;
|
||||||
|
Cdrv = oldDr;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
loops.pause(80);
|
||||||
|
})
|
||||||
|
```
|
@ -3,10 +3,10 @@
|
|||||||
Use a touch sensor to make the brick happy.
|
Use a touch sensor to make the brick happy.
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
sensors.touchSensor1.onEvent(TouchSensorEvent.Pressed, function () {
|
sensors.touch1.onEvent(ButtonEvent.Pressed, function () {
|
||||||
brick.showImage(images.expressionsBigSmile)
|
brick.showImage(images.expressionsBigSmile)
|
||||||
})
|
})
|
||||||
sensors.touchSensor1.onEvent(TouchSensorEvent.Released, function () {
|
sensors.touch1.onEvent(ButtonEvent.Released, function () {
|
||||||
brick.showImage(images.expressionsSick)
|
brick.showImage(images.expressionsSick)
|
||||||
})
|
})
|
||||||
```
|
```
|
50
docs/examples/line-follower-pid.md
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# Gradien follower PID + calibration
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
let lasterror = 0
|
||||||
|
let D = 0
|
||||||
|
let I = 0
|
||||||
|
let P = 0
|
||||||
|
let error = 0
|
||||||
|
let setpoint = 0
|
||||||
|
let max = 0
|
||||||
|
let min = 0
|
||||||
|
let v = 0
|
||||||
|
v = sensors.color3.light(LightIntensityMode.Reflected)
|
||||||
|
min = v
|
||||||
|
max = v
|
||||||
|
setpoint = v
|
||||||
|
while (!(brick.buttonEnter.wasPressed())) {
|
||||||
|
brick.clearScreen()
|
||||||
|
brick.showString("Move robot on terrain", 1)
|
||||||
|
brick.showString("Press ENTER when done", 2)
|
||||||
|
v = sensors.color3.light(LightIntensityMode.Reflected)
|
||||||
|
min = Math.min(min, v)
|
||||||
|
max = Math.max(max, v)
|
||||||
|
setpoint = (max + min) / 2
|
||||||
|
brick.showValue("v", v, 3)
|
||||||
|
brick.showValue("min", min, 4)
|
||||||
|
brick.showValue("max", v, 5)
|
||||||
|
brick.showValue("setpoint", setpoint, 6)
|
||||||
|
loops.pause(100)
|
||||||
|
}
|
||||||
|
loops.forever(function () {
|
||||||
|
brick.clearScreen()
|
||||||
|
v = sensors.color3.light(LightIntensityMode.Reflected)
|
||||||
|
brick.showValue("light", v, 1)
|
||||||
|
error = v - setpoint
|
||||||
|
brick.showValue("error", error, 2)
|
||||||
|
P = error * 5
|
||||||
|
brick.showValue("P", P, 3)
|
||||||
|
I = I + error * 0.01
|
||||||
|
brick.showValue("I", I, 4)
|
||||||
|
D = (error - lasterror) * 0.2
|
||||||
|
brick.showValue("D", D, 5)
|
||||||
|
motors.largeBC.steer(P + (I + D), 100)
|
||||||
|
lasterror = error
|
||||||
|
if (brick.buttonEnter.wasPressed()) {
|
||||||
|
motors.largeBC.setSpeed(0)
|
||||||
|
brick.buttonDown.pauseUntil(ButtonEvent.Bumped)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
40
docs/examples/print-ports.md
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
|
||||||
|
# Print Ports
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
/**
|
||||||
|
* Print the port states on the screen
|
||||||
|
*/
|
||||||
|
//% blockId=brickPrintPorts block="print ports"
|
||||||
|
//% help=brick/print-ports
|
||||||
|
//% weight=1 group="Screen"
|
||||||
|
function printPorts() {
|
||||||
|
const col = 44;
|
||||||
|
clearScreen();
|
||||||
|
|
||||||
|
function scale(x: number) {
|
||||||
|
if (Math.abs(x) > 1000) return Math.round(x / 100) / 10 + "k";
|
||||||
|
return ("" + (x >> 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
// motors
|
||||||
|
const datas = motors.getAllMotorData();
|
||||||
|
for(let i = 0; i < datas.length; ++i) {
|
||||||
|
const data = datas[i];
|
||||||
|
if (!data.actualSpeed && !data.count) continue;
|
||||||
|
const x = i * col;
|
||||||
|
print(`${scale(data.actualSpeed)}%`, x, brick.LINE_HEIGHT)
|
||||||
|
print(`${scale(data.count)}>`, x, 2 * brick.LINE_HEIGHT)
|
||||||
|
print(`${scale(data.tachoCount)}|`, x, 3 * brick.LINE_HEIGHT)
|
||||||
|
}
|
||||||
|
|
||||||
|
// sensors
|
||||||
|
const sis = sensors.internal.getActiveSensors();
|
||||||
|
for(let i =0; i < sis.length; ++i) {
|
||||||
|
const si = sis[i];
|
||||||
|
const x = (si.port() - 1) * col;
|
||||||
|
const v = si._query();
|
||||||
|
print(`${scale(v)}`, x, 9 * brick.LINE_HEIGHT)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
27
docs/lessons.md
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
# Lessons
|
||||||
|
|
||||||
|
Learning activities for LEGO Mindstorms with MakeCode.
|
||||||
|
|
||||||
|
## Motors and motion
|
||||||
|
|
||||||
|
```codecard
|
||||||
|
[{
|
||||||
|
"name": "Make it Move",
|
||||||
|
"imageUrl":"/static/lessons/make-it-move.jpg",
|
||||||
|
"url": "/lessons/make-it-move",
|
||||||
|
"cardType": "project",
|
||||||
|
"description": "Make a robot that moves itself without wheels."
|
||||||
|
}, {
|
||||||
|
"name": "Make it Move TUTORIAL",
|
||||||
|
"imageUrl":"/static/lessons/make-it-move.jpg",
|
||||||
|
"url": "/lessons/make-it-move-tutorial",
|
||||||
|
"cardType": "tutorial",
|
||||||
|
"description": "Make a robot that moves itself without wheels."
|
||||||
|
}, {
|
||||||
|
"name": "Line Detection",
|
||||||
|
"imageUrl":"/static/lessons/line-detection.jpg",
|
||||||
|
"url": "/lessons/line-detection",
|
||||||
|
"cardType": "project",
|
||||||
|
"description": "Make your robot drive itself by following lines."
|
||||||
|
}]
|
||||||
|
```
|
266
docs/lessons/line-detection.md
Normal file
@ -0,0 +1,266 @@
|
|||||||
|
# Line Detection
|
||||||
|
|
||||||
|
## Objective
|
||||||
|
|
||||||
|
Design ways to improve driving safety by helping to prevent drivers from falling asleep and causing an accident.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Connect
|
||||||
|
|
||||||
|
Make sure that you can answer the following questions:
|
||||||
|
|
||||||
|
* Can autonomous cars react to different traffic light signals?
|
||||||
|
* What can happen if a driver falls asleep while driving?
|
||||||
|
* How can we detect when a driver is falling asleep?
|
||||||
|
|
||||||
|
Think about what you have learned, then document it. Describe the problem in your own words. Creatively record your ideas and findings.
|
||||||
|
|
||||||
|
## Construct
|
||||||
|
|
||||||
|
Start by constructing this model. Read the building instructions [here](https://le-www-live-s.legocdn.com/sc/media/lessons/mindstorms-ev3/building-instructions/ev3-rem-color-sensor-down-driving-base-d30ed30610c3d6647d56e17bc64cf6e2.pdf) first.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Program
|
||||||
|
|
||||||
|
Autonomous cars need to recognize and respond to traffic lights automatically.
|
||||||
|
First, create a program that will make your robot stop at red lights.
|
||||||
|
Make sure your robot is only responding to the color red.
|
||||||
|
Once you have succeeded, program your robot to drive forward again when the light changes from red to green.
|
||||||
|
|
||||||
|
There are two coding tasks for this lesson:
|
||||||
|
|
||||||
|
1. Create a program that will make your robot stop at red lights.
|
||||||
|
2. Create a program that drives the robot forward until the Color Sensor sees red. The robot then stops.
|
||||||
|
|
||||||
|
## Coding task 1 - Stop at red lights
|
||||||
|
|
||||||
|
**Goal:** Create a program that will make your robot stop at red lights.
|
||||||
|
|
||||||
|
### Step 1
|
||||||
|
|
||||||
|
Create a program that drives the robot forward until the Color Sensor sees red. The robot then stops.
|
||||||
|
|
||||||
|
Place a ``||motors:steer large B+C||`` block from ``||motors:Motors||`` under ``||loops:on start||``. Change the speed to 20%.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
motors.largeBC.steer(0, 20)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2
|
||||||
|
|
||||||
|
Place a ``||loops:while||`` loop block under ``||motors:steer large B+C||``.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
motors.largeBC.steer(0, 20)
|
||||||
|
while (true) {
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3
|
||||||
|
|
||||||
|
Place a ``||sensors:pause for color||`` from ``||sensors:Sensors||`` inside the ``||loops:while||`` loop block. Change the color to red.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
motors.largeBC.steer(0, 20)
|
||||||
|
while (true) {
|
||||||
|
sensors.color3.pauseForColor(ColorSensorColor.Red)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4
|
||||||
|
|
||||||
|
Place a ``||motors:stop all motors||`` block under the ``||sensors:pause for color||`` block.
|
||||||
|
|
||||||
|
Study the program...what do you think the program will do?
|
||||||
|
|
||||||
|
**Hint:** The motors will run until the Color Sensor senses the color red, then all motors will stop. The motors will run until the sensor reading in the while block is true.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
motors.largeBC.steer(0, 20)
|
||||||
|
while (true) {
|
||||||
|
sensors.color3.pauseForColor(ColorSensorColor.Red)
|
||||||
|
motors.stopAllMotors()
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 5
|
||||||
|
|
||||||
|
Click `|Download|` and follow the instructions to get your code onto your EV3 Brick. Press the **center** button on the EV3 Brick to run the program.
|
||||||
|
|
||||||
|
## Coding task 2 - Detect light changes
|
||||||
|
|
||||||
|
**Goal:** Program your robot to drive forward again when the light changes from red to green.
|
||||||
|
|
||||||
|
### Step 1
|
||||||
|
|
||||||
|
Place a ``||loops:while||`` loop block under ``||loops:on start||``.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
while (true) {
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2
|
||||||
|
|
||||||
|
Place a ``||motors:steer large B+C||`` block from ``||motors:Motors||`` inside the ``||loops:while||`` loop block. Change the speed to 20%.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
while (true) {
|
||||||
|
motors.largeBC.steer(0, 20)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4
|
||||||
|
|
||||||
|
Place a ``||loops:while||`` loop block under the ``||motors:steer large B+C||`` block.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
while (true) {
|
||||||
|
motors.largeBC.steer(0, 20)
|
||||||
|
while (true) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 5
|
||||||
|
|
||||||
|
Place a ``||sensors:pause for color||`` block from ``||sensors:Sensors||`` inside the ``||loops:while||`` loop block. Change the color to red.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
while (true) {
|
||||||
|
motors.largeBC.steer(0, 20)
|
||||||
|
while (true) {
|
||||||
|
sensors.color3.pauseForColor(ColorSensorColor.Red)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 6
|
||||||
|
|
||||||
|
Place a ``||motors:stop all motors||`` block under the ``||sensors:pause for color||`` block.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
while (true) {
|
||||||
|
motors.largeBC.steer(0, 20)
|
||||||
|
while (true) {
|
||||||
|
sensors.color3.pauseForColor(ColorSensorColor.Red)
|
||||||
|
motors.stopAllMotors()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 7
|
||||||
|
|
||||||
|
Place a ``||loops:while||`` loop block under the second ``||loops:while||`` loop block.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
while (true) {
|
||||||
|
motors.largeBC.steer(0, 20)
|
||||||
|
while (true) {
|
||||||
|
sensors.color3.pauseForColor(ColorSensorColor.Red)
|
||||||
|
motors.stopAllMotors()
|
||||||
|
}
|
||||||
|
while (true) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 8
|
||||||
|
|
||||||
|
Place a ``||sensors:pause for color||`` block inside the new ``||loops:while||`` loop block. Change the color to red.
|
||||||
|
|
||||||
|
What do you think the program will do?
|
||||||
|
|
||||||
|
**Hint:** The motors will run until the Color Sensor detects the color red, then it will stop all motors. The motors will also run and not stop when the color sensor detects the color green.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
while (true) {
|
||||||
|
motors.largeBC.steer(0, 20)
|
||||||
|
while (true) {
|
||||||
|
sensors.color3.pauseForColor(ColorSensorColor.Red)
|
||||||
|
motors.stopAllMotors()
|
||||||
|
}
|
||||||
|
while (true) {
|
||||||
|
sensors.color3.pauseForColor(ColorSensorColor.Red)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 9
|
||||||
|
|
||||||
|
Click `|Download|` and follow the instructions to get your code onto your EV3 Brick. Press the **center** button on the EV3 Brick to run the program.
|
||||||
|
|
||||||
|
## Contemplate
|
||||||
|
|
||||||
|
To simulate what could happen if a driver falls asleep while driving, your robot could sound an alarm signal when it crosses the line. This feature is often available in new cars.
|
||||||
|
|
||||||
|
Program your robot to perform this function.
|
||||||
|
|
||||||
|
Think about what you have learned, then document it. Describe your pseudocode for this task. Creatively record your ideas, and findings.
|
||||||
|
|
||||||
|
### Programming hint
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
motors.largeBC.steer(0, 20)
|
||||||
|
while (true) {
|
||||||
|
sensors.color3.pauseForColor(ColorSensorColor.Yellow)
|
||||||
|
music.playSoundEffect(sounds.systemGeneralAlert)
|
||||||
|
}
|
||||||
|
while (true) {
|
||||||
|
while (true) { sensors.color3.pauseForLight(LightIntensityMode.Reflected, LightCondition.Bright)
|
||||||
|
motors.largeB.setSpeed(10)
|
||||||
|
motors.largeC.setSpeed(-10)
|
||||||
|
}
|
||||||
|
while (true) {
|
||||||
|
sensors.color3.pauseForLight(LightIntensityMode.Reflected, LightCondition.Bright)
|
||||||
|
motors.largeA.setSpeed(-10)
|
||||||
|
motors.largeA.setSpeed(10)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Continue
|
||||||
|
|
||||||
|
Program your robot to drive on “autopilot” along a given route. You will need to create a program that recognizes and responds to a dark line (or white line). You will create a line-following program and your robot will need to travel along the line without losing contact with it.
|
||||||
|
|
||||||
|
You will need to constantly debug your program in order to make your robot travel as smoothly as possible along the line.
|
||||||
|
|
||||||
|
### Programming hint
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
while (true) {
|
||||||
|
while (true) { sensors.color3.pauseForLight(LightIntensityMode.Reflected, LightCondition.Bright)
|
||||||
|
motors.largeB.setSpeed(10)
|
||||||
|
motors.largeC.setSpeed(-10)
|
||||||
|
}
|
||||||
|
while (true) {
|
||||||
|
sensors.color3.pauseForLight(LightIntensityMode.Reflected, LightCondition.Bright)
|
||||||
|
motors.largeB.setSpeed(-10)
|
||||||
|
motors.largeC.setSpeed(10)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Share
|
||||||
|
|
||||||
|
Consider the following questions:
|
||||||
|
|
||||||
|
1. What challenged you?
|
||||||
|
2. Where there any surprises?
|
||||||
|
3. How could you improve your program?
|
||||||
|
4. Could your program have been more streamlined?
|
||||||
|
5. Have you used too many blocks?
|
||||||
|
6. Is there a more efficient way of building your program?
|
||||||
|
7. How could your program be used in real-world scenarios?
|
||||||
|
|
||||||
|
Think about what you have learned, then document it. Creatively record and present your ideas, creations, and findings.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
72
docs/lessons/make-it-move-tutorial.md
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
# Make It Move Without Wheels
|
||||||
|
|
||||||
|
## Objective @unplugged
|
||||||
|
|
||||||
|
Design, build and program a robot that can move itself:
|
||||||
|
|
||||||
|
Your robot will:
|
||||||
|
|
||||||
|
* Go a distance of at least 30cm
|
||||||
|
* Use at least one motor
|
||||||
|
* Use NO wheels for locomotion
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## Construct @unplugged
|
||||||
|
|
||||||
|
Build a Walker Bot!
|
||||||
|
|
||||||
|
The Walker Bot is one example of many possible solutions for making a robot move without wheels.
|
||||||
|
|
||||||
|
The Walker Bot combines an EV3 Frame and two legs that are mirror-images to create left and right legs.
|
||||||
|
|
||||||
|
The legs in the Walker Bot are designed to show how to change the rotary motion of a motor to reciprocating motion.
|
||||||
|
|
||||||
|
Start by reading [these](https://le-www-live-s.legocdn.com/sc/media/lessons/mindstorms-ev3/ev3-dep/building%20instructions/walker-bot-bi-180fc24f9298e1dd6201099627d43903.pdf) instructions first.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## Program 1 @fullscreen
|
||||||
|
|
||||||
|
In nature, creatures use many methods to get around. None of them, however, use wheels to move. Can we copy the method of animal locomotion with our robot? Using motors and legs, make the robot move without using any wheels.
|
||||||
|
|
||||||
|
Place a ``||motors:tank large B+C||`` block from ``||motors:Motors||`` under ``||loops:on start||``.
|
||||||
|
|
||||||
|
Change the speed to `-60%` (for motor B) and `+60%` (for motor C).
|
||||||
|
Change the rotations to `9`.
|
||||||
|
|
||||||
|
The ``||motors:tank large B+C||`` block will run for `9` rotations when the **center** button is pressed on the EV3 brick. The motors are set for the reverse direction because they are mounted upside down in this model.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
motors.largeBC.tank(-60, 60, 9, MoveUnit.Rotations)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Program 2 @fullscreen
|
||||||
|
|
||||||
|
Place a ``||motors:stop all motors||`` block under ``||motors:tank large B+C||``.
|
||||||
|
|
||||||
|
The ``||motors:tank large B+C||`` block will run for `9` rotations when the **center** button is pressed on the EV3 brick then stop.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
motors.largeBC.tank(-60, 60, 9, MoveUnit.Rotations)
|
||||||
|
motors.stopAllMotors()
|
||||||
|
```
|
||||||
|
|
||||||
|
## Program 3 @fullscreen
|
||||||
|
|
||||||
|
Place a ``||brick:show string||`` block under ``||motors:stop all motors||``.
|
||||||
|
Change the `"Hello World"` text to `"30 cm"`.
|
||||||
|
|
||||||
|
The ``||motors:tank large B+C||`` will run for `9` rotations when the **center** button is pressed on the EV3 brick then stop and display "30 cm" on the EV3 Brick’s screen.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
motors.largeBC.tank(-60, 60, 9, MoveUnit.Rotations)
|
||||||
|
motors.stopAllMotors()
|
||||||
|
brick.showString("30 cm", 1)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Download @fullscreen
|
||||||
|
|
||||||
|
Click `|Download|` and follow the instructions to get your code onto your EV3 Brick. Press the **center** button on the EV3 Brick to run the program.
|
73
docs/lessons/make-it-move.md
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
# Make It Move Without Wheels
|
||||||
|
|
||||||
|
## Objective
|
||||||
|
|
||||||
|
Design, build and program a robot that can move itself:
|
||||||
|
|
||||||
|
Your robot will:
|
||||||
|
|
||||||
|
* Go a distance of at least 30cm
|
||||||
|
* Use at least one motor
|
||||||
|
* Use NO wheels for locomotion
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Construct
|
||||||
|
|
||||||
|
Build a Walker Bot!
|
||||||
|
|
||||||
|
The Walker Bot is one example of many possible solutions for making a robot move without wheels.
|
||||||
|
|
||||||
|
The Walker Bot combines an EV3 Frame and two legs that are mirror-images to create left and right legs.
|
||||||
|
|
||||||
|
The legs in the Walker Bot are designed to show how to change the rotary motion of a motor to reciprocating motion.
|
||||||
|
|
||||||
|
Start by reading [these](https://le-www-live-s.legocdn.com/sc/media/lessons/mindstorms-ev3/ev3-dep/building%20instructions/walker-bot-bi-180fc24f9298e1dd6201099627d43903.pdf) instructions first.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
|
||||||
|
## Program
|
||||||
|
|
||||||
|
In nature, creatures use many methods to get around. None of them, however, use wheels to move. Can we copy the method of animal locomotion with our robot? Using motors and legs, make the robot move without using any wheels.
|
||||||
|
|
||||||
|
### Step 1
|
||||||
|
|
||||||
|
Place a ``||motors:tank large B+C||`` block from ``||motors:Motors||`` under ``||loops:on start||``.
|
||||||
|
|
||||||
|
Change the speed to `-60%` (for motor B) and `+60%` (for motor C).
|
||||||
|
Change the rotations to `9`.
|
||||||
|
|
||||||
|
The ``||motors:tank large B+C||`` block will run for `9` rotations when the **center** button is pressed on the EV3 brick. The motors are set for the reverse direction because they are mounted upside down in this model.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
motors.largeBC.tank(-60, 60, 9, MoveUnit.Rotations)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 2
|
||||||
|
|
||||||
|
Place a ``||motors:stop all motors||`` block under ``||motors:tank large B+C||``.
|
||||||
|
|
||||||
|
The ``||motors:tank large B+C||`` block will run for `9` rotations when the **center** button is pressed on the EV3 brick then stop.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
motors.largeBC.tank(-60, 60, 9, MoveUnit.Rotations)
|
||||||
|
motors.largeBC.stop()
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 3
|
||||||
|
|
||||||
|
Place a ``||brick:show string||`` block under ``||motors:stop all motors||``.
|
||||||
|
Change the `"Hello World"` text to `"30 cm"`.
|
||||||
|
|
||||||
|
The ``||motors:tank large B+C||`` will run for `9` rotations when the **center** button is pressed on the EV3 brick then stop and display "30 cm" on the EV3 Brick’s screen.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
motors.largeBC.tank(-60, 60, 9, MoveUnit.Rotations)
|
||||||
|
motors.largeBC.stop()
|
||||||
|
brick.showString("30 cm", 1)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Step 4
|
||||||
|
|
||||||
|
Click `|Download|` and follow the instructions to get your code onto your EV3 Brick. Press the **center** button on the EV3 Brick to run the program.
|
@ -2,10 +2,8 @@
|
|||||||
|
|
||||||
This program will activate an alarm when an object moves in front of the Ultrasonic Sensor.
|
This program will activate an alarm when an object moves in front of the Ultrasonic Sensor.
|
||||||
|
|
||||||
TODO support for event when value changes
|
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
input.ultrasonic4.onObjectNear(function () {
|
sensors.ultrasonic4.onEvent(UltrasonicSensorEvent.ObjectNear, function () {
|
||||||
music.playSoundUntilDone(music.sounds(Sounds.PowerUp))
|
music.playSoundEffectUntilDone(sounds.informationActivate)
|
||||||
})
|
})
|
||||||
```
|
```
|
@ -4,14 +4,12 @@ Use this program with the Programmable Brick and Large Motor.
|
|||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
loops.forever(function () {
|
loops.forever(function () {
|
||||||
output.largeMotorA.setPower(30)
|
motors.largeA.setSpeed(30)
|
||||||
output.largeMotorA.on(true)
|
|
||||||
loops.pause(100)
|
loops.pause(100)
|
||||||
output.largeMotorA.on(false)
|
motors.largeA.stop()
|
||||||
music.playSoundUntilDone(music.sounds(Sounds.PowerUp))
|
music.playSoundEffectUntilDone(sounds.animalsCatPurr)
|
||||||
output.largeMotorA.setPower(-30)
|
motors.largeA.setSpeed(-30)
|
||||||
output.largeMotorA.on(true)
|
|
||||||
loops.pause(100)
|
loops.pause(100)
|
||||||
output.largeMotorA.on(false)
|
motors.largeA.stop()
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
This program will activate an alarm when an object is lifted from the Touch Sensor.
|
This program will activate an alarm when an object is lifted from the Touch Sensor.
|
||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
input.touchSensor1.onEvent(TouchSensorEvent.Released, function () {
|
sensors.touch1.onEvent(ButtonEvent.Released, function () {
|
||||||
music.playSoundUntilDone(music.sounds(Sounds.PowerUp))
|
music.playSoundEffectUntilDone(sounds.informationActivate);
|
||||||
})
|
})
|
||||||
```
|
```
|
@ -4,9 +4,9 @@ This example program combined with the small model will make a beat and rhythm o
|
|||||||
|
|
||||||
```blocks
|
```blocks
|
||||||
loops.forever(function () {
|
loops.forever(function () {
|
||||||
output.motorA.on(50)
|
motors.largeA.setSpeed(50)
|
||||||
loops.pause(200)
|
loops.pause(200)
|
||||||
output.motorA.on(100)
|
motors.largeA.setSpeed(100)
|
||||||
loops.pause(200)
|
loops.pause(200)
|
||||||
})
|
})
|
||||||
```
|
```
|
@ -3,13 +3,13 @@
|
|||||||
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.
|
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
|
```blocks
|
||||||
input.color3.onColorDetected(ColorSensorColor.Blue, function () {
|
sensors.color3.onColorDetected(ColorSensorColor.Blue, function () {
|
||||||
music.playTone(Note.G4, music.beat(BeatFraction.Half))
|
music.playTone(Note.G4, music.beat(BeatFraction.Half))
|
||||||
})
|
})
|
||||||
input.color3.onColorDetected(ColorSensorColor.Red, function () {
|
sensors.color3.onColorDetected(ColorSensorColor.Red, function () {
|
||||||
music.playTone(Note.C5, music.beat(BeatFraction.Half))
|
music.playTone(Note.C5, music.beat(BeatFraction.Half))
|
||||||
})
|
})
|
||||||
input.color3.onColorDetected(ColorSensorColor.Green, function () {
|
sensors.color3.onColorDetected(ColorSensorColor.Green, function () {
|
||||||
music.playTone(Note.D5, music.beat(BeatFraction.Half))
|
music.playTone(Note.D5, music.beat(BeatFraction.Half))
|
||||||
})
|
})
|
||||||
```
|
```
|
@ -1,8 +1,11 @@
|
|||||||
# Reference
|
# Reference
|
||||||
|
|
||||||
|
```namespaces
|
||||||
|
brick.showMood(moods.sleeping);
|
||||||
|
```
|
||||||
|
|
||||||
## See Also
|
## See Also
|
||||||
|
|
||||||
|
[brick](/reference/brick),
|
||||||
[touch sensor](/reference/sensors/touch-sensor),
|
[touch sensor](/reference/sensors/touch-sensor),
|
||||||
[color sensor](/reference/sensors/color-sensor)
|
[color sensor](/reference/sensors/color-sensor)
|
30
docs/reference/brick.md
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
# Brick
|
||||||
|
|
||||||
|
## Screen
|
||||||
|
|
||||||
|
```cards
|
||||||
|
brick.showMood(moods.sleeping);
|
||||||
|
brick.showImage(images.expressionsBigSmile);
|
||||||
|
brick.showString("Hello world!", 1);
|
||||||
|
brick.showNumber(0, 1);
|
||||||
|
brick.showValue("item", 0, 1);
|
||||||
|
brick.clearScreen();
|
||||||
|
```
|
||||||
|
|
||||||
|
## Buttons
|
||||||
|
|
||||||
|
```cards
|
||||||
|
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||||
|
|
||||||
|
});
|
||||||
|
brick.buttonEnter.pauseUntil(ButtonEvent.Bumped);
|
||||||
|
brick.buttonEnter.isPressed()
|
||||||
|
brick.buttonEnter.wasPressed()
|
||||||
|
brick.setLight(BrickLight.Red);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Other
|
||||||
|
|
||||||
|
```cards
|
||||||
|
brick.batteryLevel()
|
||||||
|
```
|
33
docs/reference/brick/battery-level.md
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# battery Level
|
||||||
|
|
||||||
|
Return the current battery level.
|
||||||
|
|
||||||
|
```sig
|
||||||
|
brick.batteryLevel();
|
||||||
|
```
|
||||||
|
|
||||||
|
## Returns
|
||||||
|
|
||||||
|
* a [number](/types/number) which is the current charge level of the brick's battery. This is a percentage of total charge left in the battery.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Show the battery level percentage on the screen. Also, show a green light if the battery level is above 15%. If the battery level is below 15% but above 5%, show a orange light. But, if the battery level is below 5%, show a pulsing red light.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
let battery = 0;
|
||||||
|
loops.forever(function() {
|
||||||
|
brick.showString("Battery level:", 1)
|
||||||
|
brick.showNumber(battery, 2)
|
||||||
|
battery = brick.batteryLevel();
|
||||||
|
if (battery > 15)
|
||||||
|
{
|
||||||
|
brick.setLight(BrickLight.Green);
|
||||||
|
} else if (battery > 5) {
|
||||||
|
brick.setLight(BrickLight.Orange);
|
||||||
|
} else {
|
||||||
|
brick.setLight(BrickLight.RedPulse)
|
||||||
|
}
|
||||||
|
loops.pause(30000)
|
||||||
|
})
|
||||||
|
```
|
53
docs/reference/brick/button/is-pressed.md
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
# is Pressed
|
||||||
|
|
||||||
|
Check if a button is being pressed or not.
|
||||||
|
|
||||||
|
```sig
|
||||||
|
brick.buttonEnter.isPressed()
|
||||||
|
```
|
||||||
|
|
||||||
|
## ~hint
|
||||||
|
|
||||||
|
**Touch sensors**
|
||||||
|
|
||||||
|
Your @boardname@ has touch sensors that work like buttons. Instead of saying `enter` or `left` as the source button, use a touch sensor block with a sensor name like `touch 1`.
|
||||||
|
|
||||||
|
```block
|
||||||
|
if (sensors.touch1.isPressed()) {
|
||||||
|
console.log("Hey, I feel pressed.");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Read about [touch sensors](/reference/sensors/touch-sensor) and using them as touch buttons.
|
||||||
|
|
||||||
|
## ~
|
||||||
|
|
||||||
|
## Returns
|
||||||
|
|
||||||
|
* a [boolean](types/boolean): `true` if the button is pressed, `false` if the button is not pressed
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Set the brick light to green when the `down` is pressed. When the button is not pressed, the brick light is red.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
let isRed = false;
|
||||||
|
loops.forever(function() {
|
||||||
|
if (brick.buttonLeft.isPressed()) {
|
||||||
|
brick.setLight(BrickLight.Green);
|
||||||
|
isRed = false;
|
||||||
|
} else {
|
||||||
|
if (!isRed) {
|
||||||
|
brick.setLight(BrickLight.Red);
|
||||||
|
isRed = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
## See also
|
||||||
|
|
||||||
|
[was pressed](/reference/brick/button/was-pressed),
|
||||||
|
[on event](/reference/brick/button/on-event)
|
||||||
|
|
||||||
|
[Touch sensors](/reference/sensors/touch-sensor)
|
57
docs/reference/brick/button/on-event.md
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
# on Event
|
||||||
|
|
||||||
|
Run some code when a button is clicked, pressed down, or released.
|
||||||
|
|
||||||
|
```sig
|
||||||
|
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||||
|
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## ~hint
|
||||||
|
|
||||||
|
**Touch sensors**
|
||||||
|
|
||||||
|
Your @boardname@ has touch sensors that work like buttons. Instead of saying `enter` or `left` as the source button, use a touch sensor block with a sensor name like `touch 1`.
|
||||||
|
|
||||||
|
```block
|
||||||
|
sensors.touch1.onEvent(ButtonEvent.Pressed, function () {
|
||||||
|
brick.setLight(BrickLight.Orange);
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
Read about [touch sensors](/reference/sensors/touch-sensor) and using them as touch buttons.
|
||||||
|
|
||||||
|
## ~
|
||||||
|
|
||||||
|
## Parameters
|
||||||
|
|
||||||
|
* **ev**: the button action to run some code for. The button actions (events) are:
|
||||||
|
> * ``click``: button was clicked (pressed and released)
|
||||||
|
> * ``up``: button is released from just being pressed
|
||||||
|
> * ``down``: button is just pressed down
|
||||||
|
* **body**: the code you want to run when something happens with a button
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Check for event on the ENTER button. Put a message on the screen when the button is pressed, clicked, or released.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
brick.showString("ENTER is: UP", 1);
|
||||||
|
brick.buttonEnter.onEvent(ButtonEvent.Released, function () {
|
||||||
|
brick.showString("ENTER is: UP ", 1);
|
||||||
|
});
|
||||||
|
brick.buttonEnter.onEvent(ButtonEvent.Pressed, function () {
|
||||||
|
brick.showString("ENTER is: DOWN ", 1);
|
||||||
|
});
|
||||||
|
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||||
|
brick.showString("ENTER was: CLICKED", 1);
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
### See also
|
||||||
|
|
||||||
|
[is pressed](/reference/brick/button/is-pressed),
|
||||||
|
[was pressed](/reference/brick/button/was-pressed),
|
||||||
|
|
||||||
|
[Touch sensor](/reference/sensors/touch-sensor)
|
37
docs/reference/brick/button/pause-until.md
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# pause Until
|
||||||
|
|
||||||
|
Causes your program to wait until an event at a button happens.
|
||||||
|
|
||||||
|
```sig
|
||||||
|
brick.buttonEnter.pauseUntil(ButtonEvent.Bumped);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Parameters
|
||||||
|
|
||||||
|
* **ev**: the button action to wait for. The button actions (events) are:
|
||||||
|
> * ``click``: button was clicked (pressed and released)
|
||||||
|
> * ``up``: button is released from just being pressed
|
||||||
|
> * ``down``: button is just pressed down
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Wait for the `up` button to go up before continuing with displaying a message on the screen.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
let waitTime = 0;
|
||||||
|
brick.showString("We're going to wait", 1);
|
||||||
|
brick.showString("for you to press and", 2);
|
||||||
|
brick.showString("release the UP button", 3);
|
||||||
|
waitTime = control.millis();
|
||||||
|
brick.buttonUp.pauseUntil(ButtonEvent.Bumped);
|
||||||
|
brick.clearScreen();
|
||||||
|
if (control.millis() - waitTime > 5000) {
|
||||||
|
brick.showString("Ok, that took awhile!", 1)
|
||||||
|
} else {
|
||||||
|
brick.showString("Ah, you let go!", 1)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## See also
|
||||||
|
|
||||||
|
[on event](/reference/brick/button/on-event)
|
50
docs/reference/brick/button/was-pressed.md
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# was Pressed
|
||||||
|
|
||||||
|
Check if a button was pressed earlier.
|
||||||
|
|
||||||
|
```sig
|
||||||
|
brick.buttonEnter.wasPressed()
|
||||||
|
```
|
||||||
|
|
||||||
|
The fact that a button was pressed earlier is remembered. Once **was pressed** is used, this fact is forgotten and the result is `false` the next time you check with **was pressed** button _state_ is reset). But, if you press the button again before you check with **was pressed**, it will tell you `true`.
|
||||||
|
|
||||||
|
## ~hint
|
||||||
|
|
||||||
|
**Touch sensors**
|
||||||
|
|
||||||
|
Your @boardname@ has touch sensors that work like buttons. Instead of saying `enter` or `left` as the source button, use a touch sensor block with a sensor name like `touch 1`.
|
||||||
|
|
||||||
|
```block
|
||||||
|
if (sensors.touch1.wasPressed()) {
|
||||||
|
console.log("Hey, I was pressed.");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Read about [touch sensors](/reference/sensors/touch-sensor) and using them as touch buttons.
|
||||||
|
|
||||||
|
## ~
|
||||||
|
|
||||||
|
## Returns
|
||||||
|
|
||||||
|
* a [boolean](types/boolean): `true` if the button was pressed before, `false` if the button was not pressed before
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Set the brick light to green if the `right` button was pressed before the `left` button. If not, the brick light is turned off when the `left` button is pressed.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
brick.buttonLeft.onEvent(ButtonEvent.Bumped, function() {
|
||||||
|
if (brick.buttonRight.wasPressed()) {
|
||||||
|
brick.setLight(BrickLight.Green)
|
||||||
|
} else {
|
||||||
|
brick.setLight(BrickLight.Off)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
## See also
|
||||||
|
|
||||||
|
[is pressed](/reference/brick/button/is-pressed),
|
||||||
|
[on event](/reference/brick/button/on-event)
|
||||||
|
|
||||||
|
[Touch sensors](/reference/sensors/touch-sensor)
|
22
docs/reference/brick/clear-screen.md
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# clear Screen
|
||||||
|
|
||||||
|
Clear any text or numbers displayed on the screen. The screen will be blank.
|
||||||
|
|
||||||
|
```sig
|
||||||
|
brick.clearScreen();
|
||||||
|
```
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Clear the screen after displaying the message.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
brick.showString("This message will", 1);
|
||||||
|
brick.showString("self-destruct in:", 2);
|
||||||
|
brick.showString("seconds", 5);
|
||||||
|
for (let i = 0; i < 10; i++) {
|
||||||
|
brick.showNumber(10 - i, 4);
|
||||||
|
loops.pause(1000);
|
||||||
|
}
|
||||||
|
brick.clearScreen();
|
||||||
|
```
|
37
docs/reference/brick/set-light.md
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
# set Light
|
||||||
|
|
||||||
|
Set the light on the brick to a solid or flashing color.
|
||||||
|
|
||||||
|
```sig
|
||||||
|
brick.setLight(BrickLight.Red);
|
||||||
|
```
|
||||||
|
## Parameters
|
||||||
|
|
||||||
|
* **pattern**: the color or color pattern for the brick light to show. The brick light can have these color patterns:
|
||||||
|
>* `off`: brick light is off
|
||||||
|
>* `green`: solid green
|
||||||
|
>* `red`: solid red
|
||||||
|
>* `orange`: solid orange
|
||||||
|
>* `green flash`: flashing green
|
||||||
|
>* `red flash`: flashing red
|
||||||
|
>* `orange flash`: flashing orange
|
||||||
|
>* `green pulse`: pulsing green
|
||||||
|
>* `red pulse`: pulsing red
|
||||||
|
>* `orange pulse`: pulsing orange
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Repeatedly show a different color pattern for the brick light.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
loops.forever(function () {
|
||||||
|
brick.setLight(BrickLight.Orange)
|
||||||
|
loops.pause(1000)
|
||||||
|
brick.setLight(BrickLight.GreenFlash)
|
||||||
|
loops.pause(2000)
|
||||||
|
brick.setLight(BrickLight.RedPulse)
|
||||||
|
loops.pause(2000)
|
||||||
|
brick.setLight(BrickLight.Off)
|
||||||
|
loops.pause(500)
|
||||||
|
})
|
||||||
|
```
|
24
docs/reference/brick/show-image.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# show Image
|
||||||
|
|
||||||
|
Show an image on the brick's display.
|
||||||
|
|
||||||
|
```sig
|
||||||
|
brick.showImage(images.expressionsBigSmile);
|
||||||
|
```
|
||||||
|
You can choose one of several images to show on the display.
|
||||||
|
|
||||||
|
## Parameters
|
||||||
|
|
||||||
|
**image**: A image to show on the brick's display. Use the image picker to choose the image you want to show.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Show a sleeping image on the brick's display.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
brick.showImage(images.expressionsZzz)
|
||||||
|
```
|
||||||
|
|
||||||
|
## See also
|
||||||
|
|
||||||
|
[show image](/reference/brick/show-mood)
|
24
docs/reference/brick/show-number.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# show Number
|
||||||
|
|
||||||
|
Show a number on the screen at the line you select.
|
||||||
|
|
||||||
|
```sig
|
||||||
|
brick.showNumber(0, 1);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Parameters
|
||||||
|
|
||||||
|
* **value**: a [number](/types/number) to show on the brick's screen.
|
||||||
|
* **line**: The line number on the screen where the value is displayed. The line numbers for the screen start with line `1`.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Show the number `1000` on the screen.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
brick.showNumber(1000, 1);
|
||||||
|
```
|
||||||
|
|
||||||
|
## See also
|
||||||
|
|
||||||
|
[show string](/reference/brick/show-string), [show value](/reference/brick/show-value)
|
29
docs/reference/brick/show-string.md
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# show String
|
||||||
|
|
||||||
|
Show some text on a the screen at the line you select.
|
||||||
|
|
||||||
|
```sig
|
||||||
|
brick.showString("Hello world", 1)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Parameters
|
||||||
|
|
||||||
|
* **text**: a [string](/types/string) to show on the brick's screen.
|
||||||
|
* **line**: the line [number](/types/number) on the screen where the text is displayed. The line numbers for the screen start with line `1`.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Show a greeting on the screen. Then, respond with another message when ENTER is pressed.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
brick.showString("Hello, I dare you to", 1);
|
||||||
|
brick.showString("press ENTER...", 2);
|
||||||
|
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||||
|
brick.showString("Hey! Don't push my", 4);
|
||||||
|
brick.showString("buttons.", 5);
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
## See also
|
||||||
|
|
||||||
|
[show number](/reference/brick/show-number)
|
29
docs/reference/brick/show-value.md
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# show Value
|
||||||
|
|
||||||
|
Show a name-value-pair on the screen at the line you select.
|
||||||
|
|
||||||
|
```sig
|
||||||
|
brick.showValue("item", 0, 1);
|
||||||
|
```
|
||||||
|
|
||||||
|
Name-value-pairs are used to report data values to the screen. If you want to show the current temperature on the screen, you might use `"temp"` as the data name for the the value.
|
||||||
|
|
||||||
|
## Parameters
|
||||||
|
|
||||||
|
* **name**: a [string](/types/string) which is the name of the data value.
|
||||||
|
* **value**: a [number](/types/number) to show on the brick's screen.
|
||||||
|
* **line**: The line number on the screen where the value is displayed. The line numbers for the screen start with line `1`.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Show the current amount of ambient light detected by sensor 2.
|
||||||
|
|
||||||
|
```blocks
|
||||||
|
brick.buttonEnter.onEvent(ButtonEvent.Bumped, function () {
|
||||||
|
brick.showValue("color", sensors.color2.light(LightIntensityMode.Ambient), 1)
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
## See also
|
||||||
|
|
||||||
|
[show number](/reference/brick/show-number)
|
109
docs/static/avatar.svg
vendored
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 22.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg version="1.1"
|
||||||
|
id="svg2" inkscape:version="0.91 r13725" sodipodi:docname="avatar.svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 32 32"
|
||||||
|
style="enable-background:new 0 0 32 32;" xml:space="preserve">
|
||||||
|
<style type="text/css">
|
||||||
|
.st0{fill:#303030;}
|
||||||
|
</style>
|
||||||
|
<sodipodi:namedview bordercolor="#666666" borderopacity="1" gridtolerance="10" guidetolerance="10" id="namedview15" inkscape:current-layer="svg2" inkscape:cx="16" inkscape:cy="16" inkscape:pageopacity="0" inkscape:pageshadow="2" inkscape:window-height="661" inkscape:window-maximized="0" inkscape:window-width="997" inkscape:window-x="0" inkscape:window-y="0" inkscape:zoom="5.2149125" objecttolerance="10" pagecolor="#ffffff" showgrid="false">
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<g id="avatar_mf" transform="translate(-5304.979 8145.745)">
|
||||||
|
<path id="Path_180" class="st0" d="M5317.1-8125.6c0.2,0,0.3-0.1,0.5-0.1l2.9-0.6c1.3-0.3,2.5-0.5,3.8-0.8c0.5-0.1,1-0.2,1.5-0.3
|
||||||
|
c0.1,0,0.1,0,0.1-0.1c0-0.5,0-1-0.1-1.5c-0.1-0.6-0.2-1.1-0.3-1.7c-0.1-0.4-0.1-0.8-0.2-1.2c-0.1-0.7-0.2-1.4-0.3-2
|
||||||
|
c-0.1-0.6-0.2-1.1-0.3-1.7c0-0.2-0.2-0.4-0.4-0.4c0,0,0,0-0.1,0c-0.2,0-0.5,0.1-0.7,0.1c-0.5,0.1-1,0.1-1.5,0.2
|
||||||
|
c-0.5,0.1-1,0.1-1.6,0.2c-0.5,0.1-1,0.1-1.4,0.2c-0.2,0-0.3,0-0.5,0.1c-0.2,0-0.4,0.2-0.5,0.4c0,0.2-0.1,0.4-0.1,0.5
|
||||||
|
c0,0.4-0.1,0.8-0.1,1.2c-0.1,0.5-0.1,1-0.2,1.5c0,0.4-0.1,0.9-0.1,1.3l-0.1,1.3l-0.1,1.3c-0.1,0.5-0.1,1-0.2,1.5
|
||||||
|
C5317.1-8126,5317.1-8125.8,5317.1-8125.6z"/>
|
||||||
|
<path id="Path_181" class="st0" d="M5316.1-8140c0,0.6,0.1,1.2,0.1,1.8c0,0.4,0.2,0.8,0.6,1c0.3,0.2,0.7,0.3,1.1,0.3
|
||||||
|
c0.7,0.1,1.4,0.1,2.1,0c0.6,0,1.2-0.1,1.8-0.2c0.4,0,0.9-0.2,1.2-0.5c0.3-0.3,0.5-0.7,0.5-1.1c0-1.2,0-2.3-0.1-3.5
|
||||||
|
c0-0.3-0.1-0.6-0.3-0.8c-0.3-0.4-0.8-0.6-1.4-0.6c0,0,0,0-0.1,0c-0.2,0.1-0.4,0.1-0.6,0.1c-0.9,0-1.8,0.1-2.7,0.1
|
||||||
|
c-0.1,0-0.3,0-0.4,0c-0.4-0.1-0.8,0-1.2,0.2c-0.4,0.2-0.6,0.6-0.7,1c0,0.1,0,0.2,0,0.3C5316-8141.2,5316.1-8140.6,5316.1-8140
|
||||||
|
L5316.1-8140z"/>
|
||||||
|
<path id="Path_182" class="st0" d="M5312-8129.2c0,0.6,0,1.2,0,1.8c0,0.1,0,0.1,0.1,0.1c0.3,0,0.6,0.1,0.9,0.1c0.3,0,0.7,0,1,0
|
||||||
|
c0.1,0,0.2,0,0.3,0c0.1,0,0.1,0,0.1-0.1c0.1-0.4,0.2-0.8,0.2-1.2c0.1-0.5,0.2-1,0.3-1.4c0-0.1,0.1-0.1,0.1-0.1
|
||||||
|
c0.4-0.2,0.8-0.5,1.2-0.8c0.4-0.4,0.7-0.9,0.8-1.5c0.1-0.6,0-1.2-0.4-1.7c-0.2-0.3-0.6-0.4-0.9-0.3c-0.3,0.1-0.6,0.3-0.9,0.5
|
||||||
|
c-0.7,0.6-1.5,1.2-2.2,1.8c-0.3,0.2-0.5,0.5-0.6,0.8c0,0.2-0.1,0.4-0.1,0.6C5311.9-8130.2,5311.9-8129.7,5312-8129.2
|
||||||
|
C5311.9-8129.2,5312-8129.2,5312-8129.2z"/>
|
||||||
|
<path id="Path_183" class="st0" d="M5315.5-8124.7c0,0.2-0.1,0.5-0.1,0.7c-0.1,0.5-0.4,0.9-0.8,1.1c0,0,0,0,0,0
|
||||||
|
c-0.1,0-0.2,0.2-0.2,0.3c-0.4,1.4-0.9,2.7-1.3,4.1c0,0,0,0.1,0,0.1c0.8,1.1,1.6,2.2,2.4,3.3c0,0,0,0,0.1,0.1
|
||||||
|
c0.1-0.2,0.1-0.3,0.2-0.5c0.1-0.3,0.2-0.5,0.3-0.8c0,0,0-0.1,0-0.1c-0.2-0.3-0.5-0.7-0.7-1c0,0,0-0.1,0-0.2
|
||||||
|
c0.3-0.9,0.6-1.7,0.9-2.6c0,0,0-0.1,0.1-0.1c0.5-0.2,0.9-0.6,1.1-1.1c0.1-0.3,0.1-0.7,0.1-1.1c0-0.4-0.1-0.8-0.3-1.2
|
||||||
|
c-0.2-0.4-0.5-0.8-1-1C5315.9-8124.7,5315.7-8124.7,5315.5-8124.7z"/>
|
||||||
|
<path id="Path_184" class="st0" d="M5314.7-8134.2c0.1-0.1,0.2-0.1,0.3-0.2c0.3-0.2,0.7-0.3,1-0.3c0.4,0,0.7,0.2,0.8,0.6
|
||||||
|
c0.6,1.1,0.5,2.4-0.4,3.3c-0.4,0.4-0.8,0.7-1.3,1c0,0-0.1,0.1-0.1,0.1c-0.2,0.8-0.3,1.6-0.5,2.5c0,0,0,0.1,0,0.1
|
||||||
|
c0,0.2,0,0.2-0.2,0.2c-0.1,0-0.1,0-0.2,0c0,0.1,0,0.2,0,0.3c0,0,0,0,0.1,0.1l1.9,0.7c0.2,0.1,0.4,0.2,0.7,0.2c0-0.1,0-0.2,0-0.2
|
||||||
|
c0-0.3,0-0.6,0-0.8l0.2-1.5l0.2-1.5c0.1-0.5,0.1-1,0.2-1.5c0.1-0.5,0.1-1.1,0.2-1.6c0.1-0.5,0.1-1,0.2-1.5c0-0.2,0-0.4,0-0.6
|
||||||
|
c0-0.2-0.1-0.4-0.3-0.4c0,0,0,0,0,0c-0.1,0-0.1,0-0.2,0c-0.6-0.1-1.2-0.2-1.9-0.3c-0.1,0-0.2,0-0.3,0c-0.1,0-0.2,0.1-0.3,0.3
|
||||||
|
C5314.8-8135,5314.7-8134.6,5314.7-8134.2z"/>
|
||||||
|
<path id="Path_185" class="st0" d="M5324.5-8117.2c-0.2-0.7-0.5-1.3-0.7-2l-0.7,0.3c0,0-0.1,0-0.1,0c-0.1,0.1-0.2,0-0.2-0.1
|
||||||
|
c-0.1-0.3-0.2-0.5-0.3-0.8c-0.2-0.7-0.5-1.4-0.7-2.1c0,0,0-0.1,0-0.1c0,0,0,0.1-0.1,0.1c-0.1,0.2-0.3,0.3-0.5,0.5c0,0-0.1,0-0.1,0
|
||||||
|
c-0.3,0.1-0.6,0.1-0.8,0.2c0,0-0.1,0-0.1,0c0,0.2-0.1,0.3-0.1,0.5c0.6,1.5,1.1,3.1,1.7,4.6c0,0,0,0,0,0.1
|
||||||
|
C5322.7-8116.3,5323.6-8116.7,5324.5-8117.2z"/>
|
||||||
|
<path id="Path_186" class="st0" d="M5325.4-8123.1c-0.7,0.2-1.3,0.3-2,0.5c-0.5,0.1-0.9,0.2-1.4,0.3c-0.1,0-0.2,0.1-0.1,0.2
|
||||||
|
c0,0,0,0,0,0.1c0.2,0.5,0.3,0.9,0.5,1.4c0.2,0.5,0.4,1.1,0.6,1.6c0,0,0,0,0,0c0.1-0.1,0.2-0.1,0.3-0.2c0.2-0.1,0.3-0.2,0.5-0.2
|
||||||
|
c0.2-0.1,0.4-0.1,0.6-0.2c0.7-0.2,1.5-0.4,2.2-0.6c0,0,0,0,0.1,0C5326.3-8121.1,5325.9-8122.1,5325.4-8123.1z"/>
|
||||||
|
<path id="Path_187" class="st0" d="M5320.7-8124.4c-0.4,0.1-0.8,0.2-1.2,0.3c-0.6,0.1-1.3,0.3-1.9,0.4c0,0-0.1,0-0.1,0
|
||||||
|
c-0.1,0-0.2-0.1-0.3-0.1c0,0,0,0.1,0,0.1c0.3,0.7,0.4,1.5,0.3,2.2c-0.1,0.4-0.3,0.8-0.5,1.1c0,0,0,0-0.1,0.1
|
||||||
|
c0.2-0.1,0.4-0.1,0.6-0.1l2.5-0.6c0.5-0.1,0.9-0.6,1-1.1c0.1-0.5,0-1-0.1-1.5C5320.8-8124,5320.8-8124.2,5320.7-8124.4z"/>
|
||||||
|
<path id="Path_188" class="st0" d="M5325.5-8127c-2.7,0.5-5.3,1.1-7.9,1.6c0,0.5,0,0.9,0.1,1.4c0.1,0,0.2,0,0.3-0.1
|
||||||
|
c1.2-0.3,2.3-0.5,3.5-0.8c1.2-0.3,2.4-0.5,3.6-0.8c0.1,0,0.3-0.1,0.4-0.1c0,0,0.1,0,0.1-0.1
|
||||||
|
C5325.6-8126.2,5325.5-8126.6,5325.5-8127z"/>
|
||||||
|
<path id="Path_189" class="st0" d="M5328.6-8118.4c-0.2-0.4-0.3-0.7-0.5-1.1c-0.1-0.2-0.2-0.5-0.3-0.7c0-0.1,0-0.1-0.1,0
|
||||||
|
c-1.2,0.3-2.4,0.6-3.6,1c0,0,0,0-0.1,0c0.2,0.7,0.5,1.3,0.7,2C5326-8117.6,5327.3-8118,5328.6-8118.4z"/>
|
||||||
|
<path id="Path_190" class="st0" d="M5319.9-8120.9l-0.6,0.1c-1,0.2-2,0.5-3,0.7c-0.1,0-0.1,0.1-0.1,0.1c-0.3,0.7-0.5,1.5-0.8,2.2
|
||||||
|
c0,0,0,0,0,0.1c0.2,0,0.4-0.1,0.5-0.1c1-0.3,2-0.5,3.1-0.8c0.1,0,0.2-0.1,0.3-0.2C5319.5-8119.5,5319.7-8120.2,5319.9-8120.9z"/>
|
||||||
|
<path id="Path_191" class="st0" d="M5325.1-8125.4c-1.1,0.2-2.2,0.5-3.3,0.7c0.3,0.7,0.4,1.4,0.3,2.2c0.2,0,0.4-0.1,0.5-0.1
|
||||||
|
c0.9-0.2,1.8-0.4,2.7-0.6c0.1,0,0.1,0,0.1-0.1c0.1-0.4,0-0.9-0.1-1.3C5325.3-8124.9,5325.2-8125.1,5325.1-8125.4
|
||||||
|
C5325.1-8125.3,5325.1-8125.4,5325.1-8125.4z"/>
|
||||||
|
<path id="Path_192" class="st0" d="M5325.6-8132c0.2,0,0.4,0,0.5,0c0.2,0,0.4,0,0.6,0c0.3,0,0.6-0.2,0.8-0.4c0.3-0.4,0.7-0.8,1-1.2
|
||||||
|
c-0.1-0.1-0.1-0.1-0.1-0.2c0,0,0,0-0.1,0c-0.7-0.1-1.3-0.5-1.4-1.2c-0.1-0.2-0.1-0.4-0.1-0.6c-0.2,0.1-0.3,0.3-0.5,0.4
|
||||||
|
c-0.1,0.1-0.2,0.1-0.3,0.2c0,0-0.1,0.1-0.2,0c-0.2,0-0.5-0.1-0.7-0.1c0,0,0,0-0.1,0C5325.3-8134.1,5325.4-8133.1,5325.6-8132z"/>
|
||||||
|
<path id="Path_193" class="st0" d="M5328.4-8134.2c0.2-0.3,0.5-0.5,0.8-0.7c0.4-0.4,0.6-0.8,0.7-1.4c0-0.1,0-0.2-0.1-0.3
|
||||||
|
c-0.3-0.5-0.7-1.1-1-1.6c0-0.1-0.1-0.1-0.1,0c-0.4,0.2-0.8,0.5-1.1,0.8c-0.2,0.2-0.4,0.4-0.6,0.6c-0.1,0.1-0.1,0.3,0,0.4
|
||||||
|
c0.5,0.7,1,1.5,1.4,2.2C5328.4-8134.2,5328.4-8134.2,5328.4-8134.2z"/>
|
||||||
|
<path id="Path_194" class="st0" d="M5314.3-8126.1c-0.1-0.1-0.1-0.1-0.2-0.2c-0.1,0-0.1-0.1-0.1-0.2c0-0.1,0-0.3,0-0.4h-0.1
|
||||||
|
c-0.6,0-1.2-0.1-1.7-0.2c0,0-0.1,0-0.1,0c-0.4,0.2-0.7,0.4-1,0.8c-0.4,0.6-0.4,1.4,0.1,1.9c0.2,0.2,0.4,0.4,0.6,0.6
|
||||||
|
c0.1,0.1,0.2,0.2,0.3,0.2c-0.2-0.6,0-1.3,0.5-1.8C5313-8125.9,5313.6-8126.2,5314.3-8126.1z"/>
|
||||||
|
<path id="Path_195" class="st0" d="M5315.7-8114.9c0.5-0.1,0.9-0.3,1.4-0.4c0.8-0.2,1.6-0.4,2.4-0.7c0.1,0,0.1,0,0.1-0.1
|
||||||
|
c0.1-0.4,0.2-0.7,0.4-1.1c0,0,0,0,0-0.1c-0.1,0-0.2,0-0.3,0.1c-1.2,0.3-2.3,0.6-3.5,1c-0.1,0-0.1,0.1-0.1,0.1
|
||||||
|
c-0.1,0.4-0.3,0.7-0.4,1.1C5315.7-8115,5315.7-8115,5315.7-8114.9z"/>
|
||||||
|
<path id="Path_196" class="st0" d="M5315.4-8117.4c0.2,0.3,0.4,0.6,0.6,0.9c0,0,0.1,0,0.1,0c1-0.3,1.9-0.5,2.9-0.8
|
||||||
|
c0.3-0.1,0.6-0.2,0.9-0.2c-0.1-0.1-0.1-0.2-0.2-0.2c-0.2-0.2-0.3-0.4-0.5-0.6c0,0-0.1-0.1-0.1,0c-0.9,0.3-1.9,0.5-2.8,0.8
|
||||||
|
C5316-8117.5,5315.7-8117.5,5315.4-8117.4z"/>
|
||||||
|
<path id="Path_197" class="st0" d="M5321.3-8143.6c0-0.3,0-0.7,0-1c0,0-0.1,0-0.1,0c-0.7,0-1.5,0-2.2,0.1c-0.4,0-0.7,0-1.1,0.1
|
||||||
|
c-0.1,0-0.1,0-0.1,0.1c0,0.3,0,0.6,0,0.8c0,0,0,0.1,0.1,0.1c0.4,0,0.8,0,1.1,0c0.5,0,1.1,0,1.6-0.1
|
||||||
|
C5320.9-8143.5,5321.1-8143.6,5321.3-8143.6z"/>
|
||||||
|
<path id="Path_198" class="st0" d="M5329.2-8134.3c0.1,0,0.2,0,0.2-0.1c0.4-0.2,0.8-0.4,1.1-0.7c0.3-0.2,0.4-0.5,0.6-0.8
|
||||||
|
c0.1-0.3,0.1-0.6-0.1-0.9c-0.4-0.5-0.7-1-1.1-1.6c0,0,0,0-0.1-0.1c-0.2,0.2-0.4,0.4-0.6,0.6c0,0,0,0,0,0c0,0,0,0.1,0,0.1
|
||||||
|
c0.2,0.4,0.5,0.7,0.7,1c0.1,0.2,0.2,0.4,0.1,0.6c0,0.5-0.1,0.9-0.4,1.3c-0.1,0.1-0.2,0.2-0.3,0.3
|
||||||
|
C5329.4-8134.5,5329.3-8134.4,5329.2-8134.3C5329.2-8134.3,5329.2-8134.3,5329.2-8134.3z"/>
|
||||||
|
<path id="Path_199" class="st0" d="M5317.5-8136.7c0,0.2,0,0.3,0,0.5c0,0,0,0.1,0.1,0.1c0.2,0,0.3,0.1,0.5,0.1c0.7,0.1,1.4,0.1,2,0
|
||||||
|
c0.4,0,0.8-0.1,1.2-0.1c0.2,0,0.5-0.1,0.7-0.1c0.1,0,0.1,0,0.1-0.1c0-0.2,0-0.3,0-0.5C5320.5-8136.6,5319-8136.5,5317.5-8136.7z"/>
|
||||||
|
<path id="Path_200" class="st0" d="M5312.5-8123.2c0.1-0.4,0.1-0.8,0.2-1.2c0.1-0.6,0.6-1,1.2-1c0.3,0,0.5,0.1,0.7,0.3
|
||||||
|
c0.2,0.2,0.2,0.4,0.2,0.7c-0.1,0.3-0.2,0.6-0.2,0.9c0,0.1-0.1,0.2-0.1,0.4c0,0,0,0,0,0c0.1-0.1,0.2-0.2,0.3-0.3
|
||||||
|
c0.3-0.4,0.4-0.9,0.4-1.4c0-0.6-0.4-1-0.9-1.1c-0.1,0-0.1,0-0.2,0c-0.5,0-1,0.3-1.4,0.7c-0.3,0.3-0.4,0.6-0.5,1
|
||||||
|
c-0.1,0.3,0,0.7,0.2,1C5312.5-8123.2,5312.5-8123.2,5312.5-8123.2z"/>
|
||||||
|
<path id="Path_201" class="st0" d="M5314.3-8123.2c0.1-0.5,0.3-0.9,0.4-1.4c0.1-0.2,0-0.4-0.2-0.5c-0.4-0.2-0.9-0.1-1.2,0.2
|
||||||
|
c0,0,0,0,0,0.1c0,0.2,0,0.4,0.1,0.6c0,0.1,0.1,0.2,0.2,0.3C5313.7-8123.6,5314-8123.4,5314.3-8123.2
|
||||||
|
C5314.2-8123.2,5314.3-8123.2,5314.3-8123.2z"/>
|
||||||
|
<path id="Path_202" class="st0" d="M5317.4-8124.1c0-0.4,0-0.9-0.1-1.3c-0.1,0-0.1,0-0.2,0c-0.1,0-0.2,0-0.3,0
|
||||||
|
c-0.7-0.3-1.4-0.5-2.1-0.8c0,0,0,0,0,0c0.1,0.1,0.1,0.1,0.2,0.2c0.3,0.2,0.5,0.6,0.6,0.9c0,0,0,0,0,0c0.1,0,0.3,0,0.4,0.1
|
||||||
|
c0.3,0.1,0.6,0.3,0.9,0.5c0,0,0.1,0.1,0.1,0.1C5317.1-8124.2,5317.2-8124.1,5317.4-8124.1z"/>
|
||||||
|
<path id="Path_203" class="st0" d="M5321.6-8124.6c-0.2,0-0.4,0.1-0.6,0.1c0.1,0.2,0.1,0.4,0.2,0.6c0.1,0.4,0.2,0.8,0.1,1.2
|
||||||
|
c0,0.5-0.1,0.9-0.4,1.3c0,0,0,0,0,0c0.3,0,0.6-0.2,0.7-0.5c0.2-0.3,0.3-0.6,0.3-0.9C5321.9-8123.4,5321.8-8124,5321.6-8124.6z"/>
|
||||||
|
<path id="Path_204" class="st0" d="M5315.7-8135.8c0.2,0,0.3,0.1,0.5,0.1c0.5,0.1,1,0.2,1.5,0.2c0.2,0,0.5,0,0.7,0
|
||||||
|
c0.7-0.1,1.4-0.2,2.1-0.2c0.6-0.1,1.2-0.2,1.8-0.2c0.5-0.1,1.1-0.1,1.6-0.2l-1.5-0.2c0,0,0,0,0,0c0,0.2-0.1,0.3-0.2,0.3
|
||||||
|
c0,0,0,0,0,0c-0.3,0.1-0.5,0.1-0.8,0.2c-0.8,0.1-1.6,0.1-2.3,0.1c-0.4,0-0.9,0-1.3-0.1c-0.1,0-0.2-0.1-0.3-0.2c0,0-0.1,0-0.1,0
|
||||||
|
c-0.3,0-0.6,0.1-0.9,0.1L5315.7-8135.8L5315.7-8135.8z"/>
|
||||||
|
<path id="Path_205" class="st0" d="M5327.3-8117.7c-0.3,0.1-0.5,0.2-0.8,0.2c-0.6,0.2-1.1,0.3-1.7,0.5c0,0-0.1,0-0.1,0.1
|
||||||
|
c-0.5,0.2-1,0.5-1.5,0.7c0,0,0,0,0,0c0.3-0.1,0.5-0.1,0.8-0.2c0.5-0.2,1.1-0.3,1.6-0.5c0.1,0,0.2-0.1,0.2-0.1
|
||||||
|
C5326.2-8117.2,5326.8-8117.5,5327.3-8117.7C5327.3-8117.7,5327.3-8117.7,5327.3-8117.7C5327.3-8117.7,5327.3-8117.7,5327.3-8117.7
|
||||||
|
z"/>
|
||||||
|
<path id="Path_206" class="st0" d="M5327-8135.8c0,0.1,0,0.2,0,0.4c0.1,0.5,0.3,0.9,0.7,1.1c0.1,0.1,0.3,0.1,0.4,0.2l0,0
|
||||||
|
C5327.8-8134.7,5327.4-8135.2,5327-8135.8L5327-8135.8z"/>
|
||||||
|
<path id="Path_207" class="st0" d="M5329-8134.4c-0.1,0.1-0.2,0.2-0.3,0.4c0,0,0,0,0,0.1c0,0.1,0,0.1,0.1,0.1c0.1,0,0.2,0,0.3-0.1
|
||||||
|
c0.1,0,0.2-0.1,0.3-0.1c-0.1,0-0.1-0.1-0.2-0.1C5329-8134.2,5329-8134.3,5329-8134.4z"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 11 KiB |
BIN
docs/static/configurations/chrome-version.png
vendored
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
docs/static/configurations/edge-version.png
vendored
Normal file
After Width: | Height: | Size: 4.8 KiB |
BIN
docs/static/configurations/firefox-version.png
vendored
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
docs/static/configurations/ie-version.png
vendored
Normal file
After Width: | Height: | Size: 17 KiB |
BIN
docs/static/configurations/osx-version.png
vendored
Normal file
After Width: | Height: | Size: 128 KiB |
BIN
docs/static/configurations/safari-version.png
vendored
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
docs/static/configurations/windows-version.png
vendored
Normal file
After Width: | Height: | Size: 82 KiB |
331
docs/static/download/connect.svg
vendored
Normal file
@ -0,0 +1,331 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="261.3" height="109.3" viewBox="0 0 69.1 28.9" id="svg9461">
|
||||||
|
<defs id="defs9455">
|
||||||
|
<clipPath id="clipPath8689">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8687"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8663">
|
||||||
|
<path d="M309.8 89.4h3.7v3.7h-3.7z" id="path8661"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8647">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8645"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 .6661 -.32488 0 300.7 115)" id="linearGradient8637">
|
||||||
|
<stop offset="0" id="stop8633" stop-color="#757575"/>
|
||||||
|
<stop offset="1" id="stop8635" stop-color="#393939"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8595">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8593"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 12.8096 -17.18704 0 300.7 98.4)" id="linearGradient8585">
|
||||||
|
<stop offset="0" id="stop8579" stop-color="#6a6a6a"/>
|
||||||
|
<stop offset=".5" id="stop8581" stop-color="#48e400"/>
|
||||||
|
<stop offset="1" id="stop8583" stop-color="#6a6a6a"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8561">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8559"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -1.33016 5.597 0 300.7 88.4)" id="linearGradient8551">
|
||||||
|
<stop offset="0" id="stop8547" stop-color="#a9aba9"/>
|
||||||
|
<stop offset="1" id="stop8549" stop-color="#535453"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8525">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8523"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -.56074 .70884 0 300.7 115.6)" id="linearGradient8515">
|
||||||
|
<stop offset="0" id="stop8511" stop-color="#a9aba9"/>
|
||||||
|
<stop offset="1" id="stop8513" stop-color="#818181"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8493">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8491"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -2.39765 2.48247 0 300.7 98.1)" id="linearGradient8483">
|
||||||
|
<stop offset="0" id="stop8479" stop-color="#f2f2f2"/>
|
||||||
|
<stop offset="1" id="stop8481" stop-color="#7a7a7a"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8449">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8447"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8977">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8975"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8951">
|
||||||
|
<path d="M593 101h3.6v3.7H593z" id="path8949"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8935">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8933"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 .67046 -.32706 0 583.8 126.8)" id="linearGradient8925">
|
||||||
|
<stop offset="0" id="stop8921" stop-color="#757575"/>
|
||||||
|
<stop offset="1" id="stop8923" stop-color="#393939"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8883">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8881"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 12.89405 -17.29507 0 583.7 110)" id="linearGradient8873">
|
||||||
|
<stop offset="0" id="stop8867" stop-color="#6a6a6a"/>
|
||||||
|
<stop offset=".5" id="stop8869" stop-color="#48e400"/>
|
||||||
|
<stop offset="1" id="stop8871" stop-color="#6a6a6a"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8849">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8847"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -1.33884 5.6329 0 583.7 100)" id="linearGradient8839">
|
||||||
|
<stop offset="0" id="stop8835" stop-color="#a9aba9"/>
|
||||||
|
<stop offset="1" id="stop8837" stop-color="#535453"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8813">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8811"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -.56429 .71345 0 583.7 127.4)" id="linearGradient8803">
|
||||||
|
<stop offset="0" id="stop8799" stop-color="#a9aba9"/>
|
||||||
|
<stop offset="1" id="stop8801" stop-color="#818181"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8781">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8779"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -2.41323 2.4988 0 583.7 109.8)" id="linearGradient8771">
|
||||||
|
<stop offset="0" id="stop8767" stop-color="#f2f2f2"/>
|
||||||
|
<stop offset="1" id="stop8769" stop-color="#7a7a7a"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8737">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8735"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath9285">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path9283"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath9259">
|
||||||
|
<path d="M852.5 96.3h3.3v3.3h-3.3z" id="path9257"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath9243">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path9241"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 .61565 -.3002 0 844 120)" id="linearGradient9233">
|
||||||
|
<stop offset="0" id="stop9229" stop-color="#757575"/>
|
||||||
|
<stop offset="1" id="stop9231" stop-color="#393939"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath9191">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path9189"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 11.84237 -15.8829 0 844 104.6)" id="linearGradient9181">
|
||||||
|
<stop offset="0" id="stop9175" stop-color="#6a6a6a"/>
|
||||||
|
<stop offset=".5" id="stop9177" stop-color="#48e400"/>
|
||||||
|
<stop offset="1" id="stop9179" stop-color="#6a6a6a"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath9157">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path9155"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -1.22922 5.1724 0 844 95.3)" id="linearGradient9147">
|
||||||
|
<stop offset="0" id="stop9143" stop-color="#a9aba9"/>
|
||||||
|
<stop offset="1" id="stop9145" stop-color="#535453"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath9121">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path9119"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -.51809 .65506 0 844 120.5)" id="linearGradient9111">
|
||||||
|
<stop offset="0" id="stop9107" stop-color="#a9aba9"/>
|
||||||
|
<stop offset="1" id="stop9109" stop-color="#818181"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath9089">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path9087"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -2.21578 2.29436 0 844 104.3)" id="linearGradient9079">
|
||||||
|
<stop offset="0" id="stop9075" stop-color="#f2f2f2"/>
|
||||||
|
<stop offset="1" id="stop9077" stop-color="#7a7a7a"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath9009">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path9007"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath9041">
|
||||||
|
<path d="M779.5 134.7h16.7v-12.6h-16.7z" id="path9039"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath9045">
|
||||||
|
<path d="M779.5 134.7h16.7v-12.6h-16.7z" id="path9043"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8907">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8905"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8881">
|
||||||
|
<path d="M309.8 89.4h3.7v3.7h-3.7z" id="path8879"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8865">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8863"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8813-1">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8811-4"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8779">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8777"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8743">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8741"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8711">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8709"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8667">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8665"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
<g id="layer1" transform="translate(0 -268)">
|
||||||
|
<g id="g11329" transform="matrix(.35278 0 0 -.35278 -42.7 327.3)">
|
||||||
|
<g id="g8661">
|
||||||
|
<g clip-path="url(#clipPath8667)" id="g8663">
|
||||||
|
<g transform="translate(134 148)" id="g8669">
|
||||||
|
<path id="path8671" d="M0 0h83a4 4 0 0 0 4-4v-52.5H-4V-4a4 4 0 0 0 4 4" fill="#e6e6e6"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(134 146.5)" id="g8673">
|
||||||
|
<path id="path8675" d="M0 0h83c1.3 0 2.4-1.1 2.4-2.5V-52c0-.9-.6-1.5-1.5-1.5H-1c-.8 0-1.5.6-1.5 1.5v49.5C-2.5-1.1-1.4 0 0 0z" fill="none" stroke="#282828" stroke-width="3"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(121 91)" id="g8677">
|
||||||
|
<path id="path8679" d="M0 0h108.8v-1.2a3 3 0 0 0-3-3H3a3 3 0 0 0-3 3z" fill="#626262"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(165.8 91)" id="g8681">
|
||||||
|
<path id="path8683" d="M0 0h19.3c0-.8-.6-1.4-1.4-1.4H1.4C.6-1.4 0-.8 0 0" fill="#818181"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8685">
|
||||||
|
<g id="g8687">
|
||||||
|
<g id="g8693">
|
||||||
|
<g id="g8695">
|
||||||
|
<path id="path8703" d="M285 127.8a.6.6 0 0 1-.7-.5V96.9c0-.3.3-.6.6-.6h31.5c.3 0 .6.3.6.6v30.4c0 .3-.3.5-.6.5z" fill="url(#linearGradient8483)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8705">
|
||||||
|
<g clip-path="url(#clipPath8711)" id="g8707">
|
||||||
|
<g transform="translate(286.8 99.6)" id="g8713">
|
||||||
|
<path id="path8715" d="M0 0h27.8c.4 0 .6-.3.6-.6v-11.3c0-.4-.2-.6-.6-.6H0c-.3 0-.6.2-.6.6V-.6c0 .3.3.6.6.6" fill="#f2f2f2"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8717">
|
||||||
|
<g id="g8719">
|
||||||
|
<g id="g8725">
|
||||||
|
<g id="g8727">
|
||||||
|
<path id="path8735-5" d="M286.5 137.2a.6.6 0 0 1-.6-.6v-22.2c0-.3.3-.6.6-.6h28.4c.3 0 .5.3.5.6v22.2c0 .3-.2.6-.5.6z" fill="url(#linearGradient8515)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8737">
|
||||||
|
<g clip-path="url(#clipPath8743)" id="g8739">
|
||||||
|
<g transform="translate(289.7 134.1)" id="g8745">
|
||||||
|
<path id="path8747" d="M0 0h22c.6 0 1-.5 1-1.1v-12.4c0-.6-.4-1-1-1H0c-.6 0-1.1.4-1.1 1V-1c0 .5.5 1 1.1 1" fill="#393939"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(291.4 133.5)" id="g8749">
|
||||||
|
<path id="path8751" d="M0 0h18.7c.4 0 .8-.4.8-.8v-11.9c0-.4-.4-.8-.8-.8H0c-.4 0-.8.3-.8.8V-.8c0 .4.4.8.8.8" fill="#98b6a7"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8753">
|
||||||
|
<g id="g8755">
|
||||||
|
<g id="g8761">
|
||||||
|
<g id="g8763">
|
||||||
|
<path id="path8771" d="M286.2 94v-6.4c0-.3.2-.6.6-.6h27.8c.3 0 .6.3.6.6V94z" fill="url(#linearGradient8551)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8773">
|
||||||
|
<g clip-path="url(#clipPath8779)" id="g8775">
|
||||||
|
<g transform="translate(298.7 97.7)" id="g8781">
|
||||||
|
<path id="path8783" d="M0 0l-4.2 4.2v.5h-1a2.4 2.4 0 0 0 0 5h1v.5L0 14.4h4l4.2-4.2v-.6h1a2.4 2.4 0 1 0 0-4.9h-1v-.5L4.2 0z" fill="#6a6a6a"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8785">
|
||||||
|
<g id="g8787">
|
||||||
|
<g id="g8793">
|
||||||
|
<g id="g8795">
|
||||||
|
<path id="path8805" d="M298.7 112.1l-4.2-4.3v-.5h-1c-1.4 0-2.5-1-2.5-2.4s1.1-2.5 2.5-2.5h1v-.5l4.2-4.2h4.2l4 4.2v.5h1c1.4 0 2.5 1.1 2.5 2.5 0 1.3-1.1 2.4-2.5 2.4h-1v.6l-4 4.2z" fill="url(#linearGradient8585)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8807">
|
||||||
|
<g clip-path="url(#clipPath8813-1)" id="g8809">
|
||||||
|
<g transform="translate(293.4 106.7)" id="g8815">
|
||||||
|
<path id="path8817" d="M0 0h3v-3.6H0c-1 0-1.8.8-1.8 1.8S-1 0 0 0" fill="#a9aba9"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(308 103.1)" id="g8819">
|
||||||
|
<path id="path8821" d="M0 0h-3v3.6h3c1 0 1.8-.8 1.8-1.8S1 0 0 0" fill="#a9aba9"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(299 106.7)" id="g8823">
|
||||||
|
<path id="path8825" d="M0 0h3.5l.2-.1v-3.4l-.2-.1H0l-.1.1V0H0" fill="#393939"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(298.8 111.4)" id="g8827">
|
||||||
|
<path id="path8829" d="M0 0h3.8l2.8-2.9L5.4-4v-2.1h-1V-5c0 .5-.5.9-1 .9H.2a.7.7 0 0 1-.8-.8V-6h-1v2l-1.2 1.2z" fill="#a9aba9"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(302.6 98.4)" id="g8831">
|
||||||
|
<path id="path8833" d="M0 0h-3.7l-2.9 2.9L-5.4 4v2.1h1V5c0-.5.5-.9 1-.9h3.2c.4 0 .8.4.8.8v1.3h1v-2L2.8 3z" fill="#a9aba9"/>
|
||||||
|
</g>
|
||||||
|
<path id="path8835" d="M300.3 119.6h.9v-4.1h-1z" fill="#393939"/>
|
||||||
|
<path id="path8837" d="M300.3 115.7h.9v-1.8h-1z" fill="#9b9b9b"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8839">
|
||||||
|
<g id="g8841">
|
||||||
|
<g id="g8847">
|
||||||
|
<g id="g8849">
|
||||||
|
<path id="path8857" d="M300.3 113.8h.9v1.9h-1z" fill="url(#linearGradient8637)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8859">
|
||||||
|
<g clip-path="url(#clipPath8865)" id="g8861">
|
||||||
|
<path id="path8867" d="M300.3 113.8h.9v-1.7h-1z" fill="#818181"/>
|
||||||
|
<g transform="translate(288.2 113.8)" id="g8869">
|
||||||
|
<path id="path8871" d="M0 0h7v-1.7L5.2-3.4H.6c-.3 0-.6.2-.6.5z" fill="#a9aba9"/>
|
||||||
|
</g>
|
||||||
|
<path id="path8873" d="M309.9 93h3.6v-3.6h-3.6z" fill="#fff"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8875">
|
||||||
|
<g clip-path="url(#clipPath8881)" id="g8877">
|
||||||
|
<g transform="translate(313.2 91.6)" id="g8883">
|
||||||
|
<path id="path8885" d="M0 0v-.3C-.3-.7-.4-1-.8-1l-.3.2v.1a.6.6 0 0 0-.5-.3c-.1 0-.2 0-.3.2l-.4-.1h-.6c-.2 0-.3 0-.3.2l.3 1h.4V0l.1.1.5.2.3-.1h.3c.2.1.3 0 .4 0V.1l.4.2.3-.1L0 0m-3.4-2.1H.2v3.6h-3.6z" fill="#fe0"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(313.3 91.4)" id="g8887">
|
||||||
|
<path id="path8889" d="M0 0c0-.2 0-.3-.2-.5 0-.2-.3-.4-.6-.4l-.4.1a.7.7 0 0 0-.4-.1H-2a.6.6 0 0 0-.4 0H-3c-.3 0-.4.1-.4.3 0 .4.1.7.3 1 0 .2.2.2.4.2h2.1L0 .5V0m-3.5-2H.1v3.6h-3.6z" fill="#d52715"/>
|
||||||
|
</g>
|
||||||
|
<path id="path8891" d="M313.4 89.5H310V93h3.5zm-3.6 0h3.7V93h-3.7z" fill="#171714"/>
|
||||||
|
<g transform="translate(313.3 92)" id="g8893">
|
||||||
|
<path id="path8895" d="M0 0v-.2.2m0 0v-.2.1m0 0zm0 0z" fill="#171714"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(312.9 91.6)" id="g8897">
|
||||||
|
<path id="path8899" d="M0 0l-.2-.5v-.1h-.1c0 .2 0 .4.2.6H0m.3-.2L0-.6C0-.8-.2-1-.3-1c-.2 0-.3 0-.3.3l.1.5c.1.2.2.4.5.4s.3-.3.3-.5M-1 .1V0l-.3-.5.1-.1.2.2c0 .2 0 .2.2.2s.2-.1.1-.2c0-.3-.2-.5-.5-.5a.3.3 0 0 0-.2.3v.5c.2.2.3.4.6.4.2 0 .3 0 .3-.2 0-.1 0-.2-.2-.2h-.1v.2m-1-.5v-.2h.3c0-.2-.2-.3-.3-.3-.2 0-.3.1-.3.2 0 .3 0 .5.2.7 0 .2.2.3.4.3l.2-.1c0-.1 0-.2-.2-.2h-.1v-.1c.1 0 .2 0 .1-.2h-.3m-.6-.3h.2c0-.2-.1-.3-.3-.3 0 0-.2 0-.2.2l.3.9s.1.1.2 0h.1c0-.3-.1-.5-.3-.8M0 .4C-.2.4-.3.4-.4.2l-.4.2-.4-.1-.3.1c-.2 0-.3 0-.4-.2v.1l-.3.1s-.2 0-.3-.2l-.3-.9c0-.2.1-.3.3-.3l.4.1h.9l.5.1.4-.2c.3 0 .5.3.6.7V0a.4.4 0 0 1-.3.4" fill="#171714"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8901">
|
||||||
|
<g clip-path="url(#clipPath8907)" id="g8903">
|
||||||
|
<g transform="translate(295 91.5)" id="g8909">
|
||||||
|
<path id="path8911" d="M0 0v-.3h-.6l-.1-.1v-.4H0v-.4h-1l-.2.1h-.3l-.1-.1v-.5l.1-.1H.6V.5h-2.2v-.6h.5V0H0z" fill="#f2f2f2"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(293 92)" id="g8913">
|
||||||
|
<path id="path8915" d="M0 0h-.5l-.1-.1-.6-1.3L-2 0h-.6v-.1l.9-2 .2-.1h.4l.1.1 1 2V0" fill="#f2f2f2"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(290 91.1)" id="g8917">
|
||||||
|
<path id="path8919" d="M0 0h.1v-.4L0-.5h-1.5v-.3H0L.1-1v-.4h-2.2v2c0 .1 0 .2.1.1H.1V.4h-1.6V0z" fill="#f2f2f2"/>
|
||||||
|
</g>
|
||||||
|
<path id="path8921" d="M249 87h-13v7.9h13z" fill="#a9aba9"/>
|
||||||
|
<path id="path8923" d="M263.5 87h-12.9v7.9h12.9z"/>
|
||||||
|
<path id="path8925" d="M240.7 92.2h-1.3v1.4h1.3z"/>
|
||||||
|
<path id="path8927" d="M240.7 88.2h-1.3v1.4h1.3z"/>
|
||||||
|
<path id="path8929" d="M258.2 86h-14.5v9.9h14.5z"/>
|
||||||
|
<path id="path8931" d="M311.6 141h-5v9h5z" fill="#a9aba9"/>
|
||||||
|
<path id="path8933-4" d="M311.2 151.6h-4v9.3h4z"/>
|
||||||
|
<path id="path8935" d="M311.2 141.4h-.3v3h.3z"/>
|
||||||
|
<path id="path8937" d="M307.3 141.4h-.4v3h.4z"/>
|
||||||
|
<path id="path8939" d="M312.9 145h-7.3v12.2h7.3z"/>
|
||||||
|
<g transform="translate(309.2 158)" id="g8941">
|
||||||
|
<path id="path8943" d="M0 0v8.8h-36.4v-75.5h-15.1" fill="none" stroke="#000" stroke-width="2"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 16 KiB |
252
docs/static/download/firmware.svg
vendored
Normal file
@ -0,0 +1,252 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="261.3" height="109.3" viewBox="0 0 69.1 28.9" id="svg9461">
|
||||||
|
<defs id="defs9455">
|
||||||
|
<clipPath id="clipPath8689">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8687"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8663">
|
||||||
|
<path d="M309.8 89.4h3.7v3.7h-3.7z" id="path8661"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8647">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8645"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 .6661 -.32488 0 300.7 115)" id="linearGradient8637">
|
||||||
|
<stop offset="0" id="stop8633" stop-color="#757575"/>
|
||||||
|
<stop offset="1" id="stop8635" stop-color="#393939"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8595">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8593"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 12.8096 -17.18704 0 300.7 98.4)" id="linearGradient8585">
|
||||||
|
<stop offset="0" id="stop8579" stop-color="#6a6a6a"/>
|
||||||
|
<stop offset=".5" id="stop8581" stop-color="#48e400"/>
|
||||||
|
<stop offset="1" id="stop8583" stop-color="#6a6a6a"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8561">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8559"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -1.33016 5.597 0 300.7 88.4)" id="linearGradient8551">
|
||||||
|
<stop offset="0" id="stop8547" stop-color="#a9aba9"/>
|
||||||
|
<stop offset="1" id="stop8549" stop-color="#535453"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8525">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8523"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -.56074 .70884 0 300.7 115.6)" id="linearGradient8515">
|
||||||
|
<stop offset="0" id="stop8511" stop-color="#a9aba9"/>
|
||||||
|
<stop offset="1" id="stop8513" stop-color="#818181"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8493">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8491"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -2.39765 2.48247 0 300.7 98.1)" id="linearGradient8483">
|
||||||
|
<stop offset="0" id="stop8479" stop-color="#f2f2f2"/>
|
||||||
|
<stop offset="1" id="stop8481" stop-color="#7a7a7a"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8449">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8447"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8977">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8975"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8951">
|
||||||
|
<path d="M593 101h3.6v3.7H593z" id="path8949"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8935">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8933"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 .67046 -.32706 0 583.8 126.8)" id="linearGradient8925">
|
||||||
|
<stop offset="0" id="stop8921" stop-color="#757575"/>
|
||||||
|
<stop offset="1" id="stop8923" stop-color="#393939"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8883">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8881"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 12.89405 -17.29507 0 583.7 110)" id="linearGradient8873">
|
||||||
|
<stop offset="0" id="stop8867" stop-color="#6a6a6a"/>
|
||||||
|
<stop offset=".5" id="stop8869" stop-color="#48e400"/>
|
||||||
|
<stop offset="1" id="stop8871" stop-color="#6a6a6a"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8849">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8847"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -1.33884 5.6329 0 583.7 100)" id="linearGradient8839">
|
||||||
|
<stop offset="0" id="stop8835" stop-color="#a9aba9"/>
|
||||||
|
<stop offset="1" id="stop8837" stop-color="#535453"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8813">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8811"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -.56429 .71345 0 583.7 127.4)" id="linearGradient8803">
|
||||||
|
<stop offset="0" id="stop8799" stop-color="#a9aba9"/>
|
||||||
|
<stop offset="1" id="stop8801" stop-color="#818181"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8781">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8779"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -2.41323 2.4988 0 583.7 109.8)" id="linearGradient8771">
|
||||||
|
<stop offset="0" id="stop8767" stop-color="#f2f2f2"/>
|
||||||
|
<stop offset="1" id="stop8769" stop-color="#7a7a7a"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8737">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8735"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
<g id="layer1" transform="translate(0 -268)">
|
||||||
|
<g id="g10860" transform="translate(-20.8 -2)">
|
||||||
|
<g transform="matrix(.35278 0 0 -.35278 62.8 291.4)" id="g8727">
|
||||||
|
<path id="path8729" d="M0 0h24" fill="none" stroke="#000" stroke-width="2"/>
|
||||||
|
</g>
|
||||||
|
<g id="g8731" transform="matrix(.35278 0 0 -.35278 -129 330.1)">
|
||||||
|
<g clip-path="url(#clipPath8737)" id="g8733">
|
||||||
|
<g transform="translate(458 159.9)" id="g8739">
|
||||||
|
<path id="path8741" d="M0 0h83a4 4 0 0 0 4-4v-52.5H-4V-4a4 4 0 0 0 4 4" fill="#e6e6e6"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(458 158.4)" id="g8743">
|
||||||
|
<path id="path8745" d="M0 0h83c1.3 0 2.4-1.1 2.4-2.5V-52c0-.9-.6-1.5-1.5-1.5H-1c-.8 0-1.5.6-1.5 1.5v49.5C-2.5-1.1-1.4 0 0 0z" fill="none" stroke="#282828" stroke-width="3"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(445 102.9)" id="g8747">
|
||||||
|
<path id="path8749" d="M0 0h108.8v-1.2a3 3 0 0 0-3-3H3a3 3 0 0 0-3 3z" fill="#626262"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(489.8 102.9)" id="g8751">
|
||||||
|
<path id="path8753" d="M0 0h19.3c0-.8-.6-1.4-1.4-1.4H1.4C.6-1.4 0-.8 0 0" fill="#818181"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8755" transform="matrix(.35278 0 0 -.35278 -129 330.1)">
|
||||||
|
<g id="g8757">
|
||||||
|
<g id="g8763">
|
||||||
|
<g id="g8765">
|
||||||
|
<path id="path8773" d="M567.9 139.7a.6.6 0 0 1-.6-.6v-30.6c0-.3.2-.6.6-.6h31.7c.3 0 .5.3.5.6v30.6c0 .3-.2.6-.5.6z" fill="url(#linearGradient8771)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8775" transform="matrix(.35278 0 0 -.35278 -129 330.1)">
|
||||||
|
<g clip-path="url(#clipPath8781)" id="g8777">
|
||||||
|
<g transform="translate(569.7 111.2)" id="g8783">
|
||||||
|
<path id="path8785" d="M0 0h28c.3 0 .6-.3.6-.6V-12c0-.4-.3-.6-.6-.6H0c-.3 0-.6.2-.6.6V-.6c0 .3.3.6.6.6" fill="#f2f2f2"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8787" transform="matrix(.35278 0 0 -.35278 -129 330.1)">
|
||||||
|
<g id="g8789">
|
||||||
|
<g id="g8795">
|
||||||
|
<g id="g8797">
|
||||||
|
<path id="path8805" d="M569.4 149.1a.6.6 0 0 1-.6-.6v-22.3c0-.3.3-.6.6-.6H598c.3 0 .6.3.6.6v22.3c0 .3-.3.6-.6.6z" fill="url(#linearGradient8803)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8807" transform="matrix(.35278 0 0 -.35278 -129 330.1)">
|
||||||
|
<g clip-path="url(#clipPath8813)" id="g8809">
|
||||||
|
<g transform="translate(572.7 146)" id="g8815">
|
||||||
|
<path id="path8817" d="M0 0h22.1c.6 0 1.1-.5 1.1-1.1v-12.5c0-.6-.5-1-1-1H0c-.6 0-1.1.4-1.1 1V-1c0 .5.5 1 1.1 1" fill="#393939"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(574.4 145.4)" id="g8819">
|
||||||
|
<path id="path8821" d="M0 0h18.8c.4 0 .8-.4.8-.8v-12c0-.4-.4-.8-.8-.8H0c-.4 0-.8.4-.8.8v12c0 .4.4.8.8.8" fill="#98b6a7"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8823" transform="matrix(.35278 0 0 -.35278 -129 330.1)">
|
||||||
|
<g id="g8825">
|
||||||
|
<g id="g8831">
|
||||||
|
<g id="g8833">
|
||||||
|
<path id="path8841" d="M569.1 105.6v-6.4c0-.3.3-.6.6-.6h28c.3 0 .6.3.6.6v6.4z" fill="url(#linearGradient8839)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8843" transform="matrix(.35278 0 0 -.35278 -129 330.1)">
|
||||||
|
<g clip-path="url(#clipPath8849)" id="g8845">
|
||||||
|
<g transform="translate(581.7 109.3)" id="g8851">
|
||||||
|
<path id="path8853" d="M0 0l-4.2 4.2v.6h-1a2.5 2.5 0 0 0 0 4.9h1v.5L0 14.5h4l4.2-4.2v-.6h1a2.5 2.5 0 0 0 0-5h-1v-.5L4.2 0z" fill="#6a6a6a"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8855" transform="matrix(.35278 0 0 -.35278 -129 330.1)">
|
||||||
|
<g id="g8857">
|
||||||
|
<g id="g8863">
|
||||||
|
<g id="g8865">
|
||||||
|
<path id="path8875" d="M581.7 123.8l-4.2-4.2v-.6h-1a2.5 2.5 0 1 1 0-5v.1h1v-.5l4.2-4.3h4.2l4.2 4.3v.5h1a2.5 2.5 0 0 1-.1 4.9h-1v.7l-4.1 4.1z" fill="url(#linearGradient8873)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8877" transform="matrix(.35278 0 0 -.35278 -129 330.1)">
|
||||||
|
<g clip-path="url(#clipPath8883)" id="g8879">
|
||||||
|
<g transform="translate(576.4 118.4)" id="g8885">
|
||||||
|
<path id="path8887" d="M0 0h3v-3.6H0A1.8 1.8 0 1 0 0 0" fill="#a9aba9"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(591 114.8)" id="g8889">
|
||||||
|
<path id="path8891" d="M0 0h-3v3.6h3A1.8 1.8 0 1 0 0 0" fill="#a9aba9"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(582 118.4)" id="g8893">
|
||||||
|
<path id="path8895" d="M0 0h3.6v-3.6H-.1V0H0" fill="#393939"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(581.9 123.2)" id="g8897">
|
||||||
|
<path id="path8899" d="M0 0h3.8l2.8-2.9L5.5-4v-2H4.3v1c0 .5-.4 1-1 1h-3a.7.7 0 0 1-.8-.8v-1.4h-1V-4l-1.2 1.2z" fill="#a9aba9"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(585.6 110)" id="g8901">
|
||||||
|
<path id="path8903" d="M0 0h-3.8l-2.8 2.9 1.2 1.2v2h1V5c0-.5.5-1 1-1h3.2c.5 0 .8.4.8.8v1.4h1.1V4l1.2-1.2z" fill="#a9aba9"/>
|
||||||
|
</g>
|
||||||
|
<path id="path8905" d="M583.3 131.4h.9v-4.1h-.9z" fill="#393939"/>
|
||||||
|
<path id="path8907" d="M583.3 127.4h.9v-1.8h-.9z" fill="#9b9b9b"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8909" transform="matrix(.35278 0 0 -.35278 -129 330.1)">
|
||||||
|
<g id="g8911">
|
||||||
|
<g id="g8917">
|
||||||
|
<g id="g8919">
|
||||||
|
<path id="path8927" d="M583.3 125.6h.9v1.8h-.9z" fill="url(#linearGradient8925)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8929" transform="matrix(.35278 0 0 -.35278 -129 330.1)">
|
||||||
|
<g clip-path="url(#clipPath8935)" id="g8931">
|
||||||
|
<path id="path8937" d="M583.3 125.6h.9v-1.8h-.9z" fill="#818181"/>
|
||||||
|
<g transform="translate(571.2 125.6)" id="g8939">
|
||||||
|
<path id="path8941" d="M0 0h7v-1.7L5.3-3.5H.6c-.3 0-.6.3-.6.6z" fill="#a9aba9"/>
|
||||||
|
</g>
|
||||||
|
<path id="path8943" d="M593 104.7h3.6V101H593z" fill="#fff"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8945" transform="matrix(.35278 0 0 -.35278 -129 330.1)">
|
||||||
|
<g clip-path="url(#clipPath8951)" id="g8947">
|
||||||
|
<g transform="translate(596.4 103.2)" id="g8953">
|
||||||
|
<path id="path8955" d="M0 0v-.3C-.3-.8-.4-1-.8-1l-.3.2a.6.6 0 0 0-.5-.2c-.1 0-.2 0-.3.2C-2-1-2.1-1-2.2-1h-.6a.3.3 0 0 0-.3.2l.3 1h.5l.5.2.2-.1h.4c.1.1.3 0 .4 0V.1l.4.2.3-.1L0 0m-3.4-2.1H.2v3.6h-3.6z" fill="#fe0"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(596.5 103)" id="g8957">
|
||||||
|
<path id="path8959" d="M0 0c0-.2 0-.3-.2-.5 0-.2-.3-.4-.6-.4l-.4.1a.7.7 0 0 0-.4-.1H-2a.7.7 0 0 0-.4 0H-3c-.2 0-.3.1-.4.3 0 .4.2.7.4 1 0 .2.2.2.4.2h2.1L0 .5V0m-3.5-2H.1v3.6h-3.6z" fill="#d52715"/>
|
||||||
|
</g>
|
||||||
|
<path id="path8961" d="M596.6 101H593v3.6h3.6zm-3.7 0h3.7v3.7H593z" fill="#171714"/>
|
||||||
|
<g transform="translate(596.5 103.7)" id="g8963">
|
||||||
|
<path id="path8965" d="M0 0v-.2.2m0 0v-.2.1m0 0zm0 0z" fill="#171714"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(596 103.2)" id="g8967">
|
||||||
|
<path id="path8969" d="M0 0a3 3 0 0 0-.2-.6h-.1c0 .2 0 .4.2.6H0m.3-.2L0-.6C0-.8-.2-1-.3-1c-.2 0-.3 0-.3.3l.1.4c.1.3.2.5.5.5s.3-.3.3-.5M-1 .1V0l-.3-.5.1-.1.2.2c0 .2 0 .2.2.2s.2-.1.1-.2c0-.3-.2-.5-.5-.5a.3.3 0 0 0-.3.3l.2.5c0 .2.2.4.5.4.2 0 .3 0 .3-.2 0-.1 0-.2-.2-.2h-.1v.2m-1-.5v-.2h.3c0-.2-.2-.3-.3-.3-.2 0-.3.1-.3.2 0 .3 0 .5.2.7 0 .2.2.3.4.3l.2-.1c0-.2 0-.2-.2-.2h-.1v-.1c.1 0 .2 0 .1-.2l-.3-.1m-.6-.2h.2c0-.2-.1-.3-.3-.3 0 0-.2 0-.2.2l.3.9s.1.1.2 0h.1c0-.3-.2-.5-.3-.8M0 .4C-.2.4-.3.4-.4.2l-.4.2-.4-.1-.3.1c-.2 0-.3 0-.4-.2v.1l-.3.1c-.1 0-.2 0-.3-.2-.1-.3-.3-.6-.3-1 0 0 .1-.2.3-.2l.3.1c.1 0 .2-.1.4 0h.6l.5.1.4-.2c.3 0 .5.3.6.6V0a.4.4 0 0 1-.3.4" fill="#171714"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g id="g8971" transform="matrix(.35278 0 0 -.35278 -129 330.1)">
|
||||||
|
<g clip-path="url(#clipPath8977)" id="g8973">
|
||||||
|
<g transform="translate(578 103)" id="g8979">
|
||||||
|
<path id="path8981" d="M0 0v-.3h-.6l-.1-.1v-.4H0v-.4h-1l-.2.2h-.3l-.1-.1v-.6H.7V.5h-2.3v-.6h.5V0H0z" fill="#f2f2f2"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(576 103.6)" id="g8983">
|
||||||
|
<path id="path8985" d="M0 0h-.5l-.1-.1-.6-1.3L-2-.1V0h-.5s-.1 0 0-.1l.9-2 .2-.1h.5l1 2L0 0" fill="#f2f2f2"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(573 102.8)" id="g8987">
|
||||||
|
<path id="path8989" d="M0 0h.1v-.4L0-.5h-1.5v-.3H0L.1-1v-.4h-2.2v2l.1.2H.1V.4h-1.6V0z" fill="#f2f2f2"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(583.5 136.6)" id="g8991">
|
||||||
|
<path id="path8993" d="M0 0l-.8 1.3-1.4-2.9 4-1c-.5.5-.5.7-.9 1.3.5.1 1 .4 1.4.7.8.4 1.5 1 2 1.9a4 4 0 0 1-.6 3.6c-.4 0-.8 0-1.3-.2C3.5 3 3.5 1 0 0" fill="#303030"/>
|
||||||
|
</g>
|
||||||
|
<g transform="translate(583.1 141.4)" id="g8995">
|
||||||
|
<path id="path8997" d="M0 0l.8-1.2 1.4 2.8-3.8 1 .7-1.3-1.3-.7a4.5 4.5 0 0 1-2-2c-.4-1-.2-2.4.5-3.4.4 0 .8 0 1.2.2C-3.3-3-3.3-1 0 0" fill="#303030"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 13 KiB |
327
docs/static/download/transfer.svg
vendored
Normal file
@ -0,0 +1,327 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="261.3" height="109.3" viewBox="0 0 69.1 28.9" id="svg9461">
|
||||||
|
<defs id="defs9455">
|
||||||
|
<clipPath id="clipPath8689">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8687"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8663">
|
||||||
|
<path d="M309.8 89.4h3.7v3.7h-3.7z" id="path8661"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8647">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8645"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 .6661 -.32488 0 300.7 115)" id="linearGradient8637">
|
||||||
|
<stop offset="0" id="stop8633" stop-color="#757575"/>
|
||||||
|
<stop offset="1" id="stop8635" stop-color="#393939"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8595">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8593"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 12.8096 -17.18704 0 300.7 98.4)" id="linearGradient8585">
|
||||||
|
<stop offset="0" id="stop8579" stop-color="#6a6a6a"/>
|
||||||
|
<stop offset=".5" id="stop8581" stop-color="#48e400"/>
|
||||||
|
<stop offset="1" id="stop8583" stop-color="#6a6a6a"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8561">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8559"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -1.33016 5.597 0 300.7 88.4)" id="linearGradient8551">
|
||||||
|
<stop offset="0" id="stop8547" stop-color="#a9aba9"/>
|
||||||
|
<stop offset="1" id="stop8549" stop-color="#535453"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8525">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8523"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -.56074 .70884 0 300.7 115.6)" id="linearGradient8515">
|
||||||
|
<stop offset="0" id="stop8511" stop-color="#a9aba9"/>
|
||||||
|
<stop offset="1" id="stop8513" stop-color="#818181"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8493">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8491"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -2.39765 2.48247 0 300.7 98.1)" id="linearGradient8483">
|
||||||
|
<stop offset="0" id="stop8479" stop-color="#f2f2f2"/>
|
||||||
|
<stop offset="1" id="stop8481" stop-color="#7a7a7a"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8449">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8447"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8977">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8975"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8951">
|
||||||
|
<path d="M593 101h3.6v3.7H593z" id="path8949"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath8935">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8933"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 .67046 -.32706 0 583.8 126.8)" id="linearGradient8925">
|
||||||
|
<stop offset="0" id="stop8921" stop-color="#757575"/>
|
||||||
|
<stop offset="1" id="stop8923" stop-color="#393939"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8883">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8881"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 12.89405 -17.29507 0 583.7 110)" id="linearGradient8873">
|
||||||
|
<stop offset="0" id="stop8867" stop-color="#6a6a6a"/>
|
||||||
|
<stop offset=".5" id="stop8869" stop-color="#48e400"/>
|
||||||
|
<stop offset="1" id="stop8871" stop-color="#6a6a6a"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8849">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8847"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -1.33884 5.6329 0 583.7 100)" id="linearGradient8839">
|
||||||
|
<stop offset="0" id="stop8835" stop-color="#a9aba9"/>
|
||||||
|
<stop offset="1" id="stop8837" stop-color="#535453"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8813">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8811"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -.56429 .71345 0 583.7 127.4)" id="linearGradient8803">
|
||||||
|
<stop offset="0" id="stop8799" stop-color="#a9aba9"/>
|
||||||
|
<stop offset="1" id="stop8801" stop-color="#818181"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8781">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8779"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -2.41323 2.4988 0 583.7 109.8)" id="linearGradient8771">
|
||||||
|
<stop offset="0" id="stop8767" stop-color="#f2f2f2"/>
|
||||||
|
<stop offset="1" id="stop8769" stop-color="#7a7a7a"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath8737">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path8735"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath9285">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path9283"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath9259">
|
||||||
|
<path d="M852.5 96.3h3.3v3.3h-3.3z" id="path9257"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath9243">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path9241"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 .61565 -.3002 0 844 120)" id="linearGradient9233">
|
||||||
|
<stop offset="0" id="stop9229" stop-color="#757575"/>
|
||||||
|
<stop offset="1" id="stop9231" stop-color="#393939"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath9191">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path9189"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 11.84237 -15.8829 0 844 104.6)" id="linearGradient9181">
|
||||||
|
<stop offset="0" id="stop9175" stop-color="#6a6a6a"/>
|
||||||
|
<stop offset=".5" id="stop9177" stop-color="#48e400"/>
|
||||||
|
<stop offset="1" id="stop9179" stop-color="#6a6a6a"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath9157">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path9155"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -1.22922 5.1724 0 844 95.3)" id="linearGradient9147">
|
||||||
|
<stop offset="0" id="stop9143" stop-color="#a9aba9"/>
|
||||||
|
<stop offset="1" id="stop9145" stop-color="#535453"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath9121">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path9119"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -.51809 .65506 0 844 120.5)" id="linearGradient9111">
|
||||||
|
<stop offset="0" id="stop9107" stop-color="#a9aba9"/>
|
||||||
|
<stop offset="1" id="stop9109" stop-color="#818181"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath9089">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path9087"/>
|
||||||
|
</clipPath>
|
||||||
|
<linearGradient x2="1" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -2.21578 2.29436 0 844 104.3)" id="linearGradient9079">
|
||||||
|
<stop offset="0" id="stop9075" stop-color="#f2f2f2"/>
|
||||||
|
<stop offset="1" id="stop9077" stop-color="#7a7a7a"/>
|
||||||
|
</linearGradient>
|
||||||
|
<clipPath id="clipPath9009">
|
||||||
|
<path d="M0 1145.9h1366V0H0z" id="path9007"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath9041">
|
||||||
|
<path d="M779.5 134.7h16.7v-12.6h-16.7z" id="path9039"/>
|
||||||
|
</clipPath>
|
||||||
|
<clipPath id="clipPath9045">
|
||||||
|
<path d="M779.5 134.7h16.7v-12.6h-16.7z" id="path9043"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
<g id="layer1" transform="translate(0 -268)">
|
||||||
|
<g id="g8999" transform="matrix(.35278 0 0 -.35278 40.2 289.4)">
|
||||||
|
<path d="M0 0h40" id="path9001" fill="none" stroke="#000" stroke-width="2"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9011" transform="matrix(.35278 0 0 -.35278 10.4 271.7)">
|
||||||
|
<path d="M0 0h83a4 4 0 0 0 4-4v-52.5H-4V-4a4 4 0 0 0 4 4" id="path9013" fill="#e6e6e6"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9015" transform="matrix(.35278 0 0 -.35278 10.4 272.3)">
|
||||||
|
<path d="M0 0h83c1.3 0 2.4-1.1 2.4-2.5V-52c0-.9-.6-1.5-1.5-1.5H-1c-.8 0-1.5.6-1.5 1.5v49.5C-2.5-1.1-1.4 0 0 0z" id="path9017" fill="none" stroke="#282828" stroke-width="3"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9019" transform="matrix(.35278 0 0 -.35278 5.8 291.9)">
|
||||||
|
<path d="M0 0h108.8v-1.2a3 3 0 0 0-3-3H3a3 3 0 0 0-3 3z" id="path9021" fill="#626262"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9023" transform="matrix(.35278 0 0 -.35278 21.6 291.9)">
|
||||||
|
<path d="M0 0h19.3c0-.8-.6-1.4-1.4-1.4H1.4C.6-1.4 0-.8 0 0" id="path9025" fill="#818181"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9027" transform="matrix(.35278 0 0 -.35278 45 286.7)">
|
||||||
|
<path d="M0 0l-28-5.4-7.6 39 20 3.9c3.9-2.4 8-4.7 9.4-5.4z" id="path9029" fill="#fff"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9031" transform="matrix(.35278 0 0 -.35278 45.4 287)">
|
||||||
|
<path d="M0 0l-30-5.8-8 41 21.5 4.1c4.7-2.8 10-5.7 10-5.7zm-2.3 1.6l-6 30.7c-1.6.8-5.2 2.8-8.6 4.9l-18.7-3.6 7.2-37 26 5" id="path9033" fill="#303030"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9035" transform="matrix(.35278 0 0 -.35278 -239.7 326.4)">
|
||||||
|
<g id="g9061">
|
||||||
|
<g clip-path="url(#clipPath9041)" id="g9059">
|
||||||
|
<g id="g9057">
|
||||||
|
<g id="g9055">
|
||||||
|
<g clip-path="url(#clipPath9045)" id="g9053">
|
||||||
|
<g aria-label=".uf2" transform="scale(1 -1) rotate(-11 -255.3 -4117.6)" style="-inkscape-font-specification:LEGOChalet60-Bold" id="text9051" font-weight="700" font-size="9" font-family="LEGO Chalet 60" fill="#303030">
|
||||||
|
<path d="M2.4 0H.8v-1.7h1.6z" id="path12451"/>
|
||||||
|
<path d="M7.6 0H6.1v-.5l-.9.5-.8.1Q3.6.1 3-.3q-.4-.5-.4-1.4V-5h1.6v3l.1.4q0 .2.3.3h.9l.5-.2V-5h1.5z" id="path12453"/>
|
||||||
|
<path d="M11.1-5.7H9.7q-.2.2-.2.7h1.3v1.1H9.6V0H8v-3.9h-.7v-1H8v-.2q0-.9.5-1.3Q9-7 10-7h.6l.5.1z" id="path12455"/>
|
||||||
|
<path d="M16 0h-5.2v-1L12-2l1-.8q.5-.5.7-1 .2-.3.2-.7 0-.4-.3-.7-.3-.2-.8-.2l-.9.2-.8.4H11v-1.5l.9-.2 1.2-.2q1.2 0 1.9.5.6.6.6 1.5 0 .6-.3 1.2-.3.5-1 1.1l-.7.7-.6.4h3z" id="path12457"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(.35278 0 0 -.35278 -239.7 326.4)" id="g9063">
|
||||||
|
<g id="g9065">
|
||||||
|
<g id="g9071">
|
||||||
|
<g id="g9073">
|
||||||
|
<path d="M829.4 131.8a.5.5 0 0 1-.5-.6v-28c0-.3.2-.6.5-.6h29.1c.3 0 .6.3.6.6v28c0 .3-.3.6-.6.6z" id="path9081" fill="url(#linearGradient9079)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(.35278 0 0 -.35278 -239.7 326.4)" id="g9083">
|
||||||
|
<g id="g9085" clip-path="url(#clipPath9089)">
|
||||||
|
<g id="g9091" transform="translate(831.1 105.6)">
|
||||||
|
<path d="M0 0h25.7c.3 0 .6-.2.6-.5V-11c0-.3-.3-.6-.6-.6H0c-.3 0-.5.3-.5.6V-.5c0 .3.2.5.5.5" id="path9093" fill="#f2f2f2"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(.35278 0 0 -.35278 -239.7 326.4)" id="g9095">
|
||||||
|
<g id="g9097">
|
||||||
|
<g id="g9103">
|
||||||
|
<g id="g9105">
|
||||||
|
<path d="M830.9 140.4a.5.5 0 0 1-.6-.5v-20.5c0-.3.3-.6.6-.6H857c.3 0 .5.3.5.6v20.5c0 .3-.2.5-.5.5z" id="path9113" fill="url(#linearGradient9111)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(.35278 0 0 -.35278 -239.7 326.4)" id="g9115">
|
||||||
|
<g id="g9117" clip-path="url(#clipPath9121)">
|
||||||
|
<g id="g9123" transform="translate(833.9 137.6)">
|
||||||
|
<path d="M0 0h20.3c.6 0 1-.5 1-1v-11.4c0-.6-.4-1-1-1H0a1 1 0 0 0-1 1V-1c0 .5.4 1 1 1" id="path9125" fill="#393939"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9127" transform="translate(835.4 137)">
|
||||||
|
<path d="M0 0h17.2c.5 0 .8-.3.8-.7v-11c0-.5-.3-.8-.8-.8H0c-.4 0-.7.3-.7.8v11c0 .4.3.7.7.7" id="path9129" fill="#98b6a7"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(.35278 0 0 -.35278 -239.7 326.4)" id="g9131">
|
||||||
|
<g id="g9133">
|
||||||
|
<g id="g9139">
|
||||||
|
<g id="g9141">
|
||||||
|
<path d="M830.6 100.4v-5.8c0-.3.2-.5.5-.5h25.7c.3 0 .6.2.6.5v5.8z" id="path9149" fill="url(#linearGradient9147)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(.35278 0 0 -.35278 -239.7 326.4)" id="g9151">
|
||||||
|
<g id="g9153" clip-path="url(#clipPath9157)">
|
||||||
|
<g id="g9159" transform="translate(842.2 103.9)">
|
||||||
|
<path d="M0 0l-3.9 3.9v.5h-1a2.3 2.3 0 1 0 0 4.5h1v.5l3.9 4h3.8c1.7-1.9 3.9-4 3.9-4V9h.8a2.3 2.3 0 0 0 0-4.5h-.8V4L3.8 0z" id="path9161" fill="#6a6a6a"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(.35278 0 0 -.35278 -239.7 326.4)" id="g9163">
|
||||||
|
<g id="g9165">
|
||||||
|
<g id="g9171">
|
||||||
|
<g id="g9173">
|
||||||
|
<path d="M842.1 117.2l-3.8-3.9v-.5h-1a2.3 2.3 0 1 1 0-4.5h1v-.5l3.9-3.9h3.8l3.8 3.9v.5h1c1.1 0 2 1 2.1 2.2 0 1.2-1 2.3-2.2 2.3h-.9v.6l-3.8 3.8z" id="path9183" fill="url(#linearGradient9181)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(.35278 0 0 -.35278 -239.7 326.4)" id="g9185">
|
||||||
|
<g id="g9187" clip-path="url(#clipPath9191)">
|
||||||
|
<g id="g9193" transform="translate(837.3 112.3)">
|
||||||
|
<path d="M0 0h2.8v-3.4H0A1.7 1.7 0 0 0 0 0" id="path9195" fill="#a9aba9"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9197" transform="translate(850.7 109)">
|
||||||
|
<path d="M0 0h-2.8v3.4H0A1.7 1.7 0 0 0 0 0" id="path9199" fill="#a9aba9"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9201" transform="translate(842.4 112.3)">
|
||||||
|
<path d="M0 0h3.3v-3.3H-.1V0H0" id="path9203" fill="#393939"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9205" transform="translate(842.3 116.6)">
|
||||||
|
<path d="M0 0h3.5L6-2.6 5-3.7v-2H4v1.2c0 .4-.4.8-.8.8h-3a.7.7 0 0 1-.7-.7v-1.3h-1v2l-1.1 1z" id="path9207" fill="#a9aba9"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9209" transform="translate(845.8 104.6)">
|
||||||
|
<path d="M0 0h-3.5L-6 2.7l1.1 1v2h1V4.6c0-.5.4-.9.8-.9h3a.7.7 0 0 1 .8.7v1.3h1v-2l1-1z" id="path9211" fill="#a9aba9"/>
|
||||||
|
</g>
|
||||||
|
<path d="M843.6 124.1h.8v-3.7h-.8z" id="path9213" fill="#393939"/>
|
||||||
|
<path d="M843.6 120.5h.8V119h-.8z" id="path9215" fill="#9b9b9b"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(.35278 0 0 -.35278 -239.7 326.4)" id="g9217">
|
||||||
|
<g id="g9219">
|
||||||
|
<g id="g9225">
|
||||||
|
<g id="g9227">
|
||||||
|
<path d="M843.6 118.8h.8v1.7h-.8z" id="path9235" fill="url(#linearGradient9233)"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(.35278 0 0 -.35278 -239.7 326.4)" id="g9237">
|
||||||
|
<g id="g9239" clip-path="url(#clipPath9243)">
|
||||||
|
<path d="M843.6 118.8h.8v-1.6h-.8z" id="path9245" fill="#818181"/>
|
||||||
|
<g id="g9247" transform="translate(832.5 118.8)">
|
||||||
|
<path d="M0 0h6.5v-1.6L4.8-3.2H.5c-.3 0-.5.3-.5.6z" id="path9249" fill="#a9aba9"/>
|
||||||
|
</g>
|
||||||
|
<path d="M852.5 99.6h3.3v-3.3h-3.3z" id="path9251" fill="#fff"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(.35278 0 0 -.35278 -239.7 326.4)" id="g9253">
|
||||||
|
<g id="g9255" clip-path="url(#clipPath9259)">
|
||||||
|
<g id="g9261" transform="translate(855.6 98.2)">
|
||||||
|
<path d="M0 0v-.3C-.3-.7-.4-1-.7-1-.9-1-1-1-1-.8a.5.5 0 0 0-.5-.2l-.3.1h-.8l-.3.1c0 .4.2.6.3 1h.5l.4.2.3-.1h.6V.2h.1l.4.2.2-.1V0m-3-2H.2v3.4H-3z" id="path9263" fill="#fe0"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9265" transform="translate(855.7 98.1)">
|
||||||
|
<path d="M0 0l-.1-.4C-.2-.7-.5-1-.7-1c-.2 0-.3 0-.4.2a.6.6 0 0 0-.4-.2l-.3.1a.6.6 0 0 0-.3 0h-.6c-.2 0-.4 0-.4.3l.3.9.4.2.2-.1.4.1h.6l.4-.1h.7L0 0m-3.2-1.8H.1v3.3h-3.3z" id="path9267" fill="#d52715"/>
|
||||||
|
</g>
|
||||||
|
<path d="M855.8 96.3h-3.3v3.3h3.3zm-3.3 0h3.3v3.3h-3.3z" id="path9269" fill="#171714"/>
|
||||||
|
<g id="g9271" transform="translate(855.7 98.7)">
|
||||||
|
<path d="M0 0v-.2.2m0 0v-.1m0 0zm0 0z" id="path9273" fill="#171714"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9275" transform="translate(855.3 98.2)">
|
||||||
|
<path d="M0 0l-.2-.5h-.1c0 .2 0 .4.2.5H0m.2-.1L.1-.6l-.4-.2c-.1 0-.3 0-.3.2l.1.5c.1.2.2.4.5.4s.3-.3.2-.4m-1 .2l-.3-.6.2.1v.1l.1.1c.2 0 .2-.1.2-.2 0-.2-.2-.4-.5-.4-.1 0-.2 0-.2.2V0c.2.2.3.4.6.4.1 0 .2 0 .2-.2L-.6 0s-.2 0-.1.1m-1-.4v-.1h.3c0-.2-.2-.3-.3-.3-.1 0-.2 0-.3.2l.2.7.4.2.2-.1c0-.1 0-.2-.2-.2l-.2-.1.3-.1c0-.2-.2-.2-.3-.1m-.6-.2h.2c0-.3-.2-.3-.3-.3 0 0-.2 0-.2.2 0 .3.2.5.3.8h.2c0-.2 0-.5-.2-.7M0 .4C-.2.4-.3.4-.4.2c-.1.2-.2.2-.4.2L-1 .3l-.3.1c-.1 0-.3 0-.4-.2v.1h-.5l-.3-1s.1-.2.3-.2l.3.1.3-.1.3.1.3-.1c.2 0 .3 0 .4.2l.4-.2c.3 0 .5.2.6.6V0a.3.3 0 0 1-.3.4" id="path9277" fill="#171714"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<g transform="matrix(.35278 0 0 -.35278 -239.7 326.4)" id="g9279">
|
||||||
|
<g id="g9281" clip-path="url(#clipPath9285)">
|
||||||
|
<g id="g9287" transform="translate(838.7 98.2)">
|
||||||
|
<path d="M0 0v-.3h-.5l-.1-.1v-.4H0v-.3h-1v.2h-.4v-.6h2V.4h-2v-.5h.4V0h1z" id="path9289" fill="#f2f2f2"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9291" transform="translate(836.9 98.7)">
|
||||||
|
<path d="M0 0h-.4l-.2-.1-.5-1.2-.6 1.2-.1.1h-.5v-.1l.8-1.8.2-.1h.5l.9 2H0" id="path9293" fill="#f2f2f2"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9295" transform="translate(834.2 97.9)">
|
||||||
|
<path d="M0 0h.1v-.4h-1.5v-.4H0L.1-1v-.3H-2v2h2V.3h-1.5V0z" id="path9297" fill="#f2f2f2"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9299" transform="translate(820.8 131.1)">
|
||||||
|
<path d="M0 0l-1.9-2.9 7.3-1C4.3 1.3 4 1.7 3.4 5.2l-2-3a39.5 39.5 0 0 1-4.1 3.2c-1.4.8-3 1.3-4.7 1.5-2.1 0-4.3-.2-6.4-.8l.1-3.3C-9 4.8-3.5 3.8 0 0" id="path9301" fill="#303030"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9303" transform="translate(767 107.4)">
|
||||||
|
<path d="M0 0c1.6 2.3 3.8 4 6.4 5" id="path9305" fill="none" stroke="#303030"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9307" transform="translate(766.2 110.4)">
|
||||||
|
<path d="M0 0c1.6 2.3 3.8 4 6.4 5" id="path9309" fill="none" stroke="#303030"/>
|
||||||
|
</g>
|
||||||
|
<g id="g9311" transform="translate(765.6 113.3)">
|
||||||
|
<path d="M0 0c1.6 2.3 3.8 4 6.4 5" id="path9313" fill="none" stroke="#303030"/>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 17 KiB |
4
docs/static/filelogo.svg
vendored
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
|
||||||
|
<path fill="#aa278f" d="M32 15.994v-.011c0-.108-.005-.209-.016-.303h-.001c-.032-.285-.112-.504-.239-.656-.171-.204-.459-.435-.864-.691a4.275 4.275 0 0 1-.986-.827c-.252-.296-.442-.734-.57-1.316-.049-.227-.087-.719-.112-1.473V8.696c0-.38-.031-.723-.076-1.049a12.313 12.313 0 0 0-.004-.188c-.009-.782-.18-1.475-.513-2.078a3.462 3.462 0 0 0-1.416-1.401c-.611-.33-1.305-.495-2.081-.495H6.271s-.674.067-.962.201a4.021 4.021 0 0 0-.521.295 3.502 3.502 0 0 0-.798.59c-.693.688-1.061 1.601-1.113 2.734a9.172 9.172 0 0 0-.088 1.283v2.558a6.802 6.802 0 0 1-.183 1.373 2.311 2.311 0 0 1-.532 1.033 2.67 2.67 0 0 0-.202.196c-.265.238-.638.511-1.13.823-.404.262-.64.633-.715 1.108l-.002.023a2.195 2.195 0 0 0-.023.287L0 16.006v.011c0 .108.005.209.016.303h.001c.032.285.112.504.239.656.171.204.459.435.864.691.406.256.735.532.986.827.252.296.442.734.57 1.316.049.227.087.719.112 1.473v2.019c0 .38.031.723.076 1.049l.004.188c.009.782.18 1.475.513 2.078a3.462 3.462 0 0 0 1.416 1.401c.611.33 1.305.495 2.081.495H25.73c.35 0 .673-.067.961-.201.184-.085.356-.187.521-.296.291-.159.559-.353.798-.59.693-.688 1.061-1.601 1.113-2.734.056-.398.088-.823.088-1.283v-2.558c.019-.495.079-.953.183-1.373.104-.419.282-.762.532-1.033a2.67 2.67 0 0 0 .202-.196c.265-.238.638-.511 1.13-.823.404-.262.64-.633.715-1.108h.002l.002-.023c.013-.092.022-.187.023-.287v-.014z"/>
|
||||||
|
<path fill="#fff" d="M27.366 16.522l.819-.518-.821-.516a4.547 4.547 0 0 1-.927-.744 3.033 3.033 0 0 1-.554-.896 5.166 5.166 0 0 1-.328-1.339 16.319 16.319 0 0 1-.103-1.961c0-.781-.016-1.365-.05-1.786-.039-.489-.123-.852-.258-1.112a1.36 1.36 0 0 0-.718-.661c-.223-.089-.527-.154-.924-.199a.532.532 0 0 1-.356-.213c-.11-.133-.165-.344-.165-.627 0-.41.086-.811 1.121-.811.636 0 1.196.127 1.666.376.464.247.818.589 1.085 1.046.267.458.406.995.413 1.597.064 3.554.129 4.265.184 4.492.153.63.382 1.109.701 1.464.287.319.635.602 1.035.843.29.175.501.341.627.493.035.043.116.181.116.554 0 .383-.12.628-.39.794-.606.373-1.041.699-1.331.997a2.734 2.734 0 0 0-.678 1.24c-.112.437-.177 1.05-.198 1.875-.02.773-.042 1.741-.066 2.904-.021.941-.306 1.668-.873 2.222-.568.554-1.317.823-2.291.823-.409 0-.71-.077-.895-.23-.155-.128-.226-.32-.226-.604 0-.179.03-.336.093-.479a.682.682 0 0 1 .188-.268.463.463 0 0 1 .24-.094c.414-.055.725-.127.951-.219.317-.131.567-.378.723-.716.124-.269.2-.625.233-1.089.029-.402.044-.968.044-1.725.016-1.061.077-1.896.182-2.481.095-.53.274-.987.533-1.359.261-.375.665-.736 1.198-1.073zm-16.618 6.519h10.458a.75.75 0 0 0 .751-.751l-.001-3.709c-.134-.449-.518-.492-.878-.15-.033 0-.393.443-1.22.443a2.033 2.033 0 0 1-1.944-1.715h-.011a6.59 6.59 0 0 1 0-.526h.011a2.03 2.03 0 0 1 1.944-1.715c.827 0 1.187.443 1.22.443.35.332.738.252.879-.147l.001-3.432a.769.769 0 0 0-.562-.741c-.061.016-3.259 0-3.259 0-.786.065-1.063-.466-.624-.928 0-.033.443-.393.443-1.22a2.033 2.033 0 0 0-1.715-1.944v-.011a6.59 6.59 0 0 0-.526 0v.011A2.03 2.03 0 0 0 14 8.893c0 .827.443 1.187.443 1.22.439.462.254.97-.624.928 0 0-3.198.016-3.259 0a.77.77 0 0 0-.562.741V22.29a.75.75 0 0 0 .75.751zm-6.197-3.692c.055.227.12.938.184 4.492.007.602.146 1.138.413 1.597.267.458.622.8 1.085 1.046.47.25 1.03.376 1.666.376 1.035 0 1.121-.4 1.121-.811 0-.283-.056-.493-.165-.627a.537.537 0 0 0-.356-.213c-.397-.045-.701-.11-.925-.199a1.367 1.367 0 0 1-.718-.661c-.135-.259-.219-.623-.258-1.112a24.159 24.159 0 0 1-.05-1.786c0-.751-.035-1.41-.103-1.961a5.174 5.174 0 0 0-.329-1.339 3.028 3.028 0 0 0-.554-.896 4.52 4.52 0 0 0-.927-.744l-.821-.516.819-.518c.533-.337.936-.698 1.199-1.075.259-.372.438-.829.533-1.359.105-.585.166-1.419.182-2.481 0-.757.014-1.323.044-1.725.033-.464.109-.82.233-1.089.156-.337.406-.584.723-.715.226-.092.537-.163.951-.219a.463.463 0 0 0 .24-.094.662.662 0 0 0 .189-.267 1.18 1.18 0 0 0 .093-.479c0-.284-.072-.476-.226-.604-.186-.153-.487-.23-.895-.23-.974 0-1.723.269-2.291.823-.567.554-.852 1.281-.873 2.222a588.806 588.806 0 0 1-.065 2.904c-.021.825-.086 1.438-.198 1.875a2.731 2.731 0 0 1-.679 1.24c-.289.298-.725.624-1.331.997-.27.166-.39.41-.39.794 0 .373.081.511.116.554.127.153.338.319.627.493.4.24.748.524 1.035.843.319.355.548.834.701 1.464z"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.1 KiB |
BIN
docs/static/hero.png
vendored
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 585 KiB |
209
docs/static/lego-logo-white.svg
vendored
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
<?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"
|
||||||
|
id="svg10"
|
||||||
|
width="236.9"
|
||||||
|
height="56.7"
|
||||||
|
version="1.1"
|
||||||
|
sodipodi:docname="lego-logo-white.svg"
|
||||||
|
inkscape:export-filename="C:\gh\pxt-ev3\docs\static\lego_education_logo_white.png"
|
||||||
|
inkscape:export-xdpi="138.33701"
|
||||||
|
inkscape:export-ydpi="138.33701"
|
||||||
|
inkscape:version="0.92.1 r15371">
|
||||||
|
<metadata
|
||||||
|
id="metadata54">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</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="namedview52"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:zoom="4.8374843"
|
||||||
|
inkscape:cx="118.45"
|
||||||
|
inkscape:cy="28.35"
|
||||||
|
inkscape:window-x="-8"
|
||||||
|
inkscape:window-y="-8"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg10" />
|
||||||
|
<defs
|
||||||
|
id="defs14">
|
||||||
|
<clipPath
|
||||||
|
id="clipPath26">
|
||||||
|
<path
|
||||||
|
d="M332 275.6h177.7v42.5H332z"
|
||||||
|
id="path24" />
|
||||||
|
</clipPath>
|
||||||
|
<clipPath
|
||||||
|
id="clipPath76">
|
||||||
|
<path
|
||||||
|
d="M332 275.6h177.7v42.5H332z"
|
||||||
|
id="path74" />
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="g18"
|
||||||
|
transform="matrix(1.33333 0 0 -1.33333 0 56.7)"
|
||||||
|
inkscape:export-xdpi="138.33701"
|
||||||
|
inkscape:export-ydpi="138.33701">
|
||||||
|
<g
|
||||||
|
id="g130"
|
||||||
|
transform="translate(-332 -275.6)">
|
||||||
|
<g
|
||||||
|
id="g20">
|
||||||
|
<g
|
||||||
|
clip-path="url(#clipPath26)"
|
||||||
|
id="g22">
|
||||||
|
<g
|
||||||
|
transform="translate(387.6 297.7)"
|
||||||
|
id="g28">
|
||||||
|
<path
|
||||||
|
id="path30"
|
||||||
|
d="M0 0h6.3c0 1.4-.2 2.2-.5 2.6-.4.3-1.3.5-2.7.5C1.7 3 .8 2.9.5 2.5.2 2 0 1.3 0 0m6.3-4.1h3.4c0-2-.6-3.3-1.8-4-.8-.4-2.4-.6-4.8-.6-2.6 0-4.4.5-5.3 1.6-.8 1-1.2 2.8-1.2 5.5S-3 3-2.2 4C-1.4 5.1.4 5.7 3 5.7 6 5.7 7.8 5 8.6 4c.7-1 1.1-3 1.1-6.2H0c0-1.7.1-2.7.4-3.2.4-.6 1.3-.8 2.7-.8 1.2 0 2 0 2.3.2.6.3 1 .9 1 1.8"
|
||||||
|
fill="#fff" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(406.4 300.7)"
|
||||||
|
id="g32">
|
||||||
|
<path
|
||||||
|
id="path34"
|
||||||
|
d="M0 0c-1.4 0-2.2-.4-2.6-1.1a7 7 0 0 1-.5-3c0-2 .2-3.3.4-3.8.4-.9 1.3-1.3 2.7-1.3 1.6 0 2.6.4 3 1.2.3.6.4 1.8.4 3.8a7 7 0 0 1-.5 3.1C2.4-.4 1.5 0 0 0m3.4-11.7v2.2C2.7-11 1.2-11.8-1-11.8c-2.4 0-4 .7-4.7 2.2-.5 1-.7 2.7-.7 5.4 0 2.3.3 4 .9 5C-4.8 2-3.3 2.5-1 2.5s3.7-.7 4.2-2h.2v7.9h3.3v-20.2z"
|
||||||
|
fill="#fff" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(428.8 289)"
|
||||||
|
id="g36">
|
||||||
|
<path
|
||||||
|
id="path38"
|
||||||
|
d="M0 0h-3.3v2.2C-4 .6-5.6-.1-7.9-.1c-3.2 0-4.8 1.3-4.8 4v10.2h3.4V5.2c0-1 .1-1.8.4-2.1.3-.4 1-.7 2-.7 1.2 0 2.1.3 2.6.9.5.5.8 1.4.8 2.7v8H0z"
|
||||||
|
fill="#fff" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(441 294.4)"
|
||||||
|
id="g40">
|
||||||
|
<path
|
||||||
|
id="path42"
|
||||||
|
d="M0 0h3.4c0-2.3-.5-3.8-1.6-4.6-.8-.6-2.4-1-4.8-1-2.7 0-4.4.6-5.2 1.7-.8 1-1.1 2.8-1.1 5.6 0 2.7.3 4.5 1 5.4C-7.3 8.3-5.6 9-3 9c2.3 0 3.9-.3 4.8-1 1-.6 1.6-2 1.6-4.1H0c0 1-.2 1.8-.7 2-.4.4-1.2.5-2.3.5-1.4 0-2.3-.3-2.6-1-.2-.5-.4-1.7-.4-3.6 0-2 .1-3.2.4-3.6.3-.7 1.2-1 2.6-1 1.3 0 2 .1 2.4.5.4.3.6 1.1.6 2.4"
|
||||||
|
fill="#fff" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(452.8 295.4)"
|
||||||
|
id="g44">
|
||||||
|
<path
|
||||||
|
id="path46"
|
||||||
|
d="M0 0c-1.1 0-1.8 0-2.2-.2-.6-.3-1-1-1-1.8 0-1 .3-1.6.8-1.8.4-.3 1.2-.4 2.4-.4 1.1 0 1.8.1 2.2.3.6.3 1 1 1 1.9 0 .9-.4 1.4-1 1.7A6 6 0 0 1 0 0m3.1-6.3l.1 1.7c-.3-.8-1-1.3-1.9-1.6-.5-.2-1.4-.3-2.5-.3-1.8 0-3.1.3-4 .9C-6-5-6.4-3.8-6.4-2-6.5-.3-6 .8-5 1.5c.7.5 2 .8 3.8.8 1.1 0 2 0 2.5-.2C2 1.8 2.7 1.4 3 .7h.1v1.8c0 1.2-.1 2-.4 2.4-.4.5-1.3.7-2.6.7-.9 0-1.5 0-1.9-.3-.5-.3-.7-.8-.7-1.7H-6c0 1.9.6 3.1 1.8 3.7.8.4 2.2.6 4.2.6 2.4 0 4-.3 4.9-1 1-.7 1.5-2.2 1.5-4.4v-8.8z"
|
||||||
|
fill="#fff" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(460.9 300.6)"
|
||||||
|
id="g48">
|
||||||
|
<path
|
||||||
|
id="path50"
|
||||||
|
d="M0 0v2.6h1.8v3.2H5V2.6h5.5V0H5v-7.2c0-.7 0-1.2.2-1.4.2-.3.6-.5 1.3-.5.8 0 1.3.3 1.5 1l.2 2h3c0-2-.3-3.4-.8-4.2-.7-.9-2-1.4-3.9-1.4-1.8 0-3 .3-3.7.9-.8.6-1.1 1.8-1.1 3.6V0z"
|
||||||
|
fill="#fff" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
id="path52"
|
||||||
|
d="M478.2 289h-3.4v14.2h3.4zm0 17.3h-3.4v3h3.4z"
|
||||||
|
fill="#fff" />
|
||||||
|
<g
|
||||||
|
transform="translate(487.5 300.7)"
|
||||||
|
id="g54">
|
||||||
|
<path
|
||||||
|
id="path56"
|
||||||
|
d="M0 0c-1.4 0-2.4-.3-2.8-1-.3-.4-.5-1.7-.5-3.6 0-2 .2-3.2.5-3.7.4-.6 1.3-1 2.8-1 1.5 0 2.4.4 2.8 1 .3.5.5 1.7.5 3.7S3-1.4 2.8-1C2.4-.3 1.5 0 0 0m0 2.6C2.8 2.6 4.7 2 5.5 1c.8-.9 1.1-2.7 1.1-5.6 0-2.9-.3-4.8-1-5.6-1-1-2.8-1.6-5.6-1.6s-4.7.5-5.5 1.6c-.8.8-1.1 2.7-1.1 5.6 0 2.9.3 4.7 1 5.6 1 1 2.8 1.6 5.6 1.6"
|
||||||
|
fill="#fff" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(497 303.2)"
|
||||||
|
id="g58">
|
||||||
|
<path
|
||||||
|
id="path60"
|
||||||
|
d="M0 0h3.4v-2.1A3 3 0 0 0 5.3-.2C6 0 6.7 0 8 0c1.8 0 3-.3 3.8-1 .7-.9 1-2.1 1-4v-9H9.4v9c0 1-.2 1.7-.6 2-.3.5-1 .7-2 .7-1.4 0-2.4-.4-2.8-1-.4-.6-.6-1.5-.6-3V-14H0z"
|
||||||
|
fill="#fff" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
id="path62"
|
||||||
|
d="M384.5 316.4h125.2v1.7H384.5z"
|
||||||
|
fill="#006cb6" />
|
||||||
|
<path
|
||||||
|
id="path64"
|
||||||
|
d="M384.5 275.6H471v1.7h-86.5z"
|
||||||
|
fill="#006cb6" />
|
||||||
|
<path
|
||||||
|
id="path66"
|
||||||
|
d="M482.3 275.6h27.4v1.7h-27.4z"
|
||||||
|
fill="#006cb6" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
id="path68"
|
||||||
|
d="M332.3 275.9h42v42h-42z"
|
||||||
|
fill="#fff" />
|
||||||
|
<g
|
||||||
|
id="g70">
|
||||||
|
<g
|
||||||
|
clip-path="url(#clipPath76)"
|
||||||
|
id="g72">
|
||||||
|
<g
|
||||||
|
transform="translate(371.5 300.4)"
|
||||||
|
id="g78">
|
||||||
|
<path
|
||||||
|
id="path80"
|
||||||
|
d="M0 0c0-1.3-.5-3-.9-4C-2.3-8.4-4-11.1-8-11.1c-1.2 0-3.2.3-4 2.4l-.2.5-.3-.5a6.5 6.5 0 0 0-5-2.4c-1.6 0-2.8.5-3.6 1.4l-.2.3-.2-.3c-.8-.9-2.3-1.4-4-1.4-1.4 0-2.5.4-3.3 1.3l-.2.2-.2-.2c-.8-.9-2.2-1.3-3.9-1.3-2 0-3.2 1.2-3.3 3 0 3 2.7 9 3.9 10.8a3.4 3.4 0 0 0 3.1 1.8c1 0 1.6-.2 2-.6.3-.4.4-.7.4-1.4v-1l.5.9c1.2 2 3.3 2.2 5.3 2.2 1.3 0 2.6-.5 3-1.3l.2-.3.3.2a6 6 0 0 0 4 1.4c1.8 0 3.1-.5 3.9-1.3l.4-.7.2-.4.3.3c1.1 1.4 2.6 2 4.5 2 1.5 0 2.6-.4 3.4-1.2C0 2.3 0 1 0 0m-39.2-24.5h42v42h-42z"
|
||||||
|
fill="#ffed00" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(372.7 298.8)"
|
||||||
|
id="g82">
|
||||||
|
<path
|
||||||
|
id="path84"
|
||||||
|
d="M0 0a24 24 0 0 0-1.8-5.5c-1.4-3-3.4-5.3-7.2-5.3-2 0-3.7.6-4.7 1.8a7.6 7.6 0 0 0-5-1.9 6 6 0 0 0-3.8 1.2 7.3 7.3 0 0 0-7.7 0 7 7 0 0 0-4-1.1C-37-10.8-39-9-39-6.5c0 3.3 2.7 9.4 4 11.5a5 5 0 0 0 4.4 2.4c2 0 2.7-.5 3-1.3 1.6 1.4 3.6 1.4 5 1.4 1.7 0 2.7-.4 3.5-1 1.2.6 2.6 1 4.2 1 2 0 3.6-.5 4.7-1.5a7 7 0 0 0 4.6 1.5c2.3 0 3.8-.9 4.7-2.1C.5 3.6.2 1.9 0 0m-40.3-22.9h42v42h-42z"
|
||||||
|
fill="#e20614" />
|
||||||
|
</g>
|
||||||
|
<path
|
||||||
|
id="path86"
|
||||||
|
d="M374 276.2h-41.4v41.3H374zm-42-.6h42.6v42.5H332z"
|
||||||
|
fill="#1c1c1b" />
|
||||||
|
<g
|
||||||
|
transform="translate(372.7 306.3)"
|
||||||
|
id="g88">
|
||||||
|
<path
|
||||||
|
id="path90"
|
||||||
|
d="M0 0a1 1 0 0 1-1-1c0-.6.4-1 1-1s1 .4 1 1C1-.5.6 0 0 0m0-.2a.8.8 0 1 0 0-1.6.8.8 0 0 0 0 1.6m.5-1.4l-.1.3-.2.2.3.3c0 .2-.2.3-.4.3h-.5v-1h.2v.4H0l.2-.3v-.2zm-.7.7v.2H0l.2-.1L0-.9z"
|
||||||
|
fill="#1c1c1b" />
|
||||||
|
</g>
|
||||||
|
<g
|
||||||
|
transform="translate(367.4 300.5)"
|
||||||
|
id="g92">
|
||||||
|
<path
|
||||||
|
id="path94"
|
||||||
|
d="M0 0c0-1-1.6-5.4-2.2-6.4-.2-.4-.5-.7-1-.7s-.6.3-.7.6c0 1 1.8 6 2.4 6.7.3.4.6.5 1 .5C0 .7 0 .3 0 0m2.9-1.8c-.4-1.8-1.2-3.9-2-5.5-1.5-2.6-3.2-3-4.8-3-1.5 0-3.2.7-3.2 3 0 1.7.7 4 1.3 5.7 1 2.8 2.2 5.1 5.7 5 4 0 3.3-3.6 3-5.2m-13 2.5c-.5 0-.9-.3-1.2-.7-.6-1-2-4.5-2.2-6-.1-1 .3-1.1.8-1.1.7 0 1.6.8 1.9 2.1 0 0-1.5 0-1 1.3.3 1.3 1 1.5 2.2 1.6 2.4 0 2.2-1.7 2-2.6-.6-3-2.8-5.5-5.9-5.5-2 0-3.4 1.1-3.4 3.3 0 1.5.8 3.9 1.4 5.3 1.3 3 2.6 5 6 5 2 0 3.7-.7 3.5-2.6-.2-1.4-1-2.2-2.2-2.3-.4 0-1.8 0-1.3 1.4.1.5.2.8-.5.8m-10.7-5.2l-.6-2a7 7 0 0 0 2 .2c1.1 0 1.8-.4 1.8-1.3 0-2-2.3-2.6-3.9-2.6-1.7 0-3.2 1-3.2 2.8A21 21 0 0 0-22.3.4c1.4 2.8 2.8 3.1 5.2 3.1 1.1 0 2.3-.4 2.3-1.4 0-1.4-1.2-2-2.3-2H-19s-.4-.6-.8-1.7c2.2.3 3.1-.2 2.8-1.5-.5-1.7-2-1.8-3.8-1.4m-7-2c2.2.4 2.7-.4 2.6-1.1-.2-2.2-2.1-2.6-3.8-2.6-1.2 0-2.3.6-2.4 2 0 2.5 2.5 8.3 3.7 10.2.6 1 1.3 1.4 2.3 1.4 1 0 1.3-.5 1.3-1.1 0-1.7-2.8-6.8-3.6-8.8M-.3 4.7a6 6 0 0 1-4.7-2l-.5.7c-.9 1-2.2 1.4-4 1.4-1.8 0-3.3-.6-4.3-1.4-.5.8-1.8 1.4-3.3 1.4-2 0-4.2-.3-5.5-2.4 0 .8-.1 1.2-.5 1.6-.6.6-1.4.7-2.2.7-1.5 0-2.6-.6-3.4-2-1.1-1.8-4-7.9-3.9-10.8 0-2 1.3-3.3 3.6-3.4 1.8 0 3.2.5 4.1 1.4.8-.9 2-1.4 3.5-1.4 1.6 0 3.2.5 4.2 1.6.8-1 2.1-1.6 3.8-1.6 2.1 0 4 1 5.2 2.6.7-1.9 2.4-2.6 4.3-2.6 4.1 0 6 2.8 7.4 7.3.4 1 .8 2.7.9 4.1.1 2.4-.9 4.8-4.7 4.8"
|
||||||
|
fill="#1c1c1b" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 9.6 KiB |
BIN
docs/static/lego_education_logo_white.png
vendored
Normal file
After Width: | Height: | Size: 9.1 KiB |
BIN
docs/static/lessons/line-detection.jpg
vendored
Normal file
After Width: | Height: | Size: 25 KiB |
BIN
docs/static/lessons/line-detection/car-driving.jpg
vendored
Normal file
After Width: | Height: | Size: 68 KiB |
BIN
docs/static/lessons/line-detection/color-sensor-driving.jpg
vendored
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
docs/static/lessons/make-it-move.jpg
vendored
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
docs/static/lessons/make-it-move/locomotion-no-wheels.jpg
vendored
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
docs/static/lessons/make-it-move/walker-bot.jpg
vendored
Normal file
After Width: | Height: | Size: 26 KiB |
@ -77,7 +77,7 @@ export function deployCoreAsync(resp: pxtc.CompileResult, isCli = false) {
|
|||||||
let rbfBIN = pxt.U.fromHex(rbfHex)
|
let rbfBIN = pxt.U.fromHex(rbfHex)
|
||||||
pxt.HF2.write16(rbfBIN, 4, rbfBIN.length)
|
pxt.HF2.write16(rbfBIN, 4, rbfBIN.length)
|
||||||
|
|
||||||
let origElfUF2 = UF2.parseFile(pxt.U.stringToUint8Array(atob(resp.outfiles[pxt.outputName()])))
|
let origElfUF2 = UF2.parseFile(pxt.U.stringToUint8Array(ts.pxtc.decodeBase64(resp.outfiles[pxt.outputName()])))
|
||||||
|
|
||||||
let mkFile = (ext: string, data: Uint8Array = null) => {
|
let mkFile = (ext: string, data: Uint8Array = null) => {
|
||||||
let f = UF2.newBlockFile()
|
let f = UF2.newBlockFile()
|
||||||
|
@ -4,8 +4,9 @@
|
|||||||
import { deployCoreAsync, initAsync } from "./deploy";
|
import { deployCoreAsync, initAsync } from "./deploy";
|
||||||
import { FieldPorts } from "./field_ports";
|
import { FieldPorts } from "./field_ports";
|
||||||
import { FieldImages } from "./field_images";
|
import { FieldImages } from "./field_images";
|
||||||
import {FieldSpeed} from "./field_speed";
|
import { FieldSpeed } from "./field_speed";
|
||||||
import { FieldBrickButtons } from "./field_brickbuttons";
|
import { FieldBrickButtons } from "./field_brickbuttons";
|
||||||
|
import { FieldTurnRatio } from "./field_turnratio";
|
||||||
|
|
||||||
pxt.editor.initExtensionsAsync = function (opts: pxt.editor.ExtensionOptions): Promise<pxt.editor.ExtensionResult> {
|
pxt.editor.initExtensionsAsync = function (opts: pxt.editor.ExtensionOptions): Promise<pxt.editor.ExtensionResult> {
|
||||||
pxt.debug('loading pxt-ev3 target extensions...')
|
pxt.debug('loading pxt-ev3 target extensions...')
|
||||||
@ -23,8 +24,99 @@ pxt.editor.initExtensionsAsync = function (opts: pxt.editor.ExtensionOptions): P
|
|||||||
}, {
|
}, {
|
||||||
selector: "brickbuttons",
|
selector: "brickbuttons",
|
||||||
editor: FieldBrickButtons
|
editor: FieldBrickButtons
|
||||||
|
}, {
|
||||||
|
selector: "turnratio",
|
||||||
|
editor: FieldTurnRatio
|
||||||
}],
|
}],
|
||||||
deployCoreAsync
|
deployCoreAsync,
|
||||||
|
showUploadInstructionsAsync: (fn: string, url: string, confirmAsync: (options: any) => Promise<number>) => {
|
||||||
|
let resolve: (thenableOrResult?: void | PromiseLike<void>) => void;
|
||||||
|
let reject: (error: any) => void;
|
||||||
|
const deferred = new Promise<void>((res, rej) => {
|
||||||
|
resolve = res;
|
||||||
|
reject = rej;
|
||||||
|
});
|
||||||
|
const boardName = pxt.appTarget.appTheme.boardName || "???";
|
||||||
|
const boardDriveName = pxt.appTarget.appTheme.driveDisplayName || pxt.appTarget.compile.driveName || "???";
|
||||||
|
|
||||||
|
// https://msdn.microsoft.com/en-us/library/cc848897.aspx
|
||||||
|
// "For security reasons, data URIs are restricted to downloaded resources.
|
||||||
|
// Data URIs cannot be used for navigation, for scripting, or to populate frame or iframe elements"
|
||||||
|
const downloadAgain = !pxt.BrowserUtils.isIE() && !pxt.BrowserUtils.isEdge();
|
||||||
|
const docUrl = pxt.appTarget.appTheme.usbDocs;
|
||||||
|
const saveAs = pxt.BrowserUtils.hasSaveAs();
|
||||||
|
|
||||||
|
const htmlBody = `
|
||||||
|
<div class="ui three column grid stackable">
|
||||||
|
<div class="column">
|
||||||
|
<div class="ui">
|
||||||
|
<div class="image">
|
||||||
|
<img class="ui medium rounded image" src="./static/download/connect.svg" style="height:109px;width:261px;margin-bottom:1rem;">
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<div class="description">
|
||||||
|
<span class="ui yellow circular label">1</span>
|
||||||
|
<strong>${lf("Connect EV3 to computer with USB cable")}</strong>
|
||||||
|
<br/>
|
||||||
|
${lf("Use the miniUSB port on top of EV3 brick")}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="column">
|
||||||
|
<div class="ui">
|
||||||
|
<div class="image">
|
||||||
|
<img class="ui medium rounded image" src="./static/download/firmware.svg" style="height:109px;width:261px;margin-bottom:1rem;">
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<div class="description">
|
||||||
|
<span class="ui blue circular label">2</span>
|
||||||
|
<strong>${lf("Make sure you have the latest EV3 firmware")}</strong>
|
||||||
|
<br/>
|
||||||
|
<a href="" target="_blank">${lf("Click here to update to latest firmware")}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="column">
|
||||||
|
<div class="ui">
|
||||||
|
<div class="image">
|
||||||
|
<img class="ui medium rounded image" src="./static/download/transfer.svg" style="height:109px;width:261px;margin-bottom:1rem;">
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<div class="description">
|
||||||
|
<span class="ui blue circular label">3</span>
|
||||||
|
${lf("Move the .uf2 file to EV3 brick")}
|
||||||
|
<br/>
|
||||||
|
${lf("Locate the downloaded .uf2 file and drag it to the EV3 drive")}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>`;
|
||||||
|
|
||||||
|
return confirmAsync({
|
||||||
|
header: lf("Download to your EV3"),
|
||||||
|
htmlBody,
|
||||||
|
hasCloseIcon: true,
|
||||||
|
hideCancel: true,
|
||||||
|
hideAgree: false,
|
||||||
|
agreeLbl: lf("I got it"),
|
||||||
|
buttons: [downloadAgain ? {
|
||||||
|
label: fn,
|
||||||
|
icon: "download",
|
||||||
|
class: "lightgrey focused",
|
||||||
|
url,
|
||||||
|
fileName: fn
|
||||||
|
} : undefined, docUrl ? {
|
||||||
|
label: lf("Help"),
|
||||||
|
icon: "help",
|
||||||
|
class: "lightgrey",
|
||||||
|
url: docUrl
|
||||||
|
} : undefined]
|
||||||
|
//timeout: 20000
|
||||||
|
}).then(() => { });
|
||||||
|
}
|
||||||
};
|
};
|
||||||
initAsync().catch(e => {
|
initAsync().catch(e => {
|
||||||
// probably no HID - we'll try this again upon deployment
|
// probably no HID - we'll try this again upon deployment
|
||||||
|
@ -24,6 +24,9 @@ export class FieldPorts extends Blockly.FieldDropdown implements Blockly.FieldCu
|
|||||||
this.width_ = parseInt(options.width) || 300;
|
this.width_ = parseInt(options.width) || 300;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trimOptions_() {
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a dropdown menu under the text.
|
* Create a dropdown menu under the text.
|
||||||
* @private
|
* @private
|
||||||
@ -42,7 +45,8 @@ export class FieldPorts extends Blockly.FieldDropdown implements Blockly.FieldCu
|
|||||||
// Accessibility properties
|
// Accessibility properties
|
||||||
contentDiv.setAttribute('role', 'menu');
|
contentDiv.setAttribute('role', 'menu');
|
||||||
contentDiv.setAttribute('aria-haspopup', 'true');
|
contentDiv.setAttribute('aria-haspopup', 'true');
|
||||||
const options = this.getOptions();
|
let options = this.getOptions();
|
||||||
|
options = options.sort();
|
||||||
for (let i = 0, option: any; option = options[i]; i++) {
|
for (let i = 0, option: any; option = options[i]; i++) {
|
||||||
let content = (options[i] as any)[0]; // Human-readable text or image.
|
let content = (options[i] as any)[0]; // Human-readable text or image.
|
||||||
const value = (options[i] as any)[1]; // Language-neutral value.
|
const value = (options[i] as any)[1]; // Language-neutral value.
|
||||||
|
@ -40,7 +40,8 @@ export class FieldSpeed extends Blockly.FieldSlider implements Blockly.FieldCust
|
|||||||
var labelContainer = document.createElement('div');
|
var labelContainer = document.createElement('div');
|
||||||
this.speedSVG = document.createElementNS("http://www.w3.org/2000/svg", "svg") as SVGGElement;
|
this.speedSVG = document.createElementNS("http://www.w3.org/2000/svg", "svg") as SVGGElement;
|
||||||
pxsim.svg.hydrate(this.speedSVG, {
|
pxsim.svg.hydrate(this.speedSVG, {
|
||||||
viewBox: "0 0 200 100"
|
viewBox: "0 0 200 100",
|
||||||
|
width: "170"
|
||||||
});
|
});
|
||||||
|
|
||||||
labelContainer.appendChild(this.speedSVG);
|
labelContainer.appendChild(this.speedSVG);
|
||||||
@ -58,7 +59,7 @@ export class FieldSpeed extends Blockly.FieldSlider implements Blockly.FieldCust
|
|||||||
|
|
||||||
this.reporter = pxsim.svg.child(this.speedSVG, "text", {
|
this.reporter = pxsim.svg.child(this.speedSVG, "text", {
|
||||||
'x': 100, 'y': 80,
|
'x': 100, 'y': 80,
|
||||||
'text-anchor': 'middle', 'alignment-baseline': 'middle',
|
'text-anchor': 'middle', 'dominant-baseline': 'middle',
|
||||||
'style': 'font-size: 50px',
|
'style': 'font-size: 50px',
|
||||||
'class': 'sim-text inverted number'
|
'class': 'sim-text inverted number'
|
||||||
}) as SVGTextElement;
|
}) as SVGTextElement;
|
||||||
|
108
editor/field_turnratio.ts
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
/// <reference path="../node_modules/pxt-core/localtypings/blockly.d.ts"/>
|
||||||
|
/// <reference path="../node_modules/pxt-core/built/pxtsim.d.ts"/>
|
||||||
|
|
||||||
|
export interface FieldTurnRatioOptions extends Blockly.FieldCustomOptions {
|
||||||
|
}
|
||||||
|
|
||||||
|
export class FieldTurnRatio extends Blockly.FieldSlider implements Blockly.FieldCustom {
|
||||||
|
public isFieldCustom_ = true;
|
||||||
|
|
||||||
|
private params: any;
|
||||||
|
|
||||||
|
private path_: SVGPathElement;
|
||||||
|
private reporter_: SVGTextElement;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class for a color wheel field.
|
||||||
|
* @param {number|string} value The initial content of the field.
|
||||||
|
* @param {Function=} opt_validator An optional function that is called
|
||||||
|
* to validate any constraints on what the user entered. Takes the new
|
||||||
|
* text as an argument and returns either the accepted text, a replacement
|
||||||
|
* text, or null to abort the change.
|
||||||
|
* @extends {Blockly.FieldNumber}
|
||||||
|
* @constructor
|
||||||
|
*/
|
||||||
|
constructor(value_: any, params: FieldTurnRatioOptions, opt_validator?: Function) {
|
||||||
|
super(String(value_), '-100', '100', null, '10', 'TurnRatio', opt_validator);
|
||||||
|
this.params = params;
|
||||||
|
(this as any).sliderColor_ = '#a8aaa8';
|
||||||
|
}
|
||||||
|
|
||||||
|
static HALF = 80;
|
||||||
|
static HANDLE_RADIUS = 30;
|
||||||
|
static RADIUS = FieldTurnRatio.HALF - FieldTurnRatio.HANDLE_RADIUS - 1;
|
||||||
|
|
||||||
|
createLabelDom_(labelText: string) {
|
||||||
|
let labelContainer = document.createElement('div');
|
||||||
|
let svg = Blockly.utils.createSvgElement('svg', {
|
||||||
|
'xmlns': 'http://www.w3.org/2000/svg',
|
||||||
|
'xmlns:html': 'http://www.w3.org/1999/xhtml',
|
||||||
|
'xmlns:xlink': 'http://www.w3.org/1999/xlink',
|
||||||
|
'version': '1.1',
|
||||||
|
'height': (FieldTurnRatio.HALF + FieldTurnRatio.HANDLE_RADIUS + 10) + 'px',
|
||||||
|
'width': (FieldTurnRatio.HALF * 2) + 'px'
|
||||||
|
}, labelContainer);
|
||||||
|
let defs = Blockly.utils.createSvgElement('defs', {}, svg);
|
||||||
|
let marker = Blockly.utils.createSvgElement('marker', {
|
||||||
|
'id': 'head',
|
||||||
|
'orient': "auto",
|
||||||
|
'markerWidth': '2',
|
||||||
|
'markerHeight': '4',
|
||||||
|
'refX': '0.1', 'refY': '1.5'
|
||||||
|
}, defs);
|
||||||
|
let markerPath = Blockly.utils.createSvgElement('path', {
|
||||||
|
'd': 'M0,0 V3 L1.5,1.5 Z',
|
||||||
|
'fill': '#f12a21'
|
||||||
|
}, marker);
|
||||||
|
this.reporter_ = pxsim.svg.child(svg, "text", {
|
||||||
|
'x': FieldTurnRatio.HALF, 'y': 96,
|
||||||
|
'text-anchor': 'middle', 'dominant-baseline': 'middle',
|
||||||
|
'style': 'font-size: 50px',
|
||||||
|
'class': 'sim-text inverted number'
|
||||||
|
}) as SVGTextElement;
|
||||||
|
this.path_ = Blockly.utils.createSvgElement('path', {
|
||||||
|
'x1': FieldTurnRatio.HALF,
|
||||||
|
'y1': FieldTurnRatio.HALF,
|
||||||
|
'marker-end': 'url(#head)',
|
||||||
|
'style': 'fill: none; stroke: #f12a21; stroke-width: 10'
|
||||||
|
}, svg);
|
||||||
|
this.updateGraph_();
|
||||||
|
let readout = document.createElement('span');
|
||||||
|
readout.setAttribute('class', 'blocklyFieldSliderReadout');
|
||||||
|
return [labelContainer, readout];
|
||||||
|
};
|
||||||
|
|
||||||
|
updateGraph_() {
|
||||||
|
if (!this.path_) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let v = goog.math.clamp(parseFloat(this.getText()), -100, 100);
|
||||||
|
if (isNaN(v)) {
|
||||||
|
v = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
const x = goog.math.clamp(parseFloat(this.getText()), -100, 100) / 100;
|
||||||
|
const theta = x * Math.PI / 2;
|
||||||
|
const cx = FieldTurnRatio.HALF;
|
||||||
|
const cy = FieldTurnRatio.HALF - 14;
|
||||||
|
const gamma = Math.PI - 2 * theta;
|
||||||
|
const r = FieldTurnRatio.RADIUS;
|
||||||
|
const alpha = 0.2 + Math.abs(x) * 0.5;
|
||||||
|
const x1 = 0;
|
||||||
|
const y1 = r * alpha;
|
||||||
|
const y2 = r * Math.sin(Math.PI / 2 - theta);
|
||||||
|
const x2 = r * Math.cos(Math.PI / 2 - theta);
|
||||||
|
const y3 = y2 - r * alpha * Math.cos(2 * theta);
|
||||||
|
const x3 = x2 - r * alpha * Math.sin(2 * theta);
|
||||||
|
|
||||||
|
|
||||||
|
const d = `M ${cx} ${cy} C ${cx} ${cy - y1} ${cx + x3} ${cy - y3} ${cx + x2} ${cy - y2}`;
|
||||||
|
this.path_.setAttribute('d', d);
|
||||||
|
|
||||||
|
this.reporter_.textContent = `${v}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
setReadout_(readout: Element, value: string) {
|
||||||
|
this.updateGraph_();
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"additionalFilePath": "../../node_modules/pxt-common-packages/libs/behaviors",
|
"additionalFilePath": "../../node_modules/pxt-common-packages/libs/automation",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"core": "file:../ev3"
|
"ev3": "file:../ev3"
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,157 +0,0 @@
|
|||||||
{
|
|
||||||
"Array": "Add, remove, and replace items in lists.\n\nAdd, remove, and replace items in lists.",
|
|
||||||
"Array.filter": "Return the elements of an array that meet the condition specified in a callback function.",
|
|
||||||
"Array.filter|param|callbackfn": "A function that accepts up to two arguments. The filter method calls the callbackfn function one time for each element in the array.",
|
|
||||||
"Array.get": "Get the value at a particular index",
|
|
||||||
"Array.get|param|index": "the zero-based position in the list of the item, eg: 0",
|
|
||||||
"Array.indexOf": "Return the index of the first occurrence of a value in an array.",
|
|
||||||
"Array.indexOf|param|fromIndex": "The array index at which to begin the search. If fromIndex is omitted, the search starts at index 0.",
|
|
||||||
"Array.indexOf|param|item": "The value to locate in the array.",
|
|
||||||
"Array.insertAt": "Insert the value at a particular index, increases length by 1",
|
|
||||||
"Array.insertAt|param|index": "the zero-based position in the list to insert the value, eg: 0",
|
|
||||||
"Array.length": "Get or set the length of an array. This number is one more than the index of the last element the array.",
|
|
||||||
"Array.map": "Call a defined callback function on each element of an array, and return an array containing the results.",
|
|
||||||
"Array.map|param|callbackfn": "A function that accepts up to two arguments. The map method calls the callbackfn function one time for each element in the array.",
|
|
||||||
"Array.pop": "Remove the last element from an array and return it.",
|
|
||||||
"Array.push": "Append a new element to an array.",
|
|
||||||
"Array.reduce": "Call the specified callback function for all the elements in an array. The return value of the callback function is the accumulated result, and is provided as an argument in the next call to the callback function.",
|
|
||||||
"Array.reduce|param|callbackfn": "A function that accepts up to three arguments. The reduce method calls the callbackfn function one time for each element in the array.",
|
|
||||||
"Array.reduce|param|initialValue": "Initial value to start the accumulation. The first call to the callbackfn function provides this value as an argument instead of an array value.",
|
|
||||||
"Array.removeAt": "Remove the element at a certain index.",
|
|
||||||
"Array.removeElement": "Remove the first occurence of an object. Returns true if removed.",
|
|
||||||
"Array.reverse": "Reverse the elements in an array. The first array element becomes the last, and the last array element becomes the first.",
|
|
||||||
"Array.set": "Store a value at a particular index",
|
|
||||||
"Array.set|param|index": "the zero-based position in the list to store the value, eg: 0",
|
|
||||||
"Array.shift": "Remove the first element from an array and return it. This method changes the length of the array.",
|
|
||||||
"Array.slice": "Return a section of an array.",
|
|
||||||
"Array.slice|param|end": "The end of the specified portion of the array. eg: 0",
|
|
||||||
"Array.slice|param|start": "The beginning of the specified portion of the array. eg: 0",
|
|
||||||
"Array.sort": "Sort the elements of an array in place and returns the array. The sort is not necessarily stable.",
|
|
||||||
"Array.splice": "Remove elements from an array.",
|
|
||||||
"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.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.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.acos": "Returns the arccosine (in radians) of a number",
|
|
||||||
"Math.acos|param|x": "A number",
|
|
||||||
"Math.asin": "Returns the arcsine (in radians) of a number",
|
|
||||||
"Math.asin|param|x": "A number",
|
|
||||||
"Math.atan": "Returns the arctangent (in radians) of a number",
|
|
||||||
"Math.atan2": "Returns the arctangent of the quotient of its arguments.",
|
|
||||||
"Math.atan2|param|x": "A number",
|
|
||||||
"Math.atan2|param|y": "A number",
|
|
||||||
"Math.atan|param|x": "A number",
|
|
||||||
"Math.ceil": "Returns the smallest number greater than or equal to its numeric argument.",
|
|
||||||
"Math.ceil|param|x": "A numeric expression.",
|
|
||||||
"Math.constrain": "Constrains a number to be within a range",
|
|
||||||
"Math.cos": "Returns the cosine of a number.",
|
|
||||||
"Math.cos|param|x": "An angle in radians",
|
|
||||||
"Math.exp": "Returns returns ``e^x``.",
|
|
||||||
"Math.exp|param|x": "A number",
|
|
||||||
"Math.floor": "Returns the greatest number less than or equal to its numeric argument.",
|
|
||||||
"Math.floor|param|x": "A numeric expression.",
|
|
||||||
"Math.icos": "Returns the cosine of an input angle. This is an 8-bit approximation.",
|
|
||||||
"Math.icos|param|theta": "input angle from 0-255",
|
|
||||||
"Math.idiv": "Returns the value of integer signed 32 bit division of two numbers.",
|
|
||||||
"Math.idiv|param|x": "The first number",
|
|
||||||
"Math.idiv|param|y": "The second number",
|
|
||||||
"Math.imul": "Returns the value of integer signed 32 bit multiplication of two numbers.",
|
|
||||||
"Math.imul|param|x": "The first number",
|
|
||||||
"Math.imul|param|y": "The second number",
|
|
||||||
"Math.isin": "Returns the sine of an input angle. This is an 8-bit approximation.",
|
|
||||||
"Math.isin|param|theta": "input angle from 0-255",
|
|
||||||
"Math.log": "Returns the natural logarithm (base e) of a number.",
|
|
||||||
"Math.log|param|x": "A number",
|
|
||||||
"Math.map": "Re-maps a number from one range to another. That is, a value of ``from low`` would get mapped to ``to low``, a value of ``from high`` to ``to high``, values in-between to values in-between, etc.",
|
|
||||||
"Math.map|param|fromHigh": "the upper bound of the value's current range, eg: 1023",
|
|
||||||
"Math.map|param|fromLow": "the lower bound of the value's current range",
|
|
||||||
"Math.map|param|toHigh": "the upper bound of the value's target range, eg: 4",
|
|
||||||
"Math.map|param|toLow": "the lower bound of the value's target range",
|
|
||||||
"Math.map|param|value": "value to map in ranges",
|
|
||||||
"Math.max": "Returns the larger of two supplied numeric expressions.",
|
|
||||||
"Math.min": "Returns the smaller of two supplied numeric expressions.",
|
|
||||||
"Math.pow": "Returns the value of a base expression taken to a specified power.",
|
|
||||||
"Math.pow|param|x": "The base value of the expression.",
|
|
||||||
"Math.pow|param|y": "The exponent value of the expression.",
|
|
||||||
"Math.random": "Returns a pseudorandom number between 0 and 1.",
|
|
||||||
"Math.randomRange": "Returns a pseudorandom number between min and max included.\nIf both numbers are integral, the result is integral.",
|
|
||||||
"Math.randomRange|param|max": "the upper inclusive bound, eg: 10",
|
|
||||||
"Math.randomRange|param|min": "the lower inclusive bound, eg: 0",
|
|
||||||
"Math.round": "Returns a supplied numeric expression rounded to the nearest number.",
|
|
||||||
"Math.round|param|x": "The value to be rounded to the nearest number.",
|
|
||||||
"Math.sign": "Returns the sign of the x, indicating whether x is positive, negative or zero.",
|
|
||||||
"Math.sign|param|x": "The numeric expression to test",
|
|
||||||
"Math.sin": "Returns the sine of a number.",
|
|
||||||
"Math.sin|param|x": "An angle in radians",
|
|
||||||
"Math.sqrt": "Returns the square root of a number.",
|
|
||||||
"Math.sqrt|param|x": "A numeric expression.",
|
|
||||||
"Math.tan": "Returns the tangent of a number.",
|
|
||||||
"Math.tan|param|x": "An angle in radians",
|
|
||||||
"Math.trunc": "Returns the number with the decimal part truncated.",
|
|
||||||
"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.charAt": "Return the character at the specified index.",
|
|
||||||
"String.charAt|param|index": "The zero-based index of the desired character.",
|
|
||||||
"String.charCodeAt": "Return the Unicode value of the character at the specified location.",
|
|
||||||
"String.charCodeAt|param|index": "The zero-based index of the desired character. If there is no character at the specified index, NaN is returned.",
|
|
||||||
"String.compare": "See how the order of characters in two strings is different (in ASCII encoding).",
|
|
||||||
"String.compare|param|that": "String to compare to target string",
|
|
||||||
"String.concat": "Returns a string that contains the concatenation of two or more strings.",
|
|
||||||
"String.concat|param|other": "The string to append to the end of the string.",
|
|
||||||
"String.fromCharCode": "Make a string from the given ASCII character code.",
|
|
||||||
"String.isEmpty": "Returns a value indicating if the string is empty",
|
|
||||||
"String.length": "Returns the length of a String object.",
|
|
||||||
"String.substr": "Return a substring of the current string.",
|
|
||||||
"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",
|
|
||||||
"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.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.onEvent": "Run code when a registered event happens.",
|
|
||||||
"control.onEvent|param|value": "the event value to match",
|
|
||||||
"control.panic": "Display an error code and stop the program.",
|
|
||||||
"control.panic|param|code": "an error number to display. eg: 5",
|
|
||||||
"control.reset": "Reset the device.",
|
|
||||||
"control.runInBackground": "Run other code in the background.",
|
|
||||||
"control.waitForEvent": "Blocks the calling thread until the specified event is raised.",
|
|
||||||
"control.waitMicros": "Block the current fiber for the given microseconds",
|
|
||||||
"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.pause": "Pause for the specified time in milliseconds",
|
|
||||||
"loops.pause|param|ms": "how long to pause for, eg: 100, 200, 500, 1000, 2000",
|
|
||||||
"parseInt": "Convert a string to an integer.",
|
|
||||||
"pauseUntil": "Busy wait for a condition to be true",
|
|
||||||
"pauseUntil|param|condition": "condition to test for",
|
|
||||||
"pauseUntil|param|timeOut": "if positive, maximum duration to wait for in milliseconds",
|
|
||||||
"serial": "Reading and writing data over a serial connection.",
|
|
||||||
"serial.writeBuffer": "Send a buffer across the serial connection.",
|
|
||||||
"serial.writeLine": "Write a line of text to the serial port.",
|
|
||||||
"serial.writeNumber": "Write a number 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|param|name": "name of the value stream, eg: \"x\"",
|
|
||||||
"serial.writeValue|param|value": "to write"
|
|
||||||
}
|
|
@ -1,54 +0,0 @@
|
|||||||
{
|
|
||||||
"Array.indexOf|block": "%list| find index of %value",
|
|
||||||
"Array.insertAt|block": "%list| insert at %index| value %value",
|
|
||||||
"Array.length|block": "length of %VALUE",
|
|
||||||
"Array.pop|block": "get and remove last value from %list",
|
|
||||||
"Array.push|block": "%list| add value %value| to end",
|
|
||||||
"Array.removeAt|block": "%list| remove value at %index",
|
|
||||||
"Array.reverse|block": "reverse %list",
|
|
||||||
"Array.shift|block": "get and remove first value from %list",
|
|
||||||
"Array.unshift|block": "%list| insert %value| at beginning",
|
|
||||||
"Array|block": "Array",
|
|
||||||
"Math.constrain|block": "constrain %value|between %low|and %high",
|
|
||||||
"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|block": "Math",
|
|
||||||
"String.charAt|block": "char from %this=text|at %pos",
|
|
||||||
"String.compare|block": "compare %this=text| to %that",
|
|
||||||
"String.fromCharCode|block": "text from char code %code",
|
|
||||||
"String.length|block": "length of %VALUE",
|
|
||||||
"String.substr|block": "substring of %this=text|from %start|of length %length",
|
|
||||||
"String|block": "String",
|
|
||||||
"control.assert|block": "assert %cond|with value %code",
|
|
||||||
"control.deviceSerialNumber|block": "device serial number",
|
|
||||||
"control.millis|block": "millis (ms)",
|
|
||||||
"control.onEvent|block": "on event|from %src|with value %value",
|
|
||||||
"control.panic|block": "panic %code",
|
|
||||||
"control.reset|block": "reset",
|
|
||||||
"control.runInBackground|block": "run in background",
|
|
||||||
"control.waitForEvent|block": "wait for event|from %src|with value %value",
|
|
||||||
"control.waitMicros|block": "wait (µs)%micros",
|
|
||||||
"control|block": "control",
|
|
||||||
"loops.forever|block": "forever",
|
|
||||||
"loops.pause|block": "pause %pause=timePicker|ms",
|
|
||||||
"loops|block": "loops",
|
|
||||||
"parseInt|block": "parse to integer %text",
|
|
||||||
"serial.writeBuffer|block": "serial|write buffer %buffer",
|
|
||||||
"serial.writeLine|block": "serial|write line %text",
|
|
||||||
"serial.writeNumber|block": "serial|write number %value",
|
|
||||||
"serial.writeString|block": "serial|write string %text",
|
|
||||||
"serial.writeValue|block": "serial|write value %name|= %value",
|
|
||||||
"serial|block": "serial",
|
|
||||||
"{id:category}Array": "Array",
|
|
||||||
"{id:category}Arrays": "Arrays",
|
|
||||||
"{id:category}Boolean": "Boolean",
|
|
||||||
"{id:category}Buffer": "Buffer",
|
|
||||||
"{id:category}Control": "Control",
|
|
||||||
"{id:category}Helpers": "Helpers",
|
|
||||||
"{id:category}Loops": "Loops",
|
|
||||||
"{id:category}Math": "Math",
|
|
||||||
"{id:category}Number": "Number",
|
|
||||||
"{id:category}Serial": "Serial",
|
|
||||||
"{id:category}String": "String",
|
|
||||||
"{id:category}Text": "Text"
|
|
||||||
}
|
|
34
libs/base/enums.d.ts
vendored
@ -1,34 +0,0 @@
|
|||||||
// Auto-generated. Do not edit.
|
|
||||||
|
|
||||||
|
|
||||||
declare const enum NumberFormat {
|
|
||||||
Int8LE = 1,
|
|
||||||
UInt8LE = 2,
|
|
||||||
Int16LE = 3,
|
|
||||||
UInt16LE = 4,
|
|
||||||
Int32LE = 5,
|
|
||||||
Int8BE = 6,
|
|
||||||
UInt8BE = 7,
|
|
||||||
Int16BE = 8,
|
|
||||||
UInt16BE = 9,
|
|
||||||
Int32BE = 10,
|
|
||||||
|
|
||||||
UInt32LE = 11,
|
|
||||||
UInt32BE = 12,
|
|
||||||
Float32LE = 13,
|
|
||||||
Float64LE = 14,
|
|
||||||
Float32BE = 15,
|
|
||||||
Float64BE = 16,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
declare const enum ValType {
|
|
||||||
Undefined = 0,
|
|
||||||
Boolean = 1,
|
|
||||||
Number = 2,
|
|
||||||
String = 3,
|
|
||||||
Object = 4,
|
|
||||||
Function = 5,
|
|
||||||
}
|
|
||||||
|
|
||||||
// Auto-generated. Do not edit. Really.
|
|
@ -17,7 +17,8 @@
|
|||||||
"control.cpp",
|
"control.cpp",
|
||||||
"control.ts",
|
"control.ts",
|
||||||
"serial.cpp",
|
"serial.cpp",
|
||||||
"serial.ts"
|
"serial.ts",
|
||||||
|
"fieldeditors.ts"
|
||||||
],
|
],
|
||||||
"testFiles": [
|
"testFiles": [
|
||||||
"test.ts"
|
"test.ts"
|
||||||
|
159
libs/base/shims.d.ts
vendored
@ -1,159 +0,0 @@
|
|||||||
// Auto-generated. Do not edit.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//% indexerGet=BufferMethods::getByte indexerSet=BufferMethods::setByte
|
|
||||||
declare interface Buffer {
|
|
||||||
/**
|
|
||||||
* Write a number in specified format in the buffer.
|
|
||||||
*/
|
|
||||||
//% shim=BufferMethods::setNumber
|
|
||||||
setNumber(format: NumberFormat, offset: int32, value: number): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read a number in specified format from the buffer.
|
|
||||||
*/
|
|
||||||
//% shim=BufferMethods::getNumber
|
|
||||||
getNumber(format: NumberFormat, offset: int32): number;
|
|
||||||
|
|
||||||
/** Returns the length of a Buffer object. */
|
|
||||||
//% property shim=BufferMethods::length
|
|
||||||
length: int32;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fill (a fragment) of the buffer with given value.
|
|
||||||
*/
|
|
||||||
//% offset.defl=0 length.defl=-1 shim=BufferMethods::fill
|
|
||||||
fill(value: int32, offset?: int32, length?: int32): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return a copy of a fragment of a buffer.
|
|
||||||
*/
|
|
||||||
//% offset.defl=0 length.defl=-1 shim=BufferMethods::slice
|
|
||||||
slice(offset?: int32, length?: int32): Buffer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shift buffer left in place, with zero padding.
|
|
||||||
* @param offset number of bytes to shift; use negative value to shift right
|
|
||||||
* @param start start offset in buffer. Default is 0.
|
|
||||||
* @param length number of elements in buffer. If negative, length is set as the buffer length minus
|
|
||||||
* start. eg: -1
|
|
||||||
*/
|
|
||||||
//% start.defl=0 length.defl=-1 shim=BufferMethods::shift
|
|
||||||
shift(offset: int32, start?: int32, length?: int32): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert a buffer to its hexadecimal representation.
|
|
||||||
*/
|
|
||||||
//% shim=BufferMethods::toHex
|
|
||||||
toHex(): string;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rotate buffer left in place.
|
|
||||||
* @param offset number of bytes to shift; use negative value to shift right
|
|
||||||
* @param start start offset in buffer. Default is 0.
|
|
||||||
* @param length number of elements in buffer. If negative, length is set as the buffer length minus
|
|
||||||
* start. eg: -1
|
|
||||||
*/
|
|
||||||
//% start.defl=0 length.defl=-1 shim=BufferMethods::rotate
|
|
||||||
rotate(offset: int32, start?: int32, length?: int32): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Write contents of `src` at `dstOffset` in current buffer.
|
|
||||||
*/
|
|
||||||
//% shim=BufferMethods::write
|
|
||||||
write(dstOffset: int32, src: Buffer): void;
|
|
||||||
}
|
|
||||||
declare namespace loops {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Repeats the code forever in the background. On each iteration, allows other codes to run.
|
|
||||||
* @param body code to execute
|
|
||||||
*/
|
|
||||||
//% help=loops/forever weight=100 afterOnStart=true
|
|
||||||
//% blockId=forever block="forever" blockAllowMultiple=1 shim=loops::forever
|
|
||||||
function forever(a: () => void): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pause for the specified time in milliseconds
|
|
||||||
* @param ms how long to pause for, eg: 100, 200, 500, 1000, 2000
|
|
||||||
*/
|
|
||||||
//% help=loops/pause weight=99
|
|
||||||
//% async block="pause %pause=timePicker|ms"
|
|
||||||
//% blockId=device_pause shim=loops::pause
|
|
||||||
function pause(ms: int32): void;
|
|
||||||
}
|
|
||||||
declare namespace control {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the number of milliseconds elapsed since power on.
|
|
||||||
*/
|
|
||||||
//% help=control/millis weight=50
|
|
||||||
//% blockId=control_running_time block="millis (ms)" shim=control::millis
|
|
||||||
function millis(): int32;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run code when a registered event happens.
|
|
||||||
* @param id the event compoent id
|
|
||||||
* @param value the event value to match
|
|
||||||
*/
|
|
||||||
//% weight=20 blockGap=8 blockId="control_on_event" block="on event|from %src|with value %value"
|
|
||||||
//% blockExternalInputs=1
|
|
||||||
//% help="control/on-event" flags.defl=16 shim=control::onEvent
|
|
||||||
function onEvent(src: int32, value: int32, handler: () => void, flags?: int32): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reset the device.
|
|
||||||
*/
|
|
||||||
//% weight=30 async help=control/reset blockGap=8
|
|
||||||
//% blockId="control_reset" block="reset" shim=control::reset
|
|
||||||
function reset(): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Block the current fiber for the given microseconds
|
|
||||||
* @param micros number of micro-seconds to wait. eg: 4
|
|
||||||
*/
|
|
||||||
//% help=control/wait-micros weight=29 async
|
|
||||||
//% blockId="control_wait_us" block="wait (µs)%micros" shim=control::waitMicros
|
|
||||||
function waitMicros(micros: int32): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run other code in the background.
|
|
||||||
*/
|
|
||||||
//% help=control/run-in-background blockAllowMultiple=1 afterOnStart=true
|
|
||||||
//% blockId="control_run_in_background" block="run in background" blockGap=8 shim=control::runInBackground
|
|
||||||
function runInBackground(a: () => void): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Blocks the calling thread until the specified event is raised.
|
|
||||||
*/
|
|
||||||
//% help=control/wait-for-event async
|
|
||||||
//% blockId=control_wait_for_event block="wait for event|from %src|with value %value" shim=control::waitForEvent
|
|
||||||
function waitForEvent(src: int32, value: int32): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Derive a unique, consistent serial number of this device from internal data.
|
|
||||||
*/
|
|
||||||
//% blockId="control_device_serial_number" block="device serial number" weight=9
|
|
||||||
//% help=control/device-serial-number shim=control::deviceSerialNumber
|
|
||||||
function deviceSerialNumber(): int32;
|
|
||||||
}
|
|
||||||
declare namespace serial {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Write some text to the serial port.
|
|
||||||
*/
|
|
||||||
//% help=serial/write-string
|
|
||||||
//% weight=87 blockHidden=true
|
|
||||||
//% blockId=serial_writestring block="serial|write string %text" shim=serial::writeString
|
|
||||||
function writeString(text: string): void;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Send a buffer across the serial connection.
|
|
||||||
*/
|
|
||||||
//% help=serial/write-buffer weight=6 blockHidden=true
|
|
||||||
//% blockId=serial_writebuffer block="serial|write buffer %buffer" shim=serial::writeBuffer
|
|
||||||
function writeBuffer(buffer: Buffer): void;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Auto-generated. Do not edit. Really.
|
|
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"behaviors": "Behavior drive blocks",
|
|
||||||
"behaviors.Behavior": "A behavior",
|
|
||||||
"behaviors.BehaviorManager": "A manager for behaviors",
|
|
||||||
"behaviors.BehaviorManager.add": "Adds a new behavior to the behavior manager",
|
|
||||||
"behaviors.BehaviorManager.add|param|behavior": "the behavior to add",
|
|
||||||
"behaviors.BehaviorManager.start": "Starts the behavior control loop",
|
|
||||||
"behaviors.BehaviorManager.stop": "Stops the execution loop",
|
|
||||||
"behaviors.addBehavior": "Adds the behavior and starts it",
|
|
||||||
"behaviors.addBehavior|param|behavior": "a behavior",
|
|
||||||
"behaviors.avoidCrash": "A behavior that stops all motors if the sensor distance get too short",
|
|
||||||
"behaviors.driveForward": "A behavior that turns on the motors to the specified speed",
|
|
||||||
"behaviors.driveForward|param|motors": "@param speed the desired speed, eg: 50"
|
|
||||||
}
|
|
@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"behaviors.addBehavior|block": "add behavior %behavior",
|
|
||||||
"behaviors.avoidCrash|block": "avoid crash using %ultrasonic",
|
|
||||||
"behaviors.driveForward|block": "drive %motors|forward at %speed=motorSpeedPicker|%",
|
|
||||||
"behaviors|block": "behaviors",
|
|
||||||
"{id:category}Behaviors": "Behaviors"
|
|
||||||
}
|
|
@ -1,56 +0,0 @@
|
|||||||
namespace behaviors {
|
|
||||||
class AvoidCrashBehavior extends behaviors.Behavior {
|
|
||||||
private ultrasonic: sensors.UltraSonicSensor;
|
|
||||||
constructor(ultrasonic: sensors.UltraSonicSensor) {
|
|
||||||
super();
|
|
||||||
this.ultrasonic = ultrasonic;
|
|
||||||
}
|
|
||||||
|
|
||||||
shouldRun(): boolean {
|
|
||||||
return this.ultrasonic.distance() < 5;
|
|
||||||
}
|
|
||||||
|
|
||||||
run(): void {
|
|
||||||
motors.stopAllMotors();
|
|
||||||
this.active = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A behavior that stops all motors if the sensor distance get too short
|
|
||||||
*/
|
|
||||||
//% blockId=behaviorsAvoidCrash block="avoid crash using %ultrasonic"
|
|
||||||
export function avoidCrash(ultrasonic: sensors.UltraSonicSensor) : behaviors.Behavior {
|
|
||||||
return new AvoidCrashBehavior(ultrasonic);
|
|
||||||
}
|
|
||||||
|
|
||||||
class DriveForwardBehavior extends behaviors.Behavior {
|
|
||||||
private motors: motors.MotorBase;
|
|
||||||
private speed: number;
|
|
||||||
constructor(motors: motors.MotorBase, speed: number) {
|
|
||||||
super();
|
|
||||||
this.motors = motors;
|
|
||||||
this.speed = speed;
|
|
||||||
}
|
|
||||||
|
|
||||||
shouldRun(): boolean {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
run(): void {
|
|
||||||
this.motors.setSpeed(this.speed);
|
|
||||||
pauseUntil(() => !this.active);
|
|
||||||
this.motors.setSpeed(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A behavior that turns on the motors to the specified speed
|
|
||||||
* @param motors
|
|
||||||
* @param speed the desired speed, eg: 50
|
|
||||||
*/
|
|
||||||
//% blockId=behaviorsDriveForward block="drive %motors|forward at %speed=motorSpeedPicker|%"
|
|
||||||
export function driveForward(motors: motors.MotorBase, speed: number): behaviors.Behavior {
|
|
||||||
return new DriveForwardBehavior(motors, speed);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,3 +1,5 @@
|
|||||||
<xml xmlns="http://www.w3.org/1999/xhtml">
|
<xml xmlns="http://www.w3.org/1999/xhtml">
|
||||||
<block type="forever"></block>
|
<variables></variables>
|
||||||
|
<block type="pxt-on-start" x="0" y="0"></block>
|
||||||
|
<block type="forever" x="176" y="0"></block>
|
||||||
</xml>
|
</xml>
|
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
"chassis.Chassis": "A differential drive robot",
|
|
||||||
"chassis.Chassis.drive": "Makes a differential drive robot move with a given speed (cm/s) and rotation rate (deg/s)\nusing a unicycle model.",
|
|
||||||
"chassis.Chassis.driveFor": "Makes a differential drive robot move with a given speed (cm/s) and rotation rate (deg/s)\nusing a unicycle model.",
|
|
||||||
"chassis.Chassis.driveFor|param|rotationSpeed": "rotation of the robot around the center point, eg: 30",
|
|
||||||
"chassis.Chassis.driveFor|param|speed": "speed of the center point between motors, eg: 10",
|
|
||||||
"chassis.Chassis.driveFor|param|value": "the amount of movement, eg: 2",
|
|
||||||
"chassis.Chassis.drive|param|rotationSpeed": "rotation of the robot around the center point, eg: 30",
|
|
||||||
"chassis.Chassis.drive|param|speed": "speed of the center point between motors, eg: 10",
|
|
||||||
"chassis.Chassis.setMotors": "Sets the motors used by the chassis, default is B+C",
|
|
||||||
"chassis.Chassis.setProperty": "Sets a property of the robot",
|
|
||||||
"chassis.Chassis.setProperty|param|property": "the property to set",
|
|
||||||
"chassis.Chassis.setProperty|param|value": "the value to set"
|
|
||||||
}
|
|
@ -1,10 +0,0 @@
|
|||||||
{
|
|
||||||
"ChassisProperty.BaseLength|block": "base length (cm)",
|
|
||||||
"ChassisProperty.WheelRadius|block": "wheel radius (cm)",
|
|
||||||
"chassis.Chassis.driveFor|block": "drive %chassis|at %speed|cm/s|turning %rotationSpeed|deg/s|for %value|%unit",
|
|
||||||
"chassis.Chassis.drive|block": "drive %chassis|at %speed|cm/s|turning %rotationSpeed|deg/s",
|
|
||||||
"chassis.Chassis.setMotors|block": "set %chassis|motors to %motors",
|
|
||||||
"chassis.Chassis.setProperty|block": "set %chassis|%property|to %value",
|
|
||||||
"chassis|block": "chassis",
|
|
||||||
"{id:category}Chassis": "Chassis"
|
|
||||||
}
|
|
@ -1,10 +1,7 @@
|
|||||||
enum ChassisProperty {
|
/**
|
||||||
//% block="wheel radius (cm)"
|
* A differential drive robot
|
||||||
WheelRadius,
|
*/
|
||||||
//% block="base length (cm)"
|
//% weight=50 color=#cf00cf
|
||||||
BaseLength
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace chassis {
|
namespace chassis {
|
||||||
/**
|
/**
|
||||||
* A differential drive robot
|
* A differential drive robot
|
||||||
@ -29,26 +26,17 @@ namespace chassis {
|
|||||||
* using a unicycle model.
|
* using a unicycle model.
|
||||||
* @param speed speed of the center point between motors, eg: 10
|
* @param speed speed of the center point between motors, eg: 10
|
||||||
* @param rotationSpeed rotation of the robot around the center point, eg: 30
|
* @param rotationSpeed rotation of the robot around the center point, eg: 30
|
||||||
*/
|
* @param distance
|
||||||
|
**/
|
||||||
//% blockId=motorDrive block="drive %chassis|at %speed|cm/s|turning %rotationSpeed|deg/s"
|
//% blockId=motorDrive block="drive %chassis|at %speed|cm/s|turning %rotationSpeed|deg/s"
|
||||||
//% inlineInputMode=inline
|
//% inlineInputMode=inline
|
||||||
//% weight=99 blockGap=8
|
|
||||||
drive(speed: number, rotationSpeed: number) {
|
|
||||||
this.driveFor(speed, rotationSpeed, 0, MoveUnit.Degrees);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Makes a differential drive robot move with a given speed (cm/s) and rotation rate (deg/s)
|
|
||||||
* using a unicycle model.
|
|
||||||
* @param speed speed of the center point between motors, eg: 10
|
|
||||||
* @param rotationSpeed rotation of the robot around the center point, eg: 30
|
|
||||||
* @param value the amount of movement, eg: 2
|
|
||||||
* @param unit
|
|
||||||
*/
|
|
||||||
//% blockId=motorDriveFor block="drive %chassis|at %speed|cm/s|turning %rotationSpeed|deg/s|for %value|%unit"
|
|
||||||
//% inlineInputMode=inline
|
|
||||||
//% weight=95 blockGap=8
|
//% weight=95 blockGap=8
|
||||||
driveFor(speed: number, rotationSpeed: number, value: number, unit: MoveUnit) {
|
drive(speed: number, rotationSpeed: number, distance: number = 0) {
|
||||||
|
if (!speed) {
|
||||||
|
this.motors.stop();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// speed is expressed in %
|
// speed is expressed in %
|
||||||
const R = this.wheelRadius; // cm
|
const R = this.wheelRadius; // cm
|
||||||
const L = this.baseLength; // cm
|
const L = this.baseLength; // cm
|
||||||
@ -65,26 +53,30 @@ namespace chassis {
|
|||||||
const sr = vr / maxw * 100; // %
|
const sr = vr / maxw * 100; // %
|
||||||
const sl = vl / maxw * 100; // %
|
const sl = vl / maxw * 100; // %
|
||||||
|
|
||||||
this.motors.tankFor(sr, sl, value, unit)
|
// cm / (cm/s) = s
|
||||||
|
const seconds = distance / speed;
|
||||||
|
|
||||||
|
this.motors.tank(sr, sl, seconds, MoveUnit.Seconds)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets a property of the robot
|
* Sets the wheel radius in centimeters
|
||||||
* @param property the property to set
|
* @param cm
|
||||||
* @param value the value to set
|
|
||||||
*/
|
*/
|
||||||
//% blockId=chassisSetProperty block="set %chassis|%property|to %value"
|
//% blockId=chassisSetWheelRadius block="set %chassis|wheel radius to %cm|(cm)"
|
||||||
//% blockGap=8
|
setWheelRadius(cm: number) {
|
||||||
//% weight=10
|
this.wheelRadius = cm;
|
||||||
setProperty(property: ChassisProperty, value: number) {
|
|
||||||
switch (property) {
|
|
||||||
case ChassisProperty.WheelRadius:
|
|
||||||
this.wheelRadius = Math.max(0.1, value); break;
|
|
||||||
case ChassisProperty.BaseLength:
|
|
||||||
this.baseLength = Math.max(0.1, value); break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the base length in centimeters
|
||||||
|
* @param cm
|
||||||
|
*/
|
||||||
|
//% blockId=chassisSetBaseLength block="set %chassis|base length to %cm|(cm)"
|
||||||
|
setBaseLength(cm: number) {
|
||||||
|
this.baseLength = cm;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the motors used by the chassis, default is B+C
|
* Sets the motors used by the chassis, default is B+C
|
||||||
* @param motors
|
* @param motors
|
||||||
@ -94,6 +86,10 @@ namespace chassis {
|
|||||||
setMotors(motors: motors.SynchedMotorPair) {
|
setMotors(motors: motors.SynchedMotorPair) {
|
||||||
this.motors = motors;
|
this.motors = motors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
toString(): string {
|
||||||
|
return `chassis base ${this.baseLength}, wheel ${this.wheelRadius}`;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//% fixedInstance whenUsed
|
//% fixedInstance whenUsed
|
||||||
|
@ -1,15 +0,0 @@
|
|||||||
{
|
|
||||||
"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",
|
|
||||||
"sensors.ColorSensor.pauseForColor": "Waits for the given color to be detected",
|
|
||||||
"sensors.ColorSensor.pauseForColor|param|color": "the color to detect",
|
|
||||||
"sensors.ColorSensor.pauseForLight": "Waits for the given color to be detected"
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
{
|
|
||||||
"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": "%sensor| color",
|
|
||||||
"sensors.ColorSensor.light|block": "%sensor|%mode",
|
|
||||||
"sensors.ColorSensor.onColorDetected|block": "on %sensor|detected color %color",
|
|
||||||
"sensors.ColorSensor.onLightChanged|block": "on %sensor|%mode|%condition",
|
|
||||||
"sensors.ColorSensor.pauseForColor|block": "pause %sensor|for color %color",
|
|
||||||
"sensors.ColorSensor.pauseForLight|block": "pause %sensor|for %mode|%condition",
|
|
||||||
"sensors.color1|block": "color 1",
|
|
||||||
"sensors.color2|block": "color 2",
|
|
||||||
"sensors.color3|block": "color 3",
|
|
||||||
"sensors.color4|block": "color 4",
|
|
||||||
"sensors|block": "sensors",
|
|
||||||
"{id:category}Sensors": "Sensors",
|
|
||||||
"{id:group}Color Sensor": "Color Sensor"
|
|
||||||
}
|
|
@ -19,29 +19,29 @@ enum LightIntensityMode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const enum ColorSensorColor {
|
const enum ColorSensorColor {
|
||||||
//% block="none"
|
//% block="none" blockIdentity=sensors.color
|
||||||
None,
|
None,
|
||||||
//% block="black"
|
//% block="black" blockIdentity=sensors.color
|
||||||
Black,
|
Black,
|
||||||
//% block="blue"
|
//% block="blue" blockIdentity=sensors.color
|
||||||
Blue,
|
Blue,
|
||||||
//% block="green"
|
//% block="green" blockIdentity=sensors.color
|
||||||
Green,
|
Green,
|
||||||
//% block="yellow"
|
//% block="yellow" blockIdentity=sensors.color
|
||||||
Yellow,
|
Yellow,
|
||||||
//% block="red"
|
//% block="red" blockIdentity=sensors.color
|
||||||
Red,
|
Red,
|
||||||
//% block="white"
|
//% block="white" blockIdentity=sensors.color
|
||||||
White,
|
White,
|
||||||
//% block="brown"
|
//% block="brown" blockIdentity=sensors.color
|
||||||
Brown,
|
Brown,
|
||||||
}
|
}
|
||||||
|
|
||||||
enum LightCondition {
|
enum LightCondition {
|
||||||
//% block="dark"
|
//% block="dark"
|
||||||
Dark = sensors.internal.ThresholdState.Low,
|
Dark = sensors.ThresholdState.Low,
|
||||||
//$ block="bright"
|
//$ block="bright"
|
||||||
Bright = sensors.internal.ThresholdState.High
|
Bright = sensors.ThresholdState.High
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace sensors {
|
namespace sensors {
|
||||||
@ -52,12 +52,14 @@ namespace sensors {
|
|||||||
*/
|
*/
|
||||||
//% fixedInstances
|
//% fixedInstances
|
||||||
export class ColorSensor extends internal.UartSensor {
|
export class ColorSensor extends internal.UartSensor {
|
||||||
thresholdDetector: sensors.internal.ThresholdDetector;
|
thresholdDetector: sensors.ThresholdDetector;
|
||||||
|
calibrating: boolean;
|
||||||
|
|
||||||
constructor(port: number) {
|
constructor(port: number) {
|
||||||
super(port)
|
super(port)
|
||||||
this._setMode(ColorSensorMode.None);
|
this._setMode(ColorSensorMode.None);
|
||||||
this.thresholdDetector = new sensors.internal.ThresholdDetector(this.id());
|
this.thresholdDetector = new sensors.ThresholdDetector(this.id());
|
||||||
|
this.calibrating = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
_colorEventValue(value: number) {
|
_colorEventValue(value: number) {
|
||||||
@ -95,6 +97,7 @@ namespace sensors {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_update(prev: number, curr: number) {
|
_update(prev: number, curr: number) {
|
||||||
|
if (this.calibrating) return; // simply ignore data updates while calibrating
|
||||||
if (this.mode == ColorSensorMode.Color)
|
if (this.mode == ColorSensorMode.Color)
|
||||||
control.raiseEvent(this._id, this._colorEventValue(curr));
|
control.raiseEvent(this._id, this._colorEventValue(curr));
|
||||||
else
|
else
|
||||||
@ -112,7 +115,7 @@ namespace sensors {
|
|||||||
//% parts="colorsensor"
|
//% parts="colorsensor"
|
||||||
//% blockNamespace=sensors
|
//% blockNamespace=sensors
|
||||||
//% sensor.fieldEditor="ports"
|
//% sensor.fieldEditor="ports"
|
||||||
//% weight=100 blockGap=8
|
//% weight=100 blockGap=12
|
||||||
//% group="Color Sensor"
|
//% group="Color Sensor"
|
||||||
onColorDetected(color: ColorSensorColor, handler: () => void) {
|
onColorDetected(color: ColorSensorColor, handler: () => void) {
|
||||||
this.setMode(ColorSensorMode.Color)
|
this.setMode(ColorSensorMode.Color)
|
||||||
@ -152,8 +155,9 @@ namespace sensors {
|
|||||||
//% parts="colorsensor"
|
//% parts="colorsensor"
|
||||||
//% blockNamespace=sensors
|
//% blockNamespace=sensors
|
||||||
//% sensor.fieldEditor="ports"
|
//% sensor.fieldEditor="ports"
|
||||||
//% weight=99
|
//% weight=98
|
||||||
//% group="Color Sensor"
|
//% group="Color Sensor"
|
||||||
|
//% blockGap=8
|
||||||
color(): ColorSensorColor {
|
color(): ColorSensorColor {
|
||||||
this.setMode(ColorSensorMode.Color)
|
this.setMode(ColorSensorMode.Color)
|
||||||
return this.getNumber(NumberFormat.UInt8LE, 0)
|
return this.getNumber(NumberFormat.UInt8LE, 0)
|
||||||
@ -170,7 +174,7 @@ namespace sensors {
|
|||||||
//% parts="colorsensor"
|
//% parts="colorsensor"
|
||||||
//% blockNamespace=sensors
|
//% blockNamespace=sensors
|
||||||
//% sensor.fieldEditor="ports"
|
//% sensor.fieldEditor="ports"
|
||||||
//% weight=89 blockGap=8
|
//% weight=89 blockGap=12
|
||||||
//% group="Color Sensor"
|
//% group="Color Sensor"
|
||||||
onLightChanged(mode: LightIntensityMode, condition: LightCondition, handler: () => void) {
|
onLightChanged(mode: LightIntensityMode, condition: LightCondition, handler: () => void) {
|
||||||
this.setMode(<ColorSensorMode><number>mode)
|
this.setMode(<ColorSensorMode><number>mode)
|
||||||
@ -221,12 +225,97 @@ namespace sensors {
|
|||||||
reflectedLight() {
|
reflectedLight() {
|
||||||
return this.light(LightIntensityMode.Reflected);
|
return this.light(LightIntensityMode.Reflected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets a threshold value
|
||||||
|
* @param condition the dark or bright light condition
|
||||||
|
* @param value the value threshold
|
||||||
|
*/
|
||||||
|
//% blockId=colorSetThreshold block="set %sensor|%condition|to %value"
|
||||||
|
//% group="Threshold" blockGap=8 weight=90
|
||||||
|
//% value.min=0 value.max=100
|
||||||
|
//% sensor.fieldEditor="ports"
|
||||||
|
setThreshold(condition: LightCondition, value: number) {
|
||||||
|
if (condition == LightCondition.Dark)
|
||||||
|
this.thresholdDetector.setLowThreshold(value)
|
||||||
|
else
|
||||||
|
this.thresholdDetector.setHighThreshold(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the threshold value
|
||||||
|
* @param condition the light condition
|
||||||
|
*/
|
||||||
|
//% blockId=colorGetThreshold block="%sensor|%condition"
|
||||||
|
//% group="Threshold" blockGap=8 weight=89
|
||||||
|
//% sensor.fieldEditor="ports"
|
||||||
|
threshold(condition: LightCondition): number {
|
||||||
|
return this.thresholdDetector.threshold(<ThresholdState><number>LightCondition.Dark);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Collects measurement of the light condition and adjusts the threshold to 10% / 90%.
|
||||||
|
*/
|
||||||
|
//% blockId=colorCalibrateLight block="calibrate|%sensor|for %mode|light"
|
||||||
|
//% group="Threshold" weight=91 blockGap=8
|
||||||
|
//% sensor.fieldEditor="ports"
|
||||||
|
calibrateLight(mode: LightIntensityMode, deviation: number = 8) {
|
||||||
|
this.calibrating = true; // prevent events
|
||||||
|
|
||||||
|
this.light(mode); // trigger a read
|
||||||
|
pauseUntil(() => this.isActive()); // ensure sensor is live
|
||||||
|
|
||||||
|
|
||||||
|
let vold = 0;
|
||||||
|
let vcount = 0;
|
||||||
|
let min = 200;
|
||||||
|
let max = -200;
|
||||||
|
let k = 0;
|
||||||
|
while (k++ < 1000 && vcount < 50) {
|
||||||
|
let v = this.light(mode);
|
||||||
|
min = Math.min(min, v);
|
||||||
|
max = Math.max(max, v);
|
||||||
|
// detect if nothing has changed and stop calibration
|
||||||
|
if (Math.abs(v - vold) <= 2)
|
||||||
|
vcount++;
|
||||||
|
else {
|
||||||
|
vold = v;
|
||||||
|
vcount = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// wait a bit
|
||||||
|
loops.pause(50);
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply tolerance
|
||||||
|
const minDist = 10;
|
||||||
|
min = Math.max(minDist / 2, Math.min(min + deviation / 2, max - deviation / 2 - minDist / 2));
|
||||||
|
max = Math.min(100 - minDist / 2, Math.max(min + minDist, max - deviation / 2));
|
||||||
|
|
||||||
|
// apply thresholds
|
||||||
|
this.thresholdDetector.setLowThreshold(min);
|
||||||
|
this.thresholdDetector.setHighThreshold(max);
|
||||||
|
|
||||||
|
this.calibrating = false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//% whenUsed block="color 3" weight=90 fixedInstance jres=icons.port3
|
/**
|
||||||
|
* Returns a color that the sensor can detect
|
||||||
|
*/
|
||||||
|
//% shim=TD_ID
|
||||||
|
//% blockId=colorSensorColor block="color %color"
|
||||||
|
//% group="Color Sensor"
|
||||||
|
//% weight=97
|
||||||
|
export function color(color: ColorSensorColor): ColorSensorColor {
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
//% whenUsed block="color 3" weight=95 fixedInstance jres=icons.port3
|
||||||
export const color3: ColorSensor = new ColorSensor(3)
|
export const color3: ColorSensor = new ColorSensor(3)
|
||||||
|
|
||||||
//% whenUsed block="color 1" weight=95 fixedInstance jres=icons.port1
|
//% whenUsed block="color 1" weight=90 fixedInstance jres=icons.port1
|
||||||
export const color1: ColorSensor = new ColorSensor(1)
|
export const color1: ColorSensor = new ColorSensor(1)
|
||||||
|
|
||||||
//% whenUsed block="color 2" weight=90 fixedInstance jres=icons.port2
|
//% whenUsed block="color 2" weight=90 fixedInstance jres=icons.port2
|
||||||
|
@ -3,9 +3,9 @@
|
|||||||
```blocks
|
```blocks
|
||||||
loops.forever(function () {
|
loops.forever(function () {
|
||||||
if (sensors.color1.ambientLight() > 20) {
|
if (sensors.color1.ambientLight() > 20) {
|
||||||
brick.setStatusLight(LightsPattern.Green)
|
brick.setLight(BrickLight.Green)
|
||||||
} else {
|
} else {
|
||||||
brick.setStatusLight(LightsPattern.Orange)
|
brick.setLight(BrickLight.Orange)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
```
|
```
|
@ -3,9 +3,9 @@
|
|||||||
```blocks
|
```blocks
|
||||||
loops.forever(function () {
|
loops.forever(function () {
|
||||||
if (sensors.color1.color() == ColorSensorColor.Green) {
|
if (sensors.color1.color() == ColorSensorColor.Green) {
|
||||||
brick.setStatusLight(LightsPattern.Green)
|
brick.setLight(BrickLight.Green)
|
||||||
} else {
|
} else {
|
||||||
brick.setStatusLight(LightsPattern.Orange)
|
brick.setLight(BrickLight.Orange)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
```
|
```
|
@ -3,9 +3,9 @@
|
|||||||
```blocks
|
```blocks
|
||||||
loops.forever(function () {
|
loops.forever(function () {
|
||||||
if (sensors.color1.reflectedLight() > 20) {
|
if (sensors.color1.reflectedLight() > 20) {
|
||||||
brick.setStatusLight(LightsPattern.Green)
|
brick.setLight(BrickLight.Green)
|
||||||
} else {
|
} else {
|
||||||
brick.setStatusLight(LightsPattern.Orange)
|
brick.setLight(BrickLight.Orange)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
```
|
```
|
@ -1,115 +0,0 @@
|
|||||||
{
|
|
||||||
"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.pauseUntil": "Waits until the event is raised",
|
|
||||||
"brick.Button.pauseUntil|param|ev": "the event to wait for",
|
|
||||||
"brick.Button.wasPressed": "See if the button was pressed again since the last time you checked.",
|
|
||||||
"brick.batteryLevel": "Returns the current battery level",
|
|
||||||
"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.clearScreen": "Clears the screen",
|
|
||||||
"brick.lightPattern": "Pattern block.",
|
|
||||||
"brick.lightPattern|param|pattern": "the lights pattern to use. eg: LightsPattern.Green",
|
|
||||||
"brick.printPorts": "Prints the port states on the screen",
|
|
||||||
"brick.setLight": "Set lights.",
|
|
||||||
"brick.setLight|param|pattern": "the lights pattern to use.",
|
|
||||||
"brick.showImage": "Shows an image on screen",
|
|
||||||
"brick.showImage|param|image": "image to draw",
|
|
||||||
"brick.showNumber": "Shows a number on the screen",
|
|
||||||
"brick.showNumber|param|line": "the line number to print the text at, eg: 1",
|
|
||||||
"brick.showNumber|param|value": "the numeric value",
|
|
||||||
"brick.showString": "Show text on the screen at a specific line.",
|
|
||||||
"brick.showString|param|line": "the line number to print the text at, eg: 1",
|
|
||||||
"brick.showString|param|text": "the text to print on the screen, eg: \"Hello world\"",
|
|
||||||
"brick.showValue": "Shows a name, value pair on the screen",
|
|
||||||
"brick.showValue|param|line": "the line number to print the text at, eg: 1",
|
|
||||||
"brick.showValue|param|value": "the numeric value",
|
|
||||||
"console": "Reading and writing data to the console output.\n\nReading and writing data to the console output.",
|
|
||||||
"console.addListener": "Adds a listener for the log messages",
|
|
||||||
"console.log": "Write a line of text to the console output.",
|
|
||||||
"console.logValue": "Write a name:value pair as a line of text to the console output.",
|
|
||||||
"console.logValue|param|name": "name of the value stream, eg: \"x\"",
|
|
||||||
"console.logValue|param|value": "to write",
|
|
||||||
"console.sendToScreen": "Sends the log messages to the brick screen and uses the brick up and down buttons to scroll.",
|
|
||||||
"control": "Program controls and events.",
|
|
||||||
"control.allocateNotifyEvent": "Allocates the next user notification event",
|
|
||||||
"control.deviceFirmwareVersion": "Determine the version of system software currently running.",
|
|
||||||
"control.dmesg": "Write data to DMESG debugging buffer.",
|
|
||||||
"control.mmap": "Create new file mapping in memory",
|
|
||||||
"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|value": "Component specific code indicating the cause of the event.",
|
|
||||||
"motors.Motor.angle": "Gets motor angle.",
|
|
||||||
"motors.Motor.clearCounts": "Clears the motor count",
|
|
||||||
"motors.Motor.speed": "Gets motor actual speed.",
|
|
||||||
"motors.Motor.tacho": "Gets motor tachometer count.",
|
|
||||||
"motors.Motor.toString": "Returns the status of the motor",
|
|
||||||
"motors.MotorBase.isReady": "Returns a value indicating if the motor is still running a previous command.",
|
|
||||||
"motors.MotorBase.pauseUntilReady": "Pauses the execution until the previous command finished.",
|
|
||||||
"motors.MotorBase.pauseUntilReady|param|timeOut": "optional maximum pausing time in milliseconds",
|
|
||||||
"motors.MotorBase.reset": "Resets the motor(s).",
|
|
||||||
"motors.MotorBase.setBrake": "Sets the automatic brake on or off when the motor is off",
|
|
||||||
"motors.MotorBase.setBrake|param|brake": "a value indicating if the motor should break when off",
|
|
||||||
"motors.MotorBase.setReversed": "Reverses the motor polarity",
|
|
||||||
"motors.MotorBase.setSpeed": "Sets the speed of the motor.",
|
|
||||||
"motors.MotorBase.setSpeedFor": "Sets the motor speed for limited time or distance",
|
|
||||||
"motors.MotorBase.setSpeedFor|param|speed": "the speed from ``100`` full forward to ``-100`` full backward, eg: 50",
|
|
||||||
"motors.MotorBase.setSpeedFor|param|unit": "the meaning of the value",
|
|
||||||
"motors.MotorBase.setSpeedFor|param|value": "the move quantity, eg: 2",
|
|
||||||
"motors.MotorBase.setSpeed|param|speed": "the speed from ``100`` full forward to ``-100`` full backward, eg: 50",
|
|
||||||
"motors.MotorBase.stop": "Stops the motor(s).",
|
|
||||||
"motors.SynchedMotorPair.steer": "Turns the motor and the follower motor by a number of rotations",
|
|
||||||
"motors.SynchedMotorPair.steerFor": "Turns the motor and the follower motor by a number of rotations",
|
|
||||||
"motors.SynchedMotorPair.steerFor|param|speed": "the speed from ``100`` full forward to ``-100`` full backward, eg: 50",
|
|
||||||
"motors.SynchedMotorPair.steerFor|param|turnRatio": "the ratio of power sent to the follower motor, from ``-200`` to ``200``, eg: 0",
|
|
||||||
"motors.SynchedMotorPair.steerFor|param|unit": "the meaning of the value",
|
|
||||||
"motors.SynchedMotorPair.steerFor|param|value": "the move quantity, eg: 2",
|
|
||||||
"motors.SynchedMotorPair.steer|param|speed": "the speed from ``100`` full forward to ``-100`` full backward, eg: 50",
|
|
||||||
"motors.SynchedMotorPair.steer|param|turnRatio": "the ratio of power sent to the follower motor, from ``-200`` to ``200``, eg: 0",
|
|
||||||
"motors.SynchedMotorPair.tank": "The Move Tank block can make a robot drive forward, backward, turn, or stop. \nUse the Move Tank block for robot vehicles that have two Large Motors, \nwith one motor driving the left side of the vehicle and the other the right side. \nYou can make the two motors go at different speeds or in different directions \nto make your robot turn.",
|
|
||||||
"motors.SynchedMotorPair.tankFor": "The Move Tank block can make a robot drive forward, backward, turn, or stop. \nUse the Move Tank block for robot vehicles that have two Large Motors, \nwith one motor driving the left side of the vehicle and the other the right side. \nYou can make the two motors go at different speeds or in different directions \nto make your robot turn.",
|
|
||||||
"motors.SynchedMotorPair.tankFor|param|speedLeft": "the speed on the left motor, eg: 50",
|
|
||||||
"motors.SynchedMotorPair.tankFor|param|speedRight": "the speed on the right motor, eg: 50",
|
|
||||||
"motors.SynchedMotorPair.tankFor|param|unit": "the unit of the value",
|
|
||||||
"motors.SynchedMotorPair.tankFor|param|value": "the amount of movement, eg: 2",
|
|
||||||
"motors.SynchedMotorPair.tank|param|speedLeft": "the speed on the left motor, eg: 50",
|
|
||||||
"motors.SynchedMotorPair.tank|param|speedRight": "the speed on the right motor, eg: 50",
|
|
||||||
"motors.SynchedMotorPair.toString": "Returns the name(s) of the motor",
|
|
||||||
"motors.mkCmd": "Allocates a message buffer",
|
|
||||||
"motors.mkCmd|param|addSize": "required additional bytes",
|
|
||||||
"motors.mkCmd|param|cmd": "command id",
|
|
||||||
"motors.mkCmd|param|out": "ports",
|
|
||||||
"motors.readPWM": "Sends and receives a message from the motors device",
|
|
||||||
"motors.readPWM|param|buf": "message buffer",
|
|
||||||
"motors.resetAllMotors": "Resets all motors",
|
|
||||||
"motors.stopAllMotors": "Stops all motors",
|
|
||||||
"motors.writePWM": "Sends a command to the motors device",
|
|
||||||
"motors.writePWM|param|buf": "the command buffer",
|
|
||||||
"output.createBuffer": "Create a new zero-initialized buffer.",
|
|
||||||
"output.createBuffer|param|size": "number of bytes in the buffer",
|
|
||||||
"screen.clear": "Clear screen and reset font to normal.",
|
|
||||||
"screen.imageOf": "Makes an image bound to a buffer.",
|
|
||||||
"screen.unpackPNG": "Decompresses a 1-bit gray scale PNG image to image format.",
|
|
||||||
"serial": "Reading and writing data over a serial connection.",
|
|
||||||
"serial.writeDmesg": "Send DMESG debug buffer over serial."
|
|
||||||
}
|
|
@ -1,102 +0,0 @@
|
|||||||
{
|
|
||||||
"ButtonEvent.Click|block": "click",
|
|
||||||
"ButtonEvent.Down|block": "down",
|
|
||||||
"ButtonEvent.Up|block": "up",
|
|
||||||
"LightsPattern.GreenFlash|block": "Flashing Green",
|
|
||||||
"LightsPattern.GreenPulse|block": "Pulsing Green",
|
|
||||||
"LightsPattern.Green|block": "Green",
|
|
||||||
"LightsPattern.Off|block": "Off",
|
|
||||||
"LightsPattern.OrangeFlash|block": "Flashing Orange",
|
|
||||||
"LightsPattern.OrangePulse|block": "Pulsing Orange",
|
|
||||||
"LightsPattern.Orange|block": "Orange",
|
|
||||||
"LightsPattern.RedFlash|block": "Flashing Red",
|
|
||||||
"LightsPattern.RedPulse|block": "Pulsing Red",
|
|
||||||
"LightsPattern.Red|block": "Red",
|
|
||||||
"MoveUnit.Degrees|block": "degrees",
|
|
||||||
"MoveUnit.MilliSeconds|block": "milliseconds",
|
|
||||||
"MoveUnit.Rotations|block": "rotations",
|
|
||||||
"MoveUnit.Seconds|block": "seconds",
|
|
||||||
"Output.AB|block": "A+B",
|
|
||||||
"Output.AD|block": "A+D",
|
|
||||||
"Output.ALL|block": "All",
|
|
||||||
"Output.A|block": "A",
|
|
||||||
"Output.BC|block": "B+C",
|
|
||||||
"Output.B|block": "B",
|
|
||||||
"Output.CD|block": "C+D",
|
|
||||||
"Output.C|block": "C",
|
|
||||||
"Output.D|block": "D",
|
|
||||||
"brick.Button.isPressed|block": "%button|is pressed",
|
|
||||||
"brick.Button.onEvent|block": "on %button|%event",
|
|
||||||
"brick.Button.pauseUntil|block": "pause until %button|%event",
|
|
||||||
"brick.Button.wasPressed|block": "%button|was pressed",
|
|
||||||
"brick.batteryLevel|block": "battery level",
|
|
||||||
"brick.buttonDown|block": "down",
|
|
||||||
"brick.buttonEnter|block": "enter",
|
|
||||||
"brick.buttonLeft|block": "left",
|
|
||||||
"brick.buttonRight|block": "right",
|
|
||||||
"brick.buttonUp|block": "up",
|
|
||||||
"brick.clearScreen|block": "clear screen",
|
|
||||||
"brick.lightPattern|block": "%pattern",
|
|
||||||
"brick.printPorts|block": "print ports",
|
|
||||||
"brick.setLight|block": "set light to %pattern=led_pattern",
|
|
||||||
"brick.showImage|block": "show image %image=screen_image_picker",
|
|
||||||
"brick.showNumber|block": "show number %name|at line %line",
|
|
||||||
"brick.showString|block": "show string %text|at line %line",
|
|
||||||
"brick.showValue|block": "show value %name|= %text|at line %line",
|
|
||||||
"brick|block": "brick",
|
|
||||||
"console.logValue|block": "console|log value %name|= %value",
|
|
||||||
"console.log|block": "console|log %text",
|
|
||||||
"console.sendToScreen|block": "send console to screen",
|
|
||||||
"console|block": "console",
|
|
||||||
"control.raiseEvent|block": "raise event|from %src|with value %value",
|
|
||||||
"control|block": "control",
|
|
||||||
"motors.Motor.angle|block": "%motor|angle",
|
|
||||||
"motors.Motor.clearCounts|block": "%motor|clear counts",
|
|
||||||
"motors.Motor.speed|block": "%motor|speed",
|
|
||||||
"motors.Motor.tacho|block": "%motor|tacho",
|
|
||||||
"motors.MotorBase.pauseUntilReady|block": "%motor|pause until ready",
|
|
||||||
"motors.MotorBase.setBrake|block": "set %motor|brake %brake",
|
|
||||||
"motors.MotorBase.setReversed|block": "set %motor|reversed %reversed",
|
|
||||||
"motors.MotorBase.setSpeedFor|block": "set %motor|speed to %speed=motorSpeedPicker|%|for %value|%unit",
|
|
||||||
"motors.MotorBase.setSpeed|block": "set %motor|speed to %speed=motorSpeedPicker|%",
|
|
||||||
"motors.SynchedMotorPair.steerFor|block": "steer %chassis|turn ratio %turnRatio|speed %speed=motorSpeedPicker|%|for %value|%unit",
|
|
||||||
"motors.SynchedMotorPair.steer|block": "steer %chassis|turn ratio %turnRatio|speed %speed=motorSpeedPicker|%",
|
|
||||||
"motors.SynchedMotorPair.tankFor|block": "tank %motors|%speedLeft=motorSpeedPicker|%|%speedRight=motorSpeedPicker|%|for %value|%unit",
|
|
||||||
"motors.SynchedMotorPair.tank|block": "tank %motors|%speedLeft=motorSpeedPicker|%|%speedRight=motorSpeedPicker|%",
|
|
||||||
"motors.largeAB|block": "large A+B",
|
|
||||||
"motors.largeAD|block": "large A+D",
|
|
||||||
"motors.largeA|block": "large A",
|
|
||||||
"motors.largeBC|block": "large B+C",
|
|
||||||
"motors.largeB|block": "large B",
|
|
||||||
"motors.largeCD|block": "large C+D",
|
|
||||||
"motors.largeC|block": "large C",
|
|
||||||
"motors.largeD|block": "large D",
|
|
||||||
"motors.mediumA|block": "medium A",
|
|
||||||
"motors.mediumB|block": "medium B",
|
|
||||||
"motors.mediumC|block": "medium C",
|
|
||||||
"motors.mediumD|block": "medium D",
|
|
||||||
"motors.stopAllMotors|block": "stop all motors",
|
|
||||||
"motors|block": "motors",
|
|
||||||
"output|block": "output",
|
|
||||||
"screen|block": "screen",
|
|
||||||
"sensors|block": "sensors",
|
|
||||||
"serial|block": "serial",
|
|
||||||
"{id:category}Brick": "Brick",
|
|
||||||
"{id:category}Console": "Console",
|
|
||||||
"{id:category}Control": "Control",
|
|
||||||
"{id:category}Image": "Image",
|
|
||||||
"{id:category}Images": "Images",
|
|
||||||
"{id:category}MMap": "MMap",
|
|
||||||
"{id:category}Motors": "Motors",
|
|
||||||
"{id:category}Output": "Output",
|
|
||||||
"{id:category}Screen": "Screen",
|
|
||||||
"{id:category}Serial": "Serial",
|
|
||||||
"{id:group}Buttons": "Buttons",
|
|
||||||
"{id:group}Counters": "Counters",
|
|
||||||
"{id:group}Light": "Light",
|
|
||||||
"{id:group}Measured Move": "Measured Move",
|
|
||||||
"{id:group}More": "More",
|
|
||||||
"{id:group}Move": "Move",
|
|
||||||
"{id:group}Screen": "Screen",
|
|
||||||
"{id:group}Sensors": "Sensors"
|
|
||||||
}
|
|