{"pxt.json":"{\r\n    \"name\": \"valon\",\r\n    \"version\": \"1.1.7\",\r\n    \"description\": \"YFRobot Valon MakeCode Extensions For Micro:bit\",\r\n    \"license\": \"MIT\",\r\n    \"dependencies\": {\r\n        \"core\": \"*\",\r\n        \"ws2812b\": \"github:microsoft/pxt-ws2812b#v0.1.1\"\r\n    },\r\n    \"files\": [\r\n        \"main.ts\",\r\n        \"_locales/zh-cn/valon-strings.json\",\r\n        \"_locales/zh-cn/valon-jsdoc-strings.json\",\r\n        \"_locales/zh-tw/valon-strings.json\",\r\n        \"_locales/zh-tw/valon-jsdoc-strings.json\",\r\n        \"README.md\"\r\n    ],\r\n    \"testFiles\": [\r\n        \"test.ts\"\r\n    ],\r\n    \"public\": true,\r\n    \"supportedTargets\": [\r\n        \"microbit\"\r\n    ],\r\n    \"preferredEditor\": \"tsprj\"\r\n}\r\n","main.ts":"/** \n * @file pxt-yfrobot-valon/valon.ts\n * @brief YFROBOT's VALON makecode library.\n * @n This is a MakeCode graphical programming education robot.\n * \n * @copyright    YFROBOT,2020\n * @copyright    MIT Lesser General Public License\n * \n * @author [email](yfrobot@qq.com)\n * @date  2020-07-22\n*/\n\n// ultrasonic pin\nlet valonUltrasonicTrig = DigitalPin.P5\nlet valonUltrasonicEcho = DigitalPin.P11\nlet valon_distanceBuf = 0\n// motor pin \nlet valonMotorLD = DigitalPin.P13\nlet valonMotorLA = AnalogPin.P14\nlet valonMotorRD = DigitalPin.P15\nlet valonMotorRA = AnalogPin.P16\n// patrol pin\nlet valonPatrolLeft = DigitalPin.P1\nlet valonPatrolMiddle = DigitalPin.P2\nlet valonPatrolRight = DigitalPin.P8\n// rgbled pin\nlet valonEyesPin = DigitalPin.P11\n\nenum PingUnit {\n    //% block=\"cm\"\n    Centimeters,\n}\n\n//% color=\"#7BD239\" weight=10 icon=\"\\uf1b0\"\nnamespace valon {\n\n    // IR\n    const MICROBIT_IR_NEC = 777\n    const MICROBIT_IR_BUTTON_PRESSED_ID = 789\n    const MICROBIT_IR_BUTTON_RELEASED_ID = 790\n    const IR_REPEAT = 256\n    const IR_INCOMPLETE = 257\n\n    let irState: IrState\n    interface IrState {\n        protocol: IrProtocol;\n        command: number;\n        hasNewCommand: boolean;\n        bitsReceived: uint8;\n        commandBits: uint8;\n    }\n\n    export enum Motors {\n        //% blockId=\"leftMotor\" block=\"left\"\n        ML = 0,\n        //% blockId=\"rightMotor\" block=\"right\"\n        MR = 1,\n        //% blockId=\"allMotors\" block=\"all\"\n        MAll = 2\n    }\n\n    export enum Dir {\n        //% blockId=\"CW\" block=\"Forward\"\n        CW = 0x0,\n        //% blockId=\"CCW\" block=\"Backward\"\n        CCW = 0x1\n    }\n\n    export enum PatrolEnable {\n        //% blockId=\"PatrolOn\" block=\"ON\"\n        PatrolOn = 0x01,\n        //% blockId=\"PatrolOff\" block=\"OFF\"\n        PatrolOff = 0x00\n    }\n\n    export enum Patrol {\n        //% blockId=\"patrolLeft\" block=\"left\"\n        PatrolLeft = 1,\n        //% blockId=\"patrolMiddle\" block=\"middle\"\n        PatrolMiddle = 2,\n        //% blockId=\"patrolRight\" block=\"right\"\n        PatrolRight = 8\n    }\n\n    export enum LED {\n        //% blockId=\"LEDLeft\" block=\"left\"\n        LEDLeft = 10,\n        //% blockId=\"LEDRight\" block=\"right\"\n        LEDRight = 9,\n        //% blockId=\"LEDAll\" block=\"all\"\n        LEDAll = 0\n    }\n\n    export enum LEDswitch {\n        //% blockId=\"turnOn\" block=\"ON\"\n        turnOn = 0x01,\n        //% blockId=\"turnOff\" block=\"OFF\"\n        turnOff = 0x00\n    }\n\n    /**\n     * Different modes for RGB or RGB+W NeoPixel strips\n     */\n    export enum EyesMode {\n        //% block=\"GRB\"\n        RGB = 1,\n        //% block=\"RGB\"\n        RGB_RGB = 3,\n        //% block=\"RGB+W\"\n        RGBW = 2\n    }\n\n    export enum RGBEYES {\n        //% blockId=\"RGBLEDLeft\" block=\"left\"\n        EyesLeft = 1,\n        //% blockId=\"RGBLEDLeft\" block=\"right\"\n        EyesRight = 0,\n        //% blockId=\"RGBLEDLeft\" block=\"all\"\n        EyesAll = 2\n    }\n    /**\n     * Pre-Defined LED colours\n     */\n    export enum EyesColors {\n        //% block=red\n        Red = 0xff0000,\n        //% block=orange\n        Orange = 0xffa500,\n        //% block=yellow\n        Yellow = 0xffff00,\n        //% block=green\n        Green = 0x00ff00,\n        //% block=blue\n        Blue = 0x0000ff,\n        //% block=indigo\n        Indigo = 0x4b0082,\n        //% block=violet\n        Violet = 0x8a2be2,\n        //% block=purple\n        Purple = 0xff00ff,\n        //% block=white\n        White = 0xffffff,\n        //% block=black\n        Black = 0x000000\n    }\n\n    // IR\n    export enum IrProtocol {\n        //% block=\"Keyestudio\"\n        Keyestudio = 0,\n        //% block=\"NEC\"\n        NEC = 1,\n    }\n\n    export enum IrButtonAction {\n        //% block=\"pressed\"\n        Pressed = 0,\n        //% block=\"released\"\n        Released = 1,\n    }\n\n    export enum IrButton {\n        // any button\n        //% block=\"Any\"\n        Any = -1,\n\n        //IR HANDLE\n        //% block=\"↑\"\n        UP = 0x11,\n        //% block=\"↓\"\n        DOWN = 0x91,\n        //% block=\"←\"\n        LEFT = 0x81,\n        //% block=\"→\"\n        RIGHT = 0xa1,\n        //% block=\"M1\"\n        M1 = 0xe9,\n        //% block=\"M2\"\n        M2 = 0x69,\n        //% block=\"A\"\n        A = 0x21,\n        //% block=\"B\"\n        B = 0x01,\n\n        // MINI IR \n        //% block=\"A\"\n        Mini_A = 0xa2,\n        //% block=\"B\"\n        Mini_B = 0x62,\n        //% block=\"C\"\n        Mini_C = 0xe2,\n        //% block=\"D\"\n        Mini_D = 0x22,\n        //% block=\"︿\"\n        Mini_UP = 0x02,\n        //% block=\"E\"\n        Mini_E = 0xc2,\n        //% block=\"＜\"\n        Mini_Left = 0xe0,\n        //% block=\"۞\"\n        Mini_SET = 0xa8,\n        //% block=\"＞\"\n        Mini_Right = 0x90,\n        //% block=\"0\"\n        Number_0 = 0x68,\n        //% block=\"﹀\"\n        Mini_Down = 0x98,\n        //% block=\"F\"\n        Mini_F = 0xb0,\n        //% block=\"1\"\n        Number_1 = 0x30,\n        //% block=\"2\"\n        Number_2 = 0x18,\n        //% block=\"3\"\n        Number_3 = 0x7a,\n        //% block=\"4\"\n        Number_4 = 0x10,\n        //% block=\"5\"\n        Number_5 = 0x38,\n        //% block=\"6\"\n        Number_6 = 0x5a,\n        //% block=\"7\"\n        Number_7 = 0x42,\n        //% block=\"8\"\n        Number_8 = 0x4a,\n        //% block=\"9\"\n        Number_9 = 0x52,\n    }\n\n    /**\n     * Turn on/off the LEDs.\n     */\n    //% weight=120\n    //% blockId=valon_writeLED block=\"LEDlight |%ledn turn |%ledswitch\"\n    //% ledn.fieldEditor=\"gridpicker\" ledn.fieldOptions.columns=2 \n    //% ledswitch.fieldEditor=\"gridpicker\" ledswitch.fieldOptions.columns=2\n    export function writeLED(ledn: LED, ledswitch: LEDswitch): void {\n        led.enable(false);\n        if (ledn == LED.LEDLeft) {\n            pins.digitalWritePin(DigitalPin.P10, ledswitch);\n        } else if (ledn == LED.LEDRight) {\n            pins.digitalWritePin(DigitalPin.P9, ledswitch);\n        } else if (ledn == LED.LEDAll){\n            pins.digitalWritePin(DigitalPin.P10, ledswitch);\n            pins.digitalWritePin(DigitalPin.P9, ledswitch);\n        } else {\n            return\n        }\n    }\n\n    function clamp(value: number, min: number, max: number): number {\n        return Math.max(Math.min(max, value), min);\n    }\n\n    /**\n     * Set the direction and speed of valon motor.\n     * @param index motor left/right/all\n     * @param direction direction to turn\n     * @param speed speed of motors (0 to 255). eg: 120\n     */\n    //% weight=90\n    //% blockId=valon_motor_MotorRun block=\"motor|%index|move|%direction|at speed|%speed\"\n    //% speed.min=0 speed.max=255\n    //% index.fieldEditor=\"gridpicker\" index.fieldOptions.columns=2\n    //% direction.fieldEditor=\"gridpicker\" direction.fieldOptions.columns=2\n    export function motorRun(index: Motors, direction: Dir, speed: number): void {\n        if (index > 2 || index < 0)\n            return\n\n        speed = clamp(speed, 0, 255) * 4.01;  // 0~255 > 0~1023\n\n        if (index == valon.Motors.ML) {\n            pins.digitalWritePin(valonMotorLD, direction);\n            pins.analogWritePin(valonMotorLA, speed);\n        } else if (index == Motors.MR) {\n            pins.digitalWritePin(valonMotorRD, direction);\n            pins.analogWritePin(valonMotorRA, speed);\n        } else if (index == Motors.MAll) {\n            pins.digitalWritePin(valonMotorRD, direction);\n            pins.analogWritePin(valonMotorRA, speed);\n            pins.digitalWritePin(valonMotorLD, direction);\n            pins.analogWritePin(valonMotorLA, speed);\n        }\n    }\n\n    /**\n     * Stop the valon motor.\n     * @param motor motor ML/MR/MAll. eg: valon.Motors.MAll\n     */\n    //% weight=89\n    //% blockId=valon_motor_motorStop block=\"motor |%motor stop\"\n    //% motor.fieldEditor=\"gridpicker\" motor.fieldOptions.columns=2 \n    export function motorStop(motor: Motors): void {\n        motorRun(motor, 0, 0);\n    }\n\n    /**\n     * Read ultrasonic sensor.\n     */\n    //% blockId=valon_ultrasonic_sensor block=\"read ultrasonic sensor |%unit \"\n    //% weight=80\n    export function Ultrasonic(unit: PingUnit, maxCmDistance = 500): number {\n        // send pulse\n        pins.setPull(valonUltrasonicTrig, PinPullMode.PullNone);\n        pins.digitalWritePin(valonUltrasonicTrig, 0);\n        control.waitMicros(2);\n        pins.digitalWritePin(valonUltrasonicTrig, 1);\n        control.waitMicros(10);\n        pins.digitalWritePin(valonUltrasonicTrig, 0);\n\n        // read pulse\n        // d = pins.pulseIn(valonUltrasonicEcho, PulseValue.High, maxCmDistance * 58);  // 8 / 340 = \n        let d = pins.pulseIn(valonUltrasonicEcho, PulseValue.High, 25000);\n        let ret = d;\n        // filter timeout spikes\n        if (ret == 0 && valon_distanceBuf != 0) {\n            ret = valon_distanceBuf;\n        }\n        valon_distanceBuf = d;\n\n        // return Math.floor(ret * 9 / 6 / 58);\n        return Math.floor(ret / 58);\n        // switch (unit) {\n        //     case ValonPingUnit.Centimeters: return Math.idiv(d, 58);\n        //     default: return d;\n        // }\n    }\n\n    /**\n      * Enable or Disable line tracking sensor.\n      * @param enable line tracking sensor enable signal(0 or 1), eg: valon.PatrolEnable.PatrolOn\n      */\n    //% weight=71\n    //% blockId=valon_Patrol_enable block=\"%enable line tracking sensor\"\n    //% patrol.fieldEditor=\"gridpicker\" patrol.fieldOptions.columns=2 \n    export function enablePatrol(enable: PatrolEnable): void {\n        pins.digitalWritePin(DigitalPin.P12, enable);\n        pins.setPull(DigitalPin.P1, PinPullMode.PullNone)\n        pins.setPull(DigitalPin.P2, PinPullMode.PullNone)\n        pins.setPull(DigitalPin.P8, PinPullMode.PullNone)\n    }\n\n    /**\n      * Read line tracking sensor.\n      * @param patrol patrol sensor number.\n      */\n    //% weight=70\n    //% blockId=valon_read_Patrol block=\"read %patrol line tracking sensor\"\n    //% patrol.fieldEditor=\"gridpicker\" patrol.fieldOptions.columns=2 \n    export function readPatrol(patrol: Patrol): number {\n        if (patrol == Patrol.PatrolLeft) {\n            return pins.digitalReadPin(valonPatrolLeft)\n        } else if (patrol == Patrol.PatrolMiddle) {\n            return pins.digitalReadPin(valonPatrolMiddle)\n        } else if (patrol == Patrol.PatrolRight) {\n            return pins.digitalReadPin(valonPatrolRight)\n        } else {\n            return -1\n        }\n    }\n\n    /**\n     * A NeoPixel strip\n     */\n    export class Strip {\n        buf: Buffer;\n        D_pin: DigitalPin;\n        // TODO: encode as bytes instead of 32bit\n        brightness: number;\n        start: number;          // start offset in LED strip\n        _length: number;        // number of LEDs\n        _mode: EyesMode;\n        _matrixWidth: number;   // number of leds in a matrix - if any\n\n        /**\n         * Set LED to a given color (range 0-255 for r, g, b).\n         * @param eyes_n position of the NeoPixel in the strip\n         * @param rgb RGB color of the LED. \n         */\n        //% blockId=\"valon_set_eyes_color\" block=\"%eyes|show color at %eyes_n|to %rgb=neopixel_colors\"\n        //% eyes.defl=eyes\n        //% weight=60\n        setEyesColor(eyes_n: RGBEYES, rgb: EyesColors): void {\n            if (eyes_n == RGBEYES.EyesAll) {\n                this.setPixelRGB(RGBEYES.EyesLeft, rgb >> 0);\n                this.setPixelRGB(RGBEYES.EyesRight, rgb >> 0);\n            } else {\n                this.setPixelRGB(eyes_n, rgb >> 0);\n            }\n            this.show();\n        }\n\n        /**\n         * Set the brightness of the strip. This flag only applies to future operation.\n         * @param brightness a measure of LED brightness in 0-255. eg: 255\n         */\n        //% blockId=\"valon_eyes_set_brightness\" block=\"%eyes|set brightness %brightness\" \n        //% eyes.defl=eyes\n        //% weight=58\n        setBrightness(brightness: number): void {\n            this.brightness = brightness & 0xff;\n        }\n\n        /**\n         * Turn off all LEDs.\n         * You need to call ``show`` to make the changes visible.\n         */\n        //% blockId=\"valon_eyes_clear\" block=\"%eyes|clear\"\n        //% eyes.defl=eyes\n        //% weight=55\n        clear(): void {\n            const stride = this._mode === EyesMode.RGBW ? 4 : 3;\n            this.buf.fill(0, this.start * stride, this._length * stride);\n        }\n\n        /**\n         * Send all the changes to the eyes.\n         */\n        //% blockId=\"eyes_show\" block=\"%eyes|show\" \n        //% eyes.defl=eyes\n        //% weight=35\n        //% advanced=true\n        show() {\n            // only supported in beta\n            // ws2812b.setBufferMode(this.pin, this._mode);\n            ws2812b.sendBuffer(this.buf, this.D_pin);\n        }\n\n        /**\n         * Shows all LEDs to a given color (range 0-255 for r, g, b).\n         * @param rgb RGB color of the LED. \n         */\n        //% blockId=\"eyes_set_color\" block=\"%eyes|show color %rgb=neopixel_colors\"\n        //% eyes.defl=eyes\n        //% weight=40\n        //% advanced=true\n        showColor(rgb: number) {\n            rgb = rgb >> 0;\n            this.setAllRGB(rgb);\n            this.show();\n        }\n\n        /**\n         * Set LED to a given color (range 0-255 for r, g, b).\n         * You need to call ``show`` to make the changes visible.\n         * @param pixeloffset position of the NeoPixel in the eyes. eg: 1\n         * @param rgb RGB color of the LED. \n         */\n        //% blockId=\"eyes_set_pixel_color\" block=\"%eyes|set pixel color at %pixeloffset|to %rgb=neopixel_colors\"\n        //% eyes.defl=eyes\n        //% weight=38\n        //% advanced=true\n        setPixelColor(pixeloffset: number, rgb: number): void {\n            this.setPixelRGB(pixeloffset >> 0, rgb >> 0);\n        }\n\n        /**\n         * Set the pin where the neopixel is connected, defaults to P11.\n         */\n        setPin(pin: DigitalPin): void {\n            this.D_pin = pin;\n            pins.digitalWritePin(this.D_pin, 0);\n            // don't yield to avoid races on initialization\n        }\n\n        private setBufferRGB(offset: number, red: number, green: number, blue: number): void {\n            if (this._mode === EyesMode.RGB_RGB) {\n                this.buf[offset + 0] = red;\n                this.buf[offset + 1] = green;\n            } else {\n                this.buf[offset + 0] = green;\n                this.buf[offset + 1] = red;\n            }\n            this.buf[offset + 2] = blue;\n        }\n\n        private setAllRGB(rgb: number) {\n            let red = unpackR(rgb);\n            let green = unpackG(rgb);\n            let blue = unpackB(rgb);\n\n            const br = this.brightness;\n            if (br < 255) {\n                red = (red * br) >> 8;\n                green = (green * br) >> 8;\n                blue = (blue * br) >> 8;\n            }\n            const end = this.start + this._length;\n            const stride = this._mode === EyesMode.RGBW ? 4 : 3;\n            for (let i = this.start; i < end; ++i) {\n                this.setBufferRGB(i * stride, red, green, blue)\n            }\n        }\n        private setPixelRGB(pixeloffset: number, rgb: number): void {\n            if (pixeloffset < 0\n                || pixeloffset >= this._length)\n                return;\n\n            let stride = this._mode === EyesMode.RGBW ? 4 : 3;\n            pixeloffset = (pixeloffset + this.start) * stride;\n\n            let red = unpackR(rgb);\n            let green = unpackG(rgb);\n            let blue = unpackB(rgb);\n\n            let br = this.brightness;\n            if (br < 255) {\n                red = (red * br) >> 8;\n                green = (green * br) >> 8;\n                blue = (blue * br) >> 8;\n            }\n            this.setBufferRGB(pixeloffset, red, green, blue)\n        }\n    }\n\n    /**\n     *  Create a new NeoPixel driver for eye's LEDs.\n     *  @param numleds number of leds in the eyes, eg: 2\n     *  @param mode rgb mode, eg: valon.EyesMode.RGB\n     */\n    //% blockId=\"valon_eyes_create\" block=\"RGBEyes init %numleds|leds as %mode\"\n    //% weight=62  \n    //% blockSetVariable=eyes\n    export function create(numleds: number, mode: EyesMode): Strip {\n        let eyes = new Strip();\n        let stride = mode === EyesMode.RGBW ? 4 : 3;\n        eyes.buf = pins.createBuffer(numleds * stride);\n        eyes.start = 0;\n        eyes._length = numleds;\n        eyes._mode = mode || EyesMode.RGB;\n        eyes._matrixWidth = 0;\n        eyes.setBrightness(128)\n        eyes.setPin(valonEyesPin)\n        return eyes;\n    }\n\n    /**\n    * Gets the RGB value of a known color\n    */\n    //% weight=30  \n    //% blockId=\"neopixel_colors\" block=\"%color\"\n    //% advanced=true\n    export function colors(color: EyesColors): number {\n        return color;\n    }\n\n    /**\n     * Converts red, green, blue channels into a RGB color\n     * @param red value of the red channel between 0 and 255. eg: 255\n     * @param green value of the green channel between 0 and 255. eg: 255\n     * @param blue value of the blue channel between 0 and 255. eg: 255\n     */\n    //% weight=26\n    //% blockId=\"neopixel_rgb\" block=\"red %red|green %green|blue %blue\"\n    //% advanced=true\n    export function rgb(red: number, green: number, blue: number): number {\n        return packRGB(red, green, blue);\n    }\n\n    function packRGB(a: number, b: number, c: number): number {\n        return ((a & 0xFF) << 16) | ((b & 0xFF) << 8) | (c & 0xFF);\n    }\n    function unpackR(rgb: number): number {\n        let r = (rgb >> 16) & 0xFF;\n        return r;\n    }\n    function unpackG(rgb: number): number {\n        let g = (rgb >> 8) & 0xFF;\n        return g;\n    }\n    function unpackB(rgb: number): number {\n        let b = (rgb) & 0xFF;\n        return b;\n    }\n\n    /**\n     * Converts a hue saturation luminosity value into a RGB color\n     * @param h hue from 0 to 360. eg: 100\n     * @param s saturation from 0 to 99. eg: 50\n     * @param l luminosity from 0 to 99. eg: 50\n     */\n    //% blockId=neopixelHSL block=\"hue %h|saturation %s|luminosity %l\"\n    //% advanced=true\n    //% weight=20\n    export function hsl(h: number, s: number, l: number): number {\n        h = Math.round(h);\n        s = Math.round(s);\n        l = Math.round(l);\n\n        h = h % 360;\n        s = Math.clamp(0, 99, s);\n        l = Math.clamp(0, 99, l);\n        let c = Math.idiv((((100 - Math.abs(2 * l - 100)) * s) << 8), 10000); //chroma, [0,255]\n        let h1 = Math.idiv(h, 60);//[0,6]\n        let h2 = Math.idiv((h - h1 * 60) * 256, 60);//[0,255]\n        let temp = Math.abs((((h1 % 2) << 8) + h2) - 256);\n        let x = (c * (256 - (temp))) >> 8;//[0,255], second largest component of this color\n        let r$: number;\n        let g$: number;\n        let b$: number;\n        if (h1 == 0) {\n            r$ = c; g$ = x; b$ = 0;\n        } else if (h1 == 1) {\n            r$ = x; g$ = c; b$ = 0;\n        } else if (h1 == 2) {\n            r$ = 0; g$ = c; b$ = x;\n        } else if (h1 == 3) {\n            r$ = 0; g$ = x; b$ = c;\n        } else if (h1 == 4) {\n            r$ = x; g$ = 0; b$ = c;\n        } else if (h1 == 5) {\n            r$ = c; g$ = 0; b$ = x;\n        }\n        let m = Math.idiv((Math.idiv((l * 2 << 8), 100) - c), 2);\n        let r = r$ + m;\n        let g = g$ + m;\n        let b = b$ + m;\n        return packRGB(r, g, b);\n    }\n\n    export enum HueInterpolationDirection {\n        Clockwise,\n        CounterClockwise,\n        Shortest\n    }\n\n    /***************** IR *******************/\n    \n    function pushBit(bit: number): number {\n        irState.bitsReceived += 1;\n        if (irState.bitsReceived <= 8) {\n            // ignore all address bits\n            if (irState.protocol === IrProtocol.Keyestudio && bit === 1) {\n                // recover from missing message bits at the beginning\n                // Keyestudio address is 0 and thus missing bits can be easily detected\n                // by checking for the first inverse address bit (which is a 1)\n                irState.bitsReceived = 9;\n            }\n            return IR_INCOMPLETE;\n        }\n        if (irState.bitsReceived <= 16) {\n            // ignore all inverse address bits\n            return IR_INCOMPLETE;\n        } else if (irState.bitsReceived < 24) {\n            irState.commandBits = (irState.commandBits << 1) + bit;\n            return IR_INCOMPLETE;\n        } else if (irState.bitsReceived === 24) {\n            irState.commandBits = (irState.commandBits << 1) + bit;\n            return irState.commandBits & 0xff;\n        } else {\n            // ignore all inverse command bits\n            return IR_INCOMPLETE;\n        }\n    }\n\n    function detectCommand(markAndSpace: number): number {\n        if (markAndSpace < 1600) {\n            // low bit\n            return pushBit(0);\n        } else if (markAndSpace < 2700) {\n            // high bit\n            return pushBit(1);\n        }\n\n        irState.bitsReceived = 0;\n\n        if (markAndSpace < 12500) {\n            // Repeat detected\n            return IR_REPEAT;\n        } else if (markAndSpace < 14500) {\n            // Start detected\n            return IR_INCOMPLETE;\n        } else {\n            return IR_INCOMPLETE;\n        }\n    }\n\n    function enableIrMarkSpaceDetection(pin: DigitalPin) {\n        pins.setPull(pin, PinPullMode.PullNone);\n\n        let mark = 0;\n        let space = 0;\n\n        pins.onPulsed(pin, PulseValue.Low, () => {\n            // HIGH, see https://github.com/microsoft/pxt-microbit/issues/1416\n            mark = pins.pulseDuration();\n        });\n\n        pins.onPulsed(pin, PulseValue.High, () => {\n            // LOW\n            space = pins.pulseDuration();\n            const command = detectCommand(mark + space);\n            if (command !== IR_INCOMPLETE) {\n                control.raiseEvent(MICROBIT_IR_NEC, command);\n            }\n        });\n    }\n\n    /**\n     * Connects to the IR receiver module at the specified pin and configures the IR protocol.\n     * @param pin IR receiver pin. eg: DigitalPin.P3\n     * @param protocol IR protocol. eg: valon.IrProtocol.NEC\n     */\n    //% subcategory=\"IR_Receiver\"\n    //% blockId=\"valon_infrared_connect_receiver\"\n    //% block=\"connect IR receiver at pin %pin and decode %protocol\"\n    //% pin.fieldEditor=\"gridpicker\"\n    //% pin.fieldOptions.columns=4\n    //% pin.fieldOptions.tooltips=\"false\"\n    //% weight=15\n    export function connectIrReceiver(pin: DigitalPin, protocol: IrProtocol): void {\n        if (irState) {\n            return;\n        }\n\n        irState = {\n            protocol: protocol,\n            bitsReceived: 0,\n            commandBits: 0,\n            command: IrButton.Any,\n            hasNewCommand: false,\n        };\n\n        enableIrMarkSpaceDetection(pin);\n\n        let activeCommand = IR_INCOMPLETE;\n        let repeatTimeout = 0;\n        const REPEAT_TIMEOUT_MS = 120;\n\n        control.onEvent(\n            MICROBIT_IR_NEC,\n            EventBusValue.MICROBIT_EVT_ANY,\n            () => {\n                const necValue = control.eventValue();\n\n                // Refresh repeat timer\n                if (necValue <= 255 || necValue === IR_REPEAT) {\n                    repeatTimeout = input.runningTime() + REPEAT_TIMEOUT_MS;\n                }\n\n                // Process a new command\n                if (necValue <= 255 && necValue !== activeCommand) {\n                    if (activeCommand >= 0) {\n                        control.raiseEvent(\n                            MICROBIT_IR_BUTTON_RELEASED_ID,\n                            activeCommand\n                        );\n                    }\n\n                    irState.hasNewCommand = true;\n                    irState.command = necValue;\n                    activeCommand = necValue;\n                    control.raiseEvent(MICROBIT_IR_BUTTON_PRESSED_ID, necValue);\n                }\n            }\n        );\n\n        control.inBackground(() => {\n            while (true) {\n                if (activeCommand === IR_INCOMPLETE) {\n                    // sleep to save CPU cylces\n                    basic.pause(2 * REPEAT_TIMEOUT_MS);\n                } else {\n                    const now = input.runningTime();\n                    if (now > repeatTimeout) {\n                        // repeat timed out\n                        control.raiseEvent(\n                            MICROBIT_IR_BUTTON_RELEASED_ID,\n                            activeCommand\n                        );\n                        activeCommand = IR_INCOMPLETE;\n                    } else {\n                        basic.pause(REPEAT_TIMEOUT_MS);\n                    }\n                }\n            }\n        });\n    }\n\n    /**\n     * Do something when a specific button is pressed or released on the remote control.\n     * @param button the button to be checked\n     * @param action the trigger action\n     * @param handler body code to run when event is raised\n     */\n    //% subcategory=\"IR_Receiver\"\n    //% blockId=valon_infrared_on_ir_button\n    //% block=\"on IR button | %button | %action\"\n    //% button.fieldEditor=\"gridpicker\"\n    //% button.fieldOptions.columns=3\n    //% button.fieldOptions.tooltips=\"false\"\n    //% weight=13\n    export function onIrButton(button: IrButton, action: IrButtonAction, handler: () => void) {\n        control.onEvent(\n            action === IrButtonAction.Pressed\n                ? MICROBIT_IR_BUTTON_PRESSED_ID\n                : MICROBIT_IR_BUTTON_RELEASED_ID,\n            button === IrButton.Any ? EventBusValue.MICROBIT_EVT_ANY : button,\n            () => {\n                irState.command = control.eventValue();\n                handler();\n            }\n        );\n    }\n\n    /**\n     * Returns the code of the IR button that was pressed last. Returns -1 (IrButton.Any) if no button has been pressed yet.\n     */\n    //% subcategory=\"IR_Receiver\"\n    //% blockId=valon_infrared_ir_button_pressed\n    //% block=\"IR button\"\n    //% weight=10\n    export function irButton(): number {\n        if (!irState) {\n            return IrButton.Any;\n        }\n        return irState.command;\n    }\n\n    /**\n     * Returns true if any button was pressed since the last call of this function. False otherwise.\n     */\n    //% subcategory=\"IR_Receiver\"\n    //% blockId=valon_infrared_was_any_button_pressed\n    //% block=\"any IR button was pressed\"\n    //% weight=7\n    export function wasAnyIrButtonPressed(): boolean {\n        if (!irState) {\n            return false;\n        }\n        if (irState.hasNewCommand) {\n            irState.hasNewCommand = false;\n            return true;\n        } else {\n            return false;\n        }\n    }\n\n    /**\n     * Returns the command code of a specific IR button.\n     * @param button the button\n     */\n    //% subcategory=\"IR_Receiver\"\n    //% blockId=valon_infrared_button_code\n    //% button.fieldEditor=\"gridpicker\"\n    //% button.fieldOptions.columns=3\n    //% button.fieldOptions.tooltips=\"false\"\n    //% block=\"IR button code %button\"\n    //% weight=5\n    export function irButtonCode(button: IrButton): number {\n        return button as number;\n    }\n}\n","_locales/zh-cn/valon-strings.json":"{\r\n    \"PingUnit.Centimeters|block\": \"cm\",\r\n    \"valon.Dir.CCW|block\": \"反转\",\r\n    \"valon.Dir.CW|block\": \"正转\",\r\n    \"valon.EyesColors.Black|block\": \"黑\",\r\n    \"valon.EyesColors.Blue|block\": \"蓝\",\r\n    \"valon.EyesColors.Green|block\": \"绿\",\r\n    \"valon.EyesColors.Indigo|block\": \"靛蓝\",\r\n    \"valon.EyesColors.Orange|block\": \"橙\",\r\n    \"valon.EyesColors.Purple|block\": \"紫\",\r\n    \"valon.EyesColors.Red|block\": \"红\",\r\n    \"valon.EyesColors.Violet|block\": \"紫罗兰\",\r\n    \"valon.EyesColors.White|block\": \"白\",\r\n    \"valon.EyesColors.Yellow|block\": \"黄\",\r\n    \"valon.EyesMode.RGBW|block\": \"RGB+W\",\r\n    \"valon.EyesMode.RGB_RGB|block\": \"RGB\",\r\n    \"valon.EyesMode.RGB|block\": \"GRB\",\r\n    \"valon.IrButton.Any|block\": \"Any\",\r\n    \"valon.IrButton.UP|block\": \"↑\",\r\n    \"valon.IrButton.DOWN|block\": \"↓\",\r\n    \"valon.IrButton.LEFT|block\": \"←\",\r\n    \"valon.IrButton.RIGHT|block\": \"→\",\r\n    \"valon.IrButton.M1|block\": \"M1\",\r\n    \"valon.IrButton.M2​​|block\": \"M2\",\r\n    \"valon.IrButton.A|block\": \"A\",\r\n    \"valon.IrButton.B|block\": \"B\",\r\n    \"valon.IrButton.Mini_A|block\": \"A\",\r\n    \"valon.IrButton.Mini_B|block\": \"B\",\r\n    \"valon.IrButton.Mini_C|block\": \"C\",\r\n    \"valon.IrButton.Mini_D|block\": \"D\",\r\n    \"valon.IrButton.Mini_UP|block\": \"︿\",\r\n    \"valon.IrButton.Mini_E|block\": \"E\",\r\n    \"valon.IrButton.Mini_Left|block\": \"＜\",\r\n    \"valon.IrButton.Mini_SET|block\": \"۞\",\r\n    \"valon.IrButton.Mini_Right|block\": \"＞\",\r\n    \"valon.IrButton.Number_0|block\": \"0\",\r\n    \"valon.IrButton.Mini_Down|block\": \"﹀\",\r\n    \"valon.IrButton.Mini_F|block\": \"F\",\r\n    \"valon.IrButton.Number_1|block\": \"1\",\r\n    \"valon.IrButton.Number_2|block\": \"2\",\r\n    \"valon.IrButton.Number_3|block\": \"3\",\r\n    \"valon.IrButton.Number_4|block\": \"4\",\r\n    \"valon.IrButton.Number_5|block\": \"5\",\r\n    \"valon.IrButton.Number_6|block\": \"6\",\r\n    \"valon.IrButton.Number_7|block\": \"7\",\r\n    \"valon.IrButton.Number_8|block\": \"8\",\r\n    \"valon.IrButton.Number_9|block\": \"9\",\r\n    \"valon.IrButtonAction.pressed|block\":\"按下\",\r\n    \"valon.IrButtonAction.released|block\":\"释放\",\r\n    \"valon.IrProtocol.Keyestudio|block\": \"Keyestudio\",\r\n    \"valon.IrProtocol.NEC|block\": \"NEC\",\r\n    \"valon.LED.LEDLeft|block\": \"左侧\",\r\n    \"valon.LED.LEDRight|block\": \"右侧\",\r\n    \"valon.LED.LEDAll|block\": \"双侧\",\r\n    \"valon.LEDswitch.turnOff|block\": \"关闭\",\r\n    \"valon.LEDswitch.turnOn|block\": \"打开\",\r\n    \"valon.Motors.MAll|block\": \"全部\",\r\n    \"valon.Motors.ML|block\": \"左侧\",\r\n    \"valon.Motors.MR|block\": \"右侧\",\r\n    \"valon.PatrolEnable.PatrolOn|block\": \"启用\",\r\n    \"valon.PatrolEnable.PatrolOff|block\": \"禁用\",\r\n    \"valon.Patrol.PatrolLeft|block\": \"左侧\",\r\n    \"valon.Patrol.PatrolMiddle|block\": \"中间\",\r\n    \"valon.Patrol.PatrolRight|block\": \"右侧\",\r\n    \"valon.RGBEYES.EyesAll|block\": \"全部\",\r\n    \"valon.RGBEYES.EyesLeft|block\": \"左侧\",\r\n    \"valon.RGBEYES.EyesRight|block\": \"右侧\",\r\n    \"valon.Strip.clear|block\":\"%eyes|关闭全部\",\r\n    \"valon.Strip.setBrightness|block\":\"%eyes|设置亮度 %brightness\",\r\n    \"valon.Strip.setEyesColor|block\":\"%eyes|在 %eyes_n|显示 %rgb=neopixel_colors\",\r\n    \"valon.Strip.setPixelColor|block\":\"%eyes|设置像素%pixeloffset|颜色为 %rgb=neopixel_colors\",\r\n    \"valon.Strip.showColor|block\":\"%eyes|更新显示颜色 %rgb=neopixel_colors\",\r\n    \"valon.Strip.show|block\":\"%eyes|更新显示\",\r\n    \"valon.Ultrasonic|block\": \"超声波距离|%unit\",\r\n    \"valon.colors|block\": \"%color\",\r\n    \"valon.connectIrReceiver|block\": \"连接红外接收到 %pin| 编码格式：%protocol\",\r\n    \"valon.create|block\":\"RGBEyes初始化 %numleds|颗LED,模式 %mode\",\r\n    \"valon.hsl|block\":\"色相 %h|饱和度 %s|亮度 %l\",\r\n    \"valon.irButtonCode|block\": \"红外按键%button|值\",\r\n    \"valon.irButton|block\": \"红外按键值\",\r\n    \"valon.motorRun|block\": \"电机|%index|方向|%direction|速度|%speed\",\r\n    \"valon.motorStop|block\": \"电机 |%motor 停止\",\r\n    \"valon.onIrButton|block\": \"当红外按键 %button| %action\",\r\n    \"valon.enablePatrol|block\": \"%enable 巡线传感器\",\r\n    \"valon.readPatrol|block\": \"巡线传感器|%patrol\",\r\n    \"valon.rgb|block\":\"红 %red|绿 %green|蓝 %blue\",\r\n    \"valon.wasAnyIrButtonPressed|block\": \"任意按键被按下\",\r\n    \"valon.writeLED|block\": \"LED灯|%ledn|%ledswitch\",\r\n    \"valon|block\": \"Valon\",\r\n    \"{id:category}valon\": \"Valon\",\r\n    \"{id:subcategory}IR_Receiver\": \"红外遥控\"\r\n}","_locales/zh-cn/valon-jsdoc-strings.json":"{\n  \"valon.EyesColors\": \"预定义的LED颜色\",\n  \"valon.EyesMode\": \"RGB或RGB+W NeoPixel条带的不同模式\",\n  \"valon.Strip\": \"NeoPixel带\",\n  \"valon.Strip.clear\": \"关闭所有LED。\\r\\n您需要调用'show'来使更改可见。\",\n  \"valon.Strip.setBrightness\": \"设置条带的亮度。该标志仅适用于将来的操作。\",\n  \"valon.Strip.setBrightness|param|brightness\": \"LED亮度的度量单位为0-255。例如：255\",\n  \"valon.Strip.setEyesColor\": \"将LED设置为给定的颜色（r，g，b的范围为0-255）。\",\n  \"valon.Strip.setEyesColor|param|eyes_n\": \"NeoPixel在条中的位置\",\n  \"valon.Strip.setEyesColor|param|rgb\": \"LED的RGB颜色。\",\n  \"valon.Strip.setPin\": \"设置新像素连接的引脚，默认为P11。\",\n  \"valon.Strip.setPixelColor\": \"将LED设置为给定的颜色（r，g，b的范围为0-255）。\\r\\nYou need to call ``show`` to make the changes visible.\",\n  \"valon.Strip.setPixelColor|param|pixeloffset\": \"NeoPixel在眼睛中的位置。例如：1\",\n  \"valon.Strip.setPixelColor|param|rgb\": \"LED的RGB颜色。\",\n  \"valon.Strip.show\": \"将所有更改发送到眼睛。\",\n  \"valon.Strip.showColor\": \"以给定的颜色显示所有LED（r，g，b的范围为0-255）。\",\n  \"valon.Strip.showColor|param|rgb\": \"LED的RGB颜色。\",\n  \"valon.Ultrasonic\": \"读取超声波传感器。\",\n  \"valon.colors\": \"获取已知颜色的RGB值\",\n  \"valon.connectIrReceiver\": \"在指定的引脚上连接到IR接收器模块并配置IR协议。\",\n  \"valon.connectIrReceiver|param|pin\": \"红外接收器引脚。例如：DigitalPin.P3\",\n  \"valon.connectIrReceiver|param|protocol\": \"红外协议。例如：valon.IrProtocol.NEC\",\n  \"valon.create\": \"为眼睛的LED创建一个新的NeoPixel驱动器。\",\n  \"valon.create|param|mode\": \"rgb模式，例如：valon.EyesMode.RGB\",\n  \"valon.create|param|numleds\": \"眼睛中的LED数量，例如：2\",\n  \"valon.hsl\": \"将色相饱和度亮度值转换为RGB颜色\",\n  \"valon.hsl|param|h\": \"色调从0到360。例如：100\",\n  \"valon.hsl|param|l\": \"亮度从0到99。例如：50\",\n  \"valon.hsl|param|s\": \"饱和度从0到99。例如：50\",\n  \"valon.irButton\": \"返回上次按下的IR按钮的代码。如果尚未按下任何按钮，则返回-1（IrButton.Any）。\",\n  \"valon.irButtonCode\": \"返回特定IR按钮的命令代码。\",\n  \"valon.irButtonCode|param|button\": \"按钮\",\n  \"valon.motorRun\": \"设置valon电动机的方向和速度。\",\n  \"valon.motorRun|param|direction\": \"转向方向\",\n  \"valon.motorRun|param|index\": \"电机左/右/全部\",\n  \"valon.motorRun|param|speed\": \"电机速度（0到255）。例如：120\",\n  \"valon.motorStop\": \"停止valon电机。\",\n  \"valon.onIrButton\": \"当按下或释放遥控器上的特定按钮时，请执行某些操作。\",\n  \"valon.onIrButton|param|action\": \"触发动作\",\n  \"valon.onIrButton|param|button\": \"要检查的按钮\",\n  \"valon.onIrButton|param|handler\": \"引发事件时要运行的正文代码\",\n  \"valon.enablePatrol\": \"启用或禁用巡线传感器。\",\n  \"valon.readPatrol\": \"读取巡线传感器。\",\n  \"valon.readPatrol|param|patrol\": \"巡线传感器编号。\",\n  \"valon.rgb\": \"将红色，绿色，蓝色通道转换为RGB颜色\",\n  \"valon.rgb|param|blue\": \"蓝色通道的值介于0到255之间。例如：255\",\n  \"valon.rgb|param|green\": \"绿色通道的值介于0到255之间。例如：255\",\n  \"valon.rgb|param|red\": \"红色通道的值介于0到255之间。例如：255\",\n  \"valon.wasAnyIrButtonPressed\": \"如果自上次调用此函数以来已按下任何按钮，则返回true。否则为false。\",\n  \"valon.writeLED\": \"打开/关闭LED。\"\n}","_locales/zh-tw/valon-strings.json":"{\r\n    \"PingUnit.Centimeters|block\": \"cm\",\r\n    \"valon.Dir.CCW|block\": \"反轉\",\r\n    \"valon.Dir.CW|block\": \"正轉\",\r\n    \"valon.EyesColors.Black|block\": \"黑\",\r\n    \"valon.EyesColors.Blue|block\": \"藍\",\r\n    \"valon.EyesColors.Green|block\": \"綠\",\r\n    \"valon.EyesColors.Indigo|block\": \"靛藍\",\r\n    \"valon.EyesColors.Orange|block\": \"橙\",\r\n    \"valon.EyesColors.Purple|block\": \"紫\",\r\n    \"valon.EyesColors.Red|block\": \"紅\",\r\n    \"valon.EyesColors.Violet|block\": \"紫羅蘭\",\r\n    \"valon.EyesColors.White|block\": \"白\",\r\n    \"valon.EyesColors.Yellow|block\": \"黃\",\r\n    \"valon.EyesMode.RGBW|block\": \"RGB+W\",\r\n    \"valon.EyesMode.RGB_RGB|block\": \"RGB\",\r\n    \"valon.EyesMode.RGB|block\": \"GRB\",\r\n    \"valon.IrButton.Any|block\": \"Any\",\r\n    \"valon.IrButton.UP|block\": \"↑\",\r\n    \"valon.IrButton.DOWN|block\": \"↓\",\r\n    \"valon.IrButton.LEFT|block\": \"←\",\r\n    \"valon.IrButton.RIGHT|block\": \"→\",\r\n    \"valon.IrButton.M1|block\": \"M1\",\r\n    \"valon.IrButton.M2​​|block\": \"M2\",\r\n    \"valon.IrButton.A|block\": \"A\",\r\n    \"valon.IrButton.B|block\": \"B\",\r\n    \"valon.IrButton.Mini_A|block\": \"A\",\r\n    \"valon.IrButton.Mini_B|block\": \"B\",\r\n    \"valon.IrButton.Mini_C|block\": \"C\",\r\n    \"valon.IrButton.Mini_D|block\": \"D\",\r\n    \"valon.IrButton.Mini_UP|block\": \"︿\",\r\n    \"valon.IrButton.Mini_E|block\": \"E\",\r\n    \"valon.IrButton.Mini_Left|block\": \"＜\",\r\n    \"valon.IrButton.Mini_SET|block\": \"۞\",\r\n    \"valon.IrButton.Mini_Right|block\": \"＞\",\r\n    \"valon.IrButton.Number_0|block\": \"0\",\r\n    \"valon.IrButton.Mini_Down|block\": \"﹀\",\r\n    \"valon.IrButton.Mini_F|block\": \"F\",\r\n    \"valon.IrButton.Number_1|block\": \"1\",\r\n    \"valon.IrButton.Number_2|block\": \"2\",\r\n    \"valon.IrButton.Number_3|block\": \"3\",\r\n    \"valon.IrButton.Number_4|block\": \"4\",\r\n    \"valon.IrButton.Number_5|block\": \"5\",\r\n    \"valon.IrButton.Number_6|block\": \"6\",\r\n    \"valon.IrButton.Number_7|block\": \"7\",\r\n    \"valon.IrButton.Number_8|block\": \"8\",\r\n    \"valon.IrButton.Number_9|block\": \"9\",\r\n    \"valon.IrButtonAction.pressed|block\":\"按下\",\r\n    \"valon.IrButtonAction.released|block\":\"釋放\",\r\n    \"valon.IrProtocol.Keyestudio|block\": \"Keyestudio\",\r\n    \"valon.IrProtocol.NEC|block\": \"NEC\",\r\n    \"valon.LED.LEDLeft|block\": \"左側\",\r\n    \"valon.LED.LEDRight|block\": \"右側\",\r\n    \"valon.LED.LEDAll|block\": \"双側\",\r\n    \"valon.LEDswitch.turnOff|block\": \"關閉\",\r\n    \"valon.LEDswitch.turnOn|block\": \"打開\",\r\n    \"valon.Motors.MAll|block\": \"全部\",\r\n    \"valon.Motors.ML|block\": \"左側\",\r\n    \"valon.Motors.MR|block\": \"右側\",\r\n    \"valon.PatrolEnable.PatrolOn|block\": \"啟用\",\r\n    \"valon.PatrolEnable.PatrolOff|block\": \"禁用\",\r\n    \"valon.Patrol.PatrolLeft|block\": \"左側\",\r\n    \"valon.Patrol.PatrolMiddle|block\": \"中間\",\r\n    \"valon.Patrol.PatrolRight|block\": \"右側\",\r\n    \"valon.RGBEYES.EyesAll|block\": \"全部\",\r\n    \"valon.RGBEYES.EyesLeft|block\": \"左側\",\r\n    \"valon.RGBEYES.EyesRight|block\": \"右側\",\r\n    \"valon.Strip.clear|block\":\"%eyes|關閉全部\",\r\n    \"valon.Strip.setBrightness|block\":\"%eyes|設置亮度 %brightness\",\r\n    \"valon.Strip.setEyesColor|block\":\"%eyes|在 %eyes_n|顯示 %rgb=neopixel_colors\",\r\n    \"valon.Strip.setPixelColor|block\":\"%eyes|設置像素%pixeloffset|顏色為 %rgb=neopixel_colors\",\r\n    \"valon.Strip.showColor|block\":\"%eyes|更新顯示顏色 %rgb=neopixel_colors\",\r\n    \"valon.Strip.show|block\":\"%eyes|更新顯示\",\r\n    \"valon.Ultrasonic|block\": \"超聲波距離|%unit\",\r\n    \"valon.colors|block\": \"%color\",\r\n    \"valon.connectIrReceiver|block\": \"連接紅外接收到 %pin| 編碼格式：%protocol\",\r\n    \"valon.create|block\":\"RGBEyes初始化 %numleds|顆LED,模式 %mode\",\r\n    \"valon.hsl|block\":\"色相 %h|飽和度 %s|亮度 %l\",\r\n    \"valon.irButtonCode|block\": \"紅外按鍵%button|值\",\r\n    \"valon.irButton|block\": \"紅外按鍵值\",\r\n    \"valon.motorRun|block\": \"電機|%index|方向|%direction|速度|%speed\",\r\n    \"valon.motorStop|block\": \"電機 |%motor 停止\",\r\n    \"valon.onIrButton|block\": \"當紅外按鍵 %button| %action\",\r\n    \"valon.enablePatrol|block\": \"%enable 巡線傳感器\",\r\n    \"valon.readPatrol|block\": \"巡線傳感器|%patrol\",\r\n    \"valon.rgb|block\":\"紅 %red|綠 %green|藍 %blue\",\r\n    \"valon.wasAnyIrButtonPressed|block\": \"任意按鍵被按下\",\r\n    \"valon.writeLED|block\": \"LED燈|%ledn|%ledswitch\",\r\n    \"valon|block\": \"Valon\",\r\n    \"{id:category}valon\": \"Valon\",\r\n    \"{id:subcategory}IR_Receiver\": \"紅外遙控\"\r\n}","_locales/zh-tw/valon-jsdoc-strings.json":"{\n  \"valon.EyesColors\": \"預定義的LED顏色\",\n  \"valon.EyesMode\": \"RGB或RGB+W NeoPixel條帶的不同模式\",\n  \"valon.Strip\": \"NeoPixel帶\",\n  \"valon.Strip.clear\": \"關閉所有LED。\\r\\n您需要調用'show'來使更改可見。\",\n  \"valon.Strip.setBrightness\": \"設置條帶的亮度。該標誌僅適用於將來的操作。\",\n  \"valon.Strip.setBrightness|param|brightness\": \"LED亮度的度量單位為0-255。例如：255\",\n  \"valon.Strip.setEyesColor\": \"將LED設置為給定的顏色（r，g，b的範圍為0-255）。\",\n  \"valon.Strip.setEyesColor|param|eyes_n\": \"NeoPixel在條中的位置\",\n  \"valon.Strip.setEyesColor|param|rgb\": \"LED的RGB顏色。\",\n  \"valon.Strip.setPin\": \"設置新像素連接的引腳，默認為P11。\",\n  \"valon.Strip.setPixelColor\": \"將LED設置為給定的顏色（r，g，b的範圍為0-255）。\\r\\nYou need to call ``show`` to make the changes visible.\" ,\n  \"valon.Strip.setPixelColor|param|pixeloffset\": \"NeoPixel在眼睛中的位置。例如：1\",\n  \"valon.Strip.setPixelColor|param|rgb\": \"LED的RGB顏色。\",\n  \"valon.Strip.show\": \"將所有更改發送到眼睛。\",\n  \"valon.Strip.showColor\": \"以給定的顏色顯示所有LED（r，g，b的範圍為0-255）。\",\n  \"valon.Strip.showColor|param|rgb\": \"LED的RGB顏色。\",\n  \"valon.Ultrasonic\": \"讀取超聲波傳感器。\",\n  \"valon.colors\": \"獲取已知顏色的RGB值\",\n  \"valon.connectIrReceiver\": \"在指定的引腳上連接到IR接收器模塊並配置IR協議。\",\n  \"valon.connectIrReceiver|param|pin\": \"紅外接收器引腳。例如：DigitalPin.P3\",\n  \"valon.connectIrReceiver|param|protocol\": \"紅外協議。例如：valon.IrProtocol.NEC\",\n  \"valon.create\": \"為眼睛的LED創建一個新的NeoPixel驅動器。\",\n  \"valon.create|param|mode\": \"rgb模式，例如：valon.EyesMode.RGB\",\n  \"valon.create|param|numleds\": \"眼睛中的LED數量，例如：2\",\n  \"valon.hsl\": \"將色相飽和度亮度值轉換為RGB顏色\",\n  \"valon.hsl|param|h\": \"色調從0到360。例如：100\",\n  \"valon.hsl|param|l\": \"亮度從0到99。例如：50\",\n  \"valon.hsl|param|s\": \"飽和度從0到99。例如：50\",\n  \"valon.irButton\": \"返回上次按下的IR按鈕的代碼。如果尚未按下任何按鈕，則返回-1（IrButton.Any）。\",\n  \"valon.irButtonCode\": \"返回特定IR按鈕的命令代碼。\",\n  \"valon.irButtonCode|param|button\": \"按鈕\",\n  \"valon.motorRun\": \"設置valon電動機的方向和速度。\",\n  \"valon.motorRun|param|direction\": \"轉向方向\",\n  \"valon.motorRun|param|index\": \"電機左/右/全部\",\n  \"valon.motorRun|param|speed\": \"電機速度（0到255）。例如：120\",\n  \"valon.motorStop\": \"停止valon電機。\",\n  \"valon.onIrButton\": \"當按下或釋放遙控器上的特定按鈕時，請執行某些操作。\",\n  \"valon.onIrButton|param|action\": \"觸發動作\",\n  \"valon.onIrButton|param|button\": \"要檢查的按鈕\",\n  \"valon.onIrButton|param|handler\": \"引發事件時要運行的正文代碼\",\n  \"valon.enablePatrol\": \"啟用或禁用巡線傳感器\",\n  \"valon.readPatrol\": \"讀取巡線傳感器。\",\n  \"valon.readPatrol|param|patrol\": \"巡線傳感器編號。\",\n  \"valon.rgb\": \"將紅色，綠色，藍色通道轉換為RGB顏色\",\n  \"valon.rgb|param|blue\": \"藍色通道的值介於0到255之間。例如：255\",\n  \"valon.rgb|param|green\": \"綠色通道的值介於0到255之間。例如：255\",\n  \"valon.rgb|param|red\": \"紅色通道的值介於0到255之間。例如：255\",\n  \"valon.wasAnyIrButtonPressed\": \"如果自上次調用此函數以來已按下任何按鈕，則返回true。否則為false。\",\n  \"valon.writeLED\": \"打開/關閉LED。\"\n}","README.md":" \r\n# Valon-I\r\n\r\n[Valon is an easy-to-use programming educational Robot](http://www.yfrobot.com.cn/wiki/index.php?title=Valon-I)\r\n\r\n[Valon-I](https://item.taobao.com/item.htm?id=620974170340)\r\n\r\n## Basic usage\r\n\r\n* Set the direction and speed of Valon motor\r\n\r\n```blocks\r\n valon.motorRun(valon.Motors.ML, valon.Dir.CW, 120)\r\n valon.motorRun(valon.Motors.MR, valon.Dir.CCW, 120)\r\n```\r\n\r\n* Read ultrasonic sensor\r\n\r\n```blocks\r\nbasic.showNumber(valon.Ultrasonic(PingUnit.Centimeters))\r\n```\r\n\r\n* Stop the Valon motor \r\n\r\n```blocks\r\nvalon.motorStop(valon.Motors.ML)\r\n```\r\n\r\n* Read line tracking sensor\r\n\r\n```blocks\r\nvalon.enablePatrol(valon.PatrolEnable.PatrolOff)\r\nserial.writeNumber(valon.readPatrol(valon.Patrol.PatrolLeft))\r\n```\r\n\r\n* Turn on/off the LEDs\r\n\r\n```blocks\r\nvalon.writeLED(valon.LED.LEDLeft, valon.LEDswitch.turnOn)\r\n```\r\n\r\n* Read IR sensor value\r\n\r\n```blocks\r\nbasic.showNumber(valon.irButtonCode())\r\n```\r\nSupport infrared mini controller and [infrared joystick controller](https://item.taobao.com/item.htm?id=623707734052)\r\n\r\n\r\n## License\r\n\r\nMIT\r\n\r\n\r\n## Supported targets\r\n\r\n* for PXT/microbit\r\n(The metadata above is needed for package search.)\r\n","test.ts":"// Add your code here\nvalon.motorRun(valon.Motors.MAll, valon.Dir.CW, 100)\nbasic.pause(1000)\nvalon.motorRun(valon.Motors.MAll, valon.Dir.CCW, 100)\nbasic.pause(1000)\nvalon.motorStop(valon.Motors.MAll)\n\nvalon.Ultrasonic(0)\n\nlet eyes = valon.create(2, valon.EyesMode.RGB)\neyes.setEyesColor(valon.RGBEYES.EyesLeft, valon.colors(valon.EyesColors.Red))\neyes.setBrightness(255)\nbasic.pause(1000)\neyes.clear()\nvalon.colors(valon.EyesColors.Green)\neyes.showColor(valon.colors(valon.EyesColors.Green))\nbasic.pause(500)\nvalon.rgb(255, 255, 255)\nvalon.hsl(100, 50, 50)\neyes.setPixelColor(1, valon.colors(valon.EyesColors.Blue))\neyes.setPixelColor(0, valon.colors(valon.EyesColors.Blue))\neyes.show()\nbasic.pause(500)\nvalon.connectIrReceiver(DigitalPin.P3, valon.IrProtocol.NEC)"}