diff --git a/libs/core/_locales/core-strings.json b/libs/core/_locales/core-strings.json index c4435c68..70acfb9e 100644 --- a/libs/core/_locales/core-strings.json +++ b/libs/core/_locales/core-strings.json @@ -55,61 +55,61 @@ "motors.Motor.speed|block": "%motor|speed", "motors.Motor.stop|block": "stop %motor", "motors.Motor.tachoCount|block": "%motor|tacho count", - "motors.largeMotorA|block": "`icons.motorLarge` A", - "motors.largeMotorB|block": "`icons.motorLarge` B", - "motors.largeMotorC|block": "`icons.motorLarge` C", - "motors.largeMotorD|block": "`icons.motorLarge` D", - "motors.mediumMotorA|block": "`icons.motorMedium` A", - "motors.mediumMotorB|block": "`icons.motorMedium` B", - "motors.mediumMotorC|block": "`icons.motorMedium` C", - "motors.mediumMotorD|block": "`icons.motorMedium` D", + "motors.largeMotorA|block": "large A", + "motors.largeMotorB|block": "large B", + "motors.largeMotorC|block": "large C", + "motors.largeMotorD|block": "large D", + "motors.mediumMotorA|block": "medium A", + "motors.mediumMotorB|block": "medium B", + "motors.mediumMotorC|block": "medium C", + "motors.mediumMotorD|block": "medium D", "motors.stopAllMotors|block": "stop all motors", "motors|block": "motors", "output|block": "output", "screen|block": "screen", - "sensors.ColorSensor.ambientLight|block": "%color| ambient light", - "sensors.ColorSensor.color|block": "%color| color", - "sensors.ColorSensor.onColorDetected|block": "on %sensor|detected %color", - "sensors.ColorSensor.reflectedLight|block": "%color| reflected light", - "sensors.GyroSensor.angle|block": "%sensor|angle", - "sensors.GyroSensor.rate|block": "%sensor|rotation rate", - "sensors.InfraredSensor.on|block": "on %sensor|%event", - "sensors.InfraredSensor.proximity|block": "%infrared|proximity", - "sensors.InfraredSensor.remoteCommand|block": "%infrared|remote command", - "sensors.InfraredSensor.wait|block": "wait %sensor|for %event", + "sensors.ColorSensor.ambientLight|block": "`icons.colorSensor` %color| ambient light", + "sensors.ColorSensor.color|block": "`icons.colorSensor` %color| color", + "sensors.ColorSensor.onColorDetected|block": "on `icons.colorSensor` %sensor|detected %color", + "sensors.ColorSensor.reflectedLight|block": "`icons.colorSensor` %color| reflected light", + "sensors.GyroSensor.angle|block": "`icons.gyroSensor` %sensor|angle", + "sensors.GyroSensor.rate|block": "`icons.gyroSensor` %sensor|rotation rate", + "sensors.InfraredSensor.on|block": "on `icons.infraredSensor` %sensor|%event", + "sensors.InfraredSensor.proximity|block": "`icons.infraredSensor` %infrared|proximity", + "sensors.InfraredSensor.remoteCommand|block": "`icons.infraredSensor` %infrared|remote command", + "sensors.InfraredSensor.wait|block": "wait `icons.infraredSensor` %sensor|for %event", "sensors.RemoteInfraredBeaconButton.isPressed|block": "%button|is pressed", "sensors.RemoteInfraredBeaconButton.onEvent|block": "on %button|%event", "sensors.RemoteInfraredBeaconButton.wasPressed|block": "%button|was pressed", - "sensors.TouchSensor.isTouched|block": "%sensor|is touched", - "sensors.TouchSensor.onEvent|block": "on %sensor|%event", - "sensors.UltraSonicSensor.distance|block": "%sensor|distance", - "sensors.UltraSonicSensor.on|block": "on %sensor|%event", - "sensors.UltraSonicSensor.wait|block": "wait %sensor|for %event", - "sensors.color1|block": "color sensor 1", - "sensors.color2|block": "color sensor 2", - "sensors.color3|block": "color sensor 3", - "sensors.color4|block": "color sensor 4", - "sensors.gyro1|block": "gyro sensor 1", - "sensors.gyro2|block": "gyro sensor 2", - "sensors.gyro3|block": "gyro sensor 3", - "sensors.gyro4|block": "gyro sensor 4", - "sensors.infraredSensor1|block": "`icons.infraredSensor` 1", - "sensors.infraredSensor2|block": "`icons.infraredSensor` 2", - "sensors.infraredSensor3|block": "`icons.infraredSensor` 3", - "sensors.infraredSensor4|block": "`icons.infraredSensor` 4", + "sensors.TouchSensor.isTouched|block": "`icons.touchSensor` %sensor|is touched", + "sensors.TouchSensor.onEvent|block": "on `icons.touchSensor` %sensor|%event", + "sensors.UltraSonicSensor.distance|block": "`icons.ultrasonicSensor` %sensor|distance", + "sensors.UltraSonicSensor.on|block": "on `icons.ultrasonicSensor` %sensor|%event", + "sensors.UltraSonicSensor.wait|block": "wait `icons.ultrasonicSensor` %sensor|for %event", + "sensors.color1|block": "1", + "sensors.color2|block": "2", + "sensors.color3|block": "3", + "sensors.color4|block": "4", + "sensors.gyro1|block": "1", + "sensors.gyro2|block": "2", + "sensors.gyro3|block": "3", + "sensors.gyro4|block": "4", + "sensors.infraredSensor1|block": "1", + "sensors.infraredSensor2|block": "2", + "sensors.infraredSensor3|block": "3", + "sensors.infraredSensor4|block": "4", "sensors.remoteButtonBottomLeft|block": "remote button bottom-left", "sensors.remoteButtonBottomRight|block": "remote button bottom-right", "sensors.remoteButtonCenter|block": "remote button center", "sensors.remoteButtonTopLeft|block": "remote button top-left", "sensors.remoteButtonTopRight|block": "remote button top-right", - "sensors.touchSensor1|block": "`icons.touchSensor` 1", - "sensors.touchSensor2|block": "`icons.touchSensor` 2", - "sensors.touchSensor3|block": "`icons.touchSensor` 3", - "sensors.touchSensor4|block": "`icons.touchSensor` 4", - "sensors.ultrasonic1|block": "`icons.ultrasonicSensor` 1", - "sensors.ultrasonic2|block": "`icons.ultrasonicSensor` 2", - "sensors.ultrasonic3|block": "`icons.ultrasonicSensor` 3", - "sensors.ultrasonic4|block": "`icons.ultrasonicSensor` 4", + "sensors.touchSensor1|block": "1", + "sensors.touchSensor2|block": "2", + "sensors.touchSensor3|block": "3", + "sensors.touchSensor4|block": "4", + "sensors.ultrasonic1|block": "1", + "sensors.ultrasonic2|block": "2", + "sensors.ultrasonic3|block": "3", + "sensors.ultrasonic4|block": "4", "sensors|block": "sensors", "serial|block": "serial", "{id:category}Brick": "Brick", diff --git a/libs/core/color.ts b/libs/core/color.ts index b334d4a6..77308481 100644 --- a/libs/core/color.ts +++ b/libs/core/color.ts @@ -59,7 +59,7 @@ namespace sensors { * @param handler the code to run when detected */ //% help=input/color/on-color-detected - //% block="on %sensor|detected %color" + //% block="on `icons.colorSensor` %sensor|detected %color" //% blockId=colorOnColorDetected //% parts="colorsensor" //% blockNamespace=sensors @@ -77,7 +77,7 @@ namespace sensors { * @param color the color sensor to query the request */ //% help=input/color/ambient-light - //% block="%color| ambient light" + //% block="`icons.colorSensor` %color| ambient light" //% blockId=colorGetAmbient //% parts="colorsensor" //% blockNamespace=sensors @@ -93,7 +93,7 @@ namespace sensors { * @param color the color sensor to query the request */ //% help=input/color/refelected-light - //% block="%color| reflected light" + //% block="`icons.colorSensor` %color| reflected light" //% blockId=colorGetReflected //% parts="colorsensor" //% blockNamespace=sensors @@ -109,7 +109,7 @@ namespace sensors { * @param color the color sensor to query the request */ //% help=input/color/color - //% block="%color| color" + //% block="`icons.colorSensor` %color| color" //% blockId=colorGetColor //% parts="colorsensor" //% blockNamespace=sensors @@ -121,15 +121,15 @@ namespace sensors { } } - //% whenUsed block="color sensor 3" weight=95 fixedInstance + //% whenUsed block="1" weight=95 fixedInstance + export const color1: ColorSensor = new ColorSensor(1) + + //% whenUsed block="3" weight=90 fixedInstance export const color3: ColorSensor = new ColorSensor(3) - //% whenUsed block="color sensor 1" weight=95 fixedInstance - export const color1: ColorSensor = new ColorSensor(1) - - //% whenUsed block="color sensor 2" weight=95 fixedInstance + //% whenUsed block="2" weight=90 fixedInstance export const color2: ColorSensor = new ColorSensor(2) - //% whenUsed block="color sensor 4" weight=95 fixedInstance + //% whenUsed block="4" weight=90 fixedInstance export const color4: ColorSensor = new ColorSensor(4) } diff --git a/libs/core/gyro.ts b/libs/core/gyro.ts index 74de5b20..2a394cc6 100644 --- a/libs/core/gyro.ts +++ b/libs/core/gyro.ts @@ -24,7 +24,7 @@ namespace sensors { * @param sensor the gyroscope to query the request */ //% help=input/gyro/angle - //% block="%sensor|angle" + //% block="`icons.gyroSensor` %sensor|angle" //% blockId=gyroGetAngle //% parts="gyroscope" //% blockNamespace=sensors @@ -40,7 +40,7 @@ namespace sensors { * @param sensor the gyroscope to query the request */ //% help=input/gyro/rate - //% block="%sensor|rotation rate" + //% block="`icons.gyroSensor` %sensor|rotation rate" //% blockId=gyroGetRate //% parts="gyroscope" //% blockNamespace=sensors @@ -51,16 +51,16 @@ namespace sensors { return this.getNumber(NumberFormat.Int16LE, 0) } } - - //% fixedInstance whenUsed block="gyro sensor 2" - export const gyro2: GyroSensor = new GyroSensor(2) - //% fixedInstance whenUsed block="gyro sensor 1" + //% fixedInstance whenUsed block="1" export const gyro1: GyroSensor = new GyroSensor(1) - //% fixedInstance whenUsed block="gyro sensor 3" + //% fixedInstance whenUsed block="2" weight=95 + export const gyro2: GyroSensor = new GyroSensor(2) + + //% fixedInstance whenUsed block="3" export const gyro3: GyroSensor = new GyroSensor(3) - //% fixedInstance whenUsed block="gyro sensor 4" + //% fixedInstance whenUsed block="4" export const gyro4: GyroSensor = new GyroSensor(4) } diff --git a/libs/core/icons.jres b/libs/core/icons.jres index 38cf5836..2198314e 100644 --- a/libs/core/icons.jres +++ b/libs/core/icons.jres @@ -17,5 +17,11 @@ }, "touchSensor": { "icon": "data:image/png;base64,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" + }, + "gyroSensor": { + "icon": "data:image/png;base64,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" + }, + "colorSensor": { + "icon": "data:image/png;base64,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" } } \ No newline at end of file diff --git a/libs/core/ir.ts b/libs/core/ir.ts index db20425a..ec247342 100644 --- a/libs/core/ir.ts +++ b/libs/core/ir.ts @@ -193,7 +193,7 @@ namespace sensors { * @param handler the code to run when detected */ //% help=input/infrared/on - //% block="on %sensor|%event" + //% block="on `icons.infraredSensor` %sensor|%event" //% blockId=infraredOn //% parts="infraredsensor" //% blockNamespace=sensors @@ -209,7 +209,7 @@ namespace sensors { * Waits for the event to occur */ //% help=input/ultrasonic/wait - //% block="wait %sensor|for %event" + //% block="wait `icons.infraredSensor` %sensor|for %event" //% blockId=infraredwait //% parts="infraredsensor" //% blockNamespace=sensors @@ -224,7 +224,7 @@ namespace sensors { * @param ir the infrared sensor */ //% help=input/infrared/proximity - //% block="%infrared|proximity" + //% block="`icons.infraredSensor` %infrared|proximity" //% blockId=infraredGetProximity //% parts="infrared" //% blockNamespace=sensors @@ -240,7 +240,7 @@ namespace sensors { * @param ir the infrared sensor */ //% help=input/infrared/remote-command - //% block="%infrared|remote command" + //% block="`icons.infraredSensor` %infrared|remote command" //% blockId=infraredGetRemoteCommand //% parts="infrared" //% blockNamespace=sensors @@ -258,16 +258,16 @@ namespace sensors { } } - //% fixedInstance whenUsed block="`icons.infraredSensor` 1" + //% fixedInstance whenUsed block="1" export const infraredSensor1: InfraredSensor = new InfraredSensor(1) - //% fixedInstance whenUsed block="`icons.infraredSensor` 2" + //% fixedInstance whenUsed block="2" export const infraredSensor2: InfraredSensor = new InfraredSensor(2) - //% fixedInstance whenUsed block="`icons.infraredSensor` 3" + //% fixedInstance whenUsed block="3" export const infraredSensor3: InfraredSensor = new InfraredSensor(3) - //% fixedInstance whenUsed block="`icons.infraredSensor` 4" + //% fixedInstance whenUsed block="4" export const infraredSensor4: InfraredSensor = new InfraredSensor(4) diff --git a/libs/core/jres/icons/colorSensor-icon.png b/libs/core/jres/icons/colorSensor-icon.png new file mode 100644 index 00000000..82c7cf03 Binary files /dev/null and b/libs/core/jres/icons/colorSensor-icon.png differ diff --git a/libs/core/jres/icons/gyroSensor-icon.png b/libs/core/jres/icons/gyroSensor-icon.png new file mode 100644 index 00000000..0f5cc8a9 Binary files /dev/null and b/libs/core/jres/icons/gyroSensor-icon.png differ diff --git a/libs/core/output.ts b/libs/core/output.ts index dc912b75..4a87e043 100644 --- a/libs/core/output.ts +++ b/libs/core/output.ts @@ -216,28 +216,28 @@ namespace motors { } } - //% whenUsed fixedInstance block="`icons.motorLarge` A" + //% whenUsed fixedInstance block="large A" export const largeMotorA = new Motor(Output.A, true); - //% whenUsed fixedInstance block="`icons.motorLarge` B" + //% whenUsed fixedInstance block="large B" export const largeMotorB = new Motor(Output.B, true); - //% whenUsed fixedInstance block="`icons.motorLarge` C" + //% whenUsed fixedInstance block="large C" export const largeMotorC = new Motor(Output.C, true); - //% whenUsed fixedInstance block="`icons.motorLarge` D" + //% whenUsed fixedInstance block="large D" export const largeMotorD = new Motor(Output.D, true); - //% whenUsed fixedInstance block="`icons.motorMedium` A" + //% whenUsed fixedInstance block="medium A" export const mediumMotorA = new Motor(Output.A, false); - //% whenUsed fixedInstance block="`icons.motorMedium` B" + //% whenUsed fixedInstance block="medium B" export const mediumMotorB = new Motor(Output.B, false); - //% whenUsed fixedInstance block="`icons.motorMedium` C" + //% whenUsed fixedInstance block="medium C" export const mediumMotorC = new Motor(Output.C, false); - //% whenUsed fixedInstance block="`icons.motorMedium` D" + //% whenUsed fixedInstance block="medium D" export const mediumMotorD = new Motor(Output.D, false); function reset(out: Output) { diff --git a/libs/core/touch.ts b/libs/core/touch.ts index cc9760c4..119bc80d 100644 --- a/libs/core/touch.ts +++ b/libs/core/touch.ts @@ -35,12 +35,28 @@ namespace sensors { return DAL.DEVICE_TYPE_TOUCH } + /** + * Do something when a touch sensor is touched... + * @param sensor the touch sensor that needs to be clicked or used + * @param event the kind of button gesture that needs to be detected + * @param body code to run when the event is raised + */ + //% help=input/touch/on-event + //% blockId=touchEvent block="on `icons.touchSensor` %sensor|%event" + //% parts="touch" + //% blockNamespace=sensors + //% weight=99 blockGap=8 + //% group="Touch Sensor" + onEvent(ev: TouchSensorEvent, body: () => void) { + this.button.onEvent(ev, body) + } + /** * Check if touch sensor is touched. * @param sensor the port to query the request */ //% help=input/touch/is-touched - //% block="%sensor|is touched" + //% block="`icons.touchSensor` %sensor|is touched" //% blockId=touchIsTouched //% parts="touch" //% blockNamespace=sensors @@ -49,30 +65,14 @@ namespace sensors { isTouched() { return this.button.isPressed(); } - - /** - * Do something when a touch sensor is touched... - * @param sensor the touch sensor that needs to be clicked or used - * @param event the kind of button gesture that needs to be detected - * @param body code to run when the event is raised - */ - //% help=input/touch/on-event - //% blockId=touchEvent block="on %sensor|%event" - //% parts="touch" - //% blockNamespace=sensors - //% weight=99 blockGap=8 - //% group="Touch Sensor" - onEvent(ev: TouchSensorEvent, body: () => void) { - this.button.onEvent(ev, body) - } } - //% whenUsed block="`icons.touchSensor` 1" weight=95 fixedInstance + //% whenUsed block="1" weight=95 fixedInstance export const touchSensor1: TouchSensor = new TouchSensor(1) - //% whenUsed block="`icons.touchSensor` 2" weight=95 fixedInstance + //% whenUsed block="2" weight=95 fixedInstance export const touchSensor2: TouchSensor = new TouchSensor(2) - //% whenUsed block="`icons.touchSensor` 3" weight=95 fixedInstance + //% whenUsed block="3" weight=95 fixedInstance export const touchSensor3: TouchSensor = new TouchSensor(3) - //% whenUsed block="`icons.touchSensor` 4" weight=95 fixedInstance + //% whenUsed block="4" weight=95 fixedInstance export const touchSensor4: TouchSensor = new TouchSensor(4) } diff --git a/libs/core/ultrasonic.ts b/libs/core/ultrasonic.ts index d131e70d..069bb664 100644 --- a/libs/core/ultrasonic.ts +++ b/libs/core/ultrasonic.ts @@ -41,9 +41,9 @@ namespace sensors { * @param handler the code to run when detected */ //% help=input/ultrasonic/on - //% block="on %sensor|%event" //% blockId=ultrasonicOn - //% parts="infraredsensor" + //% block="on `icons.ultrasonicSensor` %sensor|%event" + //% parts="ultrasonicsensor" //% blockNamespace=sensors //% weight=100 blockGap=8 //% group="Ultrasonic Sensor" @@ -58,9 +58,9 @@ namespace sensors { * Waits for the event to occur */ //% help=input/ultrasonic/wait - //% block="wait %sensor|for %event" + //% block="wait `icons.ultrasonicSensor` %sensor|for %event" //% blockId=ultrasonicWait - //% parts="infraredsensor" + //% parts="ultrasonicsensor" //% blockNamespace=sensors //% weight=99 blockGap=8 //% group="Ultrasonic Sensor" @@ -73,9 +73,9 @@ namespace sensors { * @param sensor the ultrasonic sensor port */ //% help=input/ultrasonic/distance - //% block="%sensor|distance" + //% block="`icons.ultrasonicSensor` %sensor|distance" //% blockId=sonarGetDistance - //% parts="ultrasonic" + //% parts="ultrasonicsensor" //% blockNamespace=sensors //% weight=65 blockGap=8 //% group="Ultrasonic Sensor" @@ -86,15 +86,15 @@ namespace sensors { } } - //% fixedInstance whenUsed block="`icons.ultrasonicSensor` 1" + //% fixedInstance whenUsed block="1" export const ultrasonic1: UltraSonicSensor = new UltraSonicSensor(1) - //% fixedInstance whenUsed block="`icons.ultrasonicSensor` 4" + //% fixedInstance whenUsed block="4" export const ultrasonic4: UltraSonicSensor = new UltraSonicSensor(4) - //% fixedInstance whenUsed block="`icons.ultrasonicSensor` 2" + //% fixedInstance whenUsed block="2" export const ultrasonic2: UltraSonicSensor = new UltraSonicSensor(2) - //% fixedInstance whenUsed block="`icons.ultrasonicSensor` 3" + //% fixedInstance whenUsed block="3" export const ultrasonic3: UltraSonicSensor = new UltraSonicSensor(3) }