Pulling updates from master (#951)
* show ports on start * don't run show ports automatically * polarity in synched motor (#945) * account for polarity * more comments * handle dual motor in runtime * invert steer * don't use firmware polarity * add block to stop program (#943) * add block to stop program * renaming * fix translation
This commit is contained in:
		
							
								
								
									
										18
									
								
								docs/reference/brick/exit-program.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								docs/reference/brick/exit-program.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,18 @@
 | 
				
			|||||||
 | 
					# exit Program
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Stops the program and returns to the brick menu
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```sig
 | 
				
			||||||
 | 
					brick.exitProgram();
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Example
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Do a sequence of motor commands and stop the program.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```blocks
 | 
				
			||||||
 | 
					motors.largeA.run(50)
 | 
				
			||||||
 | 
					pause(500)
 | 
				
			||||||
 | 
					motors.stopAll()
 | 
				
			||||||
 | 
					brick.exitProgram();
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
@@ -149,9 +149,9 @@ export class FieldMotors extends Blockly.FieldDropdown implements Blockly.FieldC
 | 
				
			|||||||
    getFirstValueI11n(value: string) {
 | 
					    getFirstValueI11n(value: string) {
 | 
				
			||||||
        const firstValue = this.getFirstValue(value);
 | 
					        const firstValue = this.getFirstValue(value);
 | 
				
			||||||
        const motorOptions = {
 | 
					        const motorOptions = {
 | 
				
			||||||
            'medium motor': lf('medium motor'),
 | 
					            'medium motor': lf("medium motor"),
 | 
				
			||||||
            'large motor': lf('large motor'),
 | 
					            'large motor': lf("large motor"),
 | 
				
			||||||
            'large motors': lf('large motors')
 | 
					            'large motors': lf("large motors")
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return motorOptions[firstValue];
 | 
					        return motorOptions[firstValue];
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,6 +26,7 @@ namespace brick {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    //% blockId=brickBatteryProperty block="battery %property"
 | 
					    //% blockId=brickBatteryProperty block="battery %property"
 | 
				
			||||||
    //% group="Battery"
 | 
					    //% group="Battery"
 | 
				
			||||||
 | 
					    //% blockGap=8
 | 
				
			||||||
    //% help=brick/battery-property
 | 
					    //% help=brick/battery-property
 | 
				
			||||||
    export function batteryInfo(property: BatteryProperty): number {
 | 
					    export function batteryInfo(property: BatteryProperty): number {
 | 
				
			||||||
        const info = sensors.internal.getBatteryInfo();
 | 
					        const info = sensors.internal.getBatteryInfo();
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -85,7 +85,7 @@ namespace brick {
 | 
				
			|||||||
        //% blockId=buttonIsPressed
 | 
					        //% blockId=buttonIsPressed
 | 
				
			||||||
        //% parts="brick"
 | 
					        //% parts="brick"
 | 
				
			||||||
        //% blockNamespace=brick
 | 
					        //% blockNamespace=brick
 | 
				
			||||||
        //% weight=81 blockGap=8
 | 
					        //% weight=81
 | 
				
			||||||
        //% group="Buttons"
 | 
					        //% group="Buttons"
 | 
				
			||||||
        //% button.fieldEditor="brickbuttons"
 | 
					        //% button.fieldEditor="brickbuttons"
 | 
				
			||||||
        isPressed() {
 | 
					        isPressed() {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -104,7 +104,7 @@ namespace sensors.internal {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function init() {
 | 
					    export function init() {
 | 
				
			||||||
        if (sensorInfos) return
 | 
					        if (sensorInfos) return
 | 
				
			||||||
        sensorInfos = []
 | 
					        sensorInfos = []
 | 
				
			||||||
        for (let i = 0; i < DAL.NUM_INPUTS; ++i) sensorInfos.push(new SensorInfo(i))
 | 
					        for (let i = 0; i < DAL.NUM_INPUTS; ++i) sensorInfos.push(new SensorInfo(i))
 | 
				
			||||||
@@ -137,6 +137,7 @@ namespace sensors.internal {
 | 
				
			|||||||
        buf[UartCtlOff.Port] = port
 | 
					        buf[UartCtlOff.Port] = port
 | 
				
			||||||
        buf[UartCtlOff.Mode] = mode
 | 
					        buf[UartCtlOff.Mode] = mode
 | 
				
			||||||
        uartMM.ioctl(IO.UART_READ_MODE_INFO, buf)
 | 
					        uartMM.ioctl(IO.UART_READ_MODE_INFO, buf)
 | 
				
			||||||
 | 
					        control.dmesg(`UART_READ_MODE_INFO ${buf.toHex()}`)
 | 
				
			||||||
        return buf
 | 
					        return buf
 | 
				
			||||||
        //let info = `t:${buf[TypesOff.Type]} c:${buf[TypesOff.Connection]} m:${buf[TypesOff.Mode]} n:${buf.slice(0, 12).toHex()}`
 | 
					        //let info = `t:${buf[TypesOff.Type]} c:${buf[TypesOff.Connection]} m:${buf[TypesOff.Mode]} n:${buf.slice(0, 12).toHex()}`
 | 
				
			||||||
        //serial.writeLine("UART " + port + " / " + mode + " - " + info)
 | 
					        //serial.writeLine("UART " + port + " / " + mode + " - " + info)
 | 
				
			||||||
@@ -558,7 +559,7 @@ void      cUiUpdatePower(void)
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function setUartModes() {
 | 
					    function setUartModes() {
 | 
				
			||||||
        control.dmesg(`UART set modes`)
 | 
					        control.dmesg(`UART set modes ${devcon.toHex()}`)
 | 
				
			||||||
        uartMM.ioctl(IO.UART_SET_CONN, devcon)
 | 
					        uartMM.ioctl(IO.UART_SET_CONN, devcon)
 | 
				
			||||||
        const ports: number[] = [];
 | 
					        const ports: number[] = [];
 | 
				
			||||||
        for (let port = 0; port < DAL.NUM_INPUTS; ++port) {
 | 
					        for (let port = 0; port < DAL.NUM_INPUTS; ++port) {
 | 
				
			||||||
@@ -570,7 +571,7 @@ void      cUiUpdatePower(void)
 | 
				
			|||||||
        while (ports.length) {
 | 
					        while (ports.length) {
 | 
				
			||||||
            const port = ports.pop();
 | 
					            const port = ports.pop();
 | 
				
			||||||
            const status = waitNonZeroUartStatus(port)
 | 
					            const status = waitNonZeroUartStatus(port)
 | 
				
			||||||
            control.dmesg(`UART set mode ${status} at ${port}`);
 | 
					            control.dmesg(`UART status ${status} at ${port}`);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -586,6 +587,7 @@ void      cUiUpdatePower(void)
 | 
				
			|||||||
        while (true) {
 | 
					        while (true) {
 | 
				
			||||||
            if (port < 0) return
 | 
					            if (port < 0) return
 | 
				
			||||||
            updateUartMode(port, mode);
 | 
					            updateUartMode(port, mode);
 | 
				
			||||||
 | 
					            control.dmesg(`UART_SET_CONN ${devcon.toHex()}`)
 | 
				
			||||||
            uartMM.ioctl(IO.UART_SET_CONN, devcon)
 | 
					            uartMM.ioctl(IO.UART_SET_CONN, devcon)
 | 
				
			||||||
            let status = waitNonZeroUartStatus(port)
 | 
					            let status = waitNonZeroUartStatus(port)
 | 
				
			||||||
            if (status & UART_PORT_CHANGED) {
 | 
					            if (status & UART_PORT_CHANGED) {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -55,7 +55,7 @@ namespace motors {
 | 
				
			|||||||
        Size = 12
 | 
					        Size = 12
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    function init() {
 | 
					    export function init() {
 | 
				
			||||||
        if (pwmMM) return
 | 
					        if (pwmMM) return
 | 
				
			||||||
        pwmMM = control.mmap("/dev/lms_pwm", 0, 0)
 | 
					        pwmMM = control.mmap("/dev/lms_pwm", 0, 0)
 | 
				
			||||||
        if (!pwmMM) control.fail("no PWM file")
 | 
					        if (!pwmMM) control.fail("no PWM file")
 | 
				
			||||||
@@ -159,6 +159,7 @@ namespace motors {
 | 
				
			|||||||
        private _accelerationTime: number;
 | 
					        private _accelerationTime: number;
 | 
				
			||||||
        private _decelerationSteps: number;
 | 
					        private _decelerationSteps: number;
 | 
				
			||||||
        private _decelerationTime: number;
 | 
					        private _decelerationTime: number;
 | 
				
			||||||
 | 
					        private _inverted: boolean;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        protected static output_types: number[] = [0x7, 0x7, 0x7, 0x7];
 | 
					        protected static output_types: number[] = [0x7, 0x7, 0x7, 0x7];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -176,6 +177,7 @@ namespace motors {
 | 
				
			|||||||
            this._accelerationTime = 0;
 | 
					            this._accelerationTime = 0;
 | 
				
			||||||
            this._decelerationSteps = 0;
 | 
					            this._decelerationSteps = 0;
 | 
				
			||||||
            this._decelerationTime = 0;
 | 
					            this._decelerationTime = 0;
 | 
				
			||||||
 | 
					            this._inverted = false;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
@@ -225,9 +227,11 @@ namespace motors {
 | 
				
			|||||||
        //% help=motors/motor/set-inverted
 | 
					        //% help=motors/motor/set-inverted
 | 
				
			||||||
        setInverted(inverted: boolean) {
 | 
					        setInverted(inverted: boolean) {
 | 
				
			||||||
            this.init();
 | 
					            this.init();
 | 
				
			||||||
            const b = mkCmd(this._port, DAL.opOutputPolarity, 1)
 | 
					            this._inverted = inverted;
 | 
				
			||||||
            b.setNumber(NumberFormat.Int8LE, 2, inverted ? 0 : 1);
 | 
					        }
 | 
				
			||||||
            writePWM(b)
 | 
					
 | 
				
			||||||
 | 
					        protected invertedFactor(): number {
 | 
				
			||||||
 | 
					            return this._inverted ? -1 : 1;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /** 
 | 
					        /** 
 | 
				
			||||||
@@ -294,8 +298,9 @@ namespace motors {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private normalizeSchedule(speed: number, step1: number, step2: number, step3: number, unit: MoveUnit): MoveSchedule {
 | 
					        private normalizeSchedule(speed: number, step1: number, step2: number, step3: number, unit: MoveUnit): MoveSchedule {
 | 
				
			||||||
 | 
					            // motor polarity is not supported at the firmware level for sync motor operations
 | 
				
			||||||
            const r: MoveSchedule = {
 | 
					            const r: MoveSchedule = {
 | 
				
			||||||
                speed: Math.clamp(-100, 100, speed >> 0),
 | 
					                speed: Math.clamp(-100, 100, speed | 0) * this.invertedFactor(),
 | 
				
			||||||
                useSteps: true,
 | 
					                useSteps: true,
 | 
				
			||||||
                steps: [step1 || 0, step2 || 0, step3 || 0]
 | 
					                steps: [step1 || 0, step2 || 0, step3 || 0]
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -562,6 +567,7 @@ namespace motors {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        private __init() {
 | 
					        private __init() {
 | 
				
			||||||
            this.setOutputType(this._large);
 | 
					            this.setOutputType(this._large);
 | 
				
			||||||
 | 
					            this.setInverted(false);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
@@ -741,7 +747,7 @@ namespace motors {
 | 
				
			|||||||
        //% help=motors/synced/steer
 | 
					        //% help=motors/synced/steer
 | 
				
			||||||
        steer(turnRatio: number, speed: number, value: number = 0, unit: MoveUnit = MoveUnit.MilliSeconds) {
 | 
					        steer(turnRatio: number, speed: number, value: number = 0, unit: MoveUnit = MoveUnit.MilliSeconds) {
 | 
				
			||||||
            this.init();
 | 
					            this.init();
 | 
				
			||||||
            speed = Math.clamp(-100, 100, speed >> 0);
 | 
					            speed = Math.clamp(-100, 100, speed >> 0) * this.invertedFactor();
 | 
				
			||||||
            if (!speed) {
 | 
					            if (!speed) {
 | 
				
			||||||
                this.stop();
 | 
					                this.stop();
 | 
				
			||||||
                return;
 | 
					                return;
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										13
									
								
								libs/ev3/brick.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								libs/ev3/brick.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					namespace brick {
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Exits the program to the main menu. (in the simulator restarts it)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    //% blockId=loopstop block="exit program"
 | 
				
			||||||
 | 
					    //% help=reference/brick/exit-program
 | 
				
			||||||
 | 
					    //% weight=10
 | 
				
			||||||
 | 
					    //% blockGap=8
 | 
				
			||||||
 | 
					    //% group="Buttons"
 | 
				
			||||||
 | 
					    export function exitProgram() {
 | 
				
			||||||
 | 
					        control.reset();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
//% color="#68C3E2" weight=100 icon="\uf106"
 | 
					//% color="#68C3E2" weight=100 icon="\uf106"
 | 
				
			||||||
//% groups='["Buttons", "Screen", "Battery"]'
 | 
					//% groups='["Buttons", "Screen", "Power"]'
 | 
				
			||||||
//% labelLineWidth=60
 | 
					//% labelLineWidth=60
 | 
				
			||||||
namespace brick {
 | 
					namespace brick {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@
 | 
				
			|||||||
    "files": [
 | 
					    "files": [
 | 
				
			||||||
        "README.md",        
 | 
					        "README.md",        
 | 
				
			||||||
        "ns.ts",
 | 
					        "ns.ts",
 | 
				
			||||||
 | 
					        "brick.ts",
 | 
				
			||||||
        "startup.ts",
 | 
					        "startup.ts",
 | 
				
			||||||
        "images.jres",
 | 
					        "images.jres",
 | 
				
			||||||
        "images.ts",
 | 
					        "images.ts",
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,9 +2,5 @@
 | 
				
			|||||||
console.addListener(function(msg: string) {
 | 
					console.addListener(function(msg: string) {
 | 
				
			||||||
    control.dmesg(msg.substr(0, msg.length - 1))
 | 
					    control.dmesg(msg.substr(0, msg.length - 1))
 | 
				
			||||||
})
 | 
					})
 | 
				
			||||||
// pulse green, play startup sound, turn off light
 | 
					
 | 
				
			||||||
brick.setStatusLight(StatusLight.GreenPulse);
 | 
					brick.showBoot();
 | 
				
			||||||
// We pause for 100ms to give time to read sensor values, so they work in on_start block
 | 
					 | 
				
			||||||
pause(400)
 | 
					 | 
				
			||||||
// and we're ready
 | 
					 | 
				
			||||||
brick.setStatusLight(StatusLight.Off);
 | 
					 | 
				
			||||||
@@ -129,8 +129,8 @@ namespace brick {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        screenMode = ScreenMode.Ports;
 | 
					        screenMode = ScreenMode.Ports;
 | 
				
			||||||
        renderPorts();
 | 
					        renderPorts();
 | 
				
			||||||
        control.runInParallel(function() {
 | 
					        control.runInParallel(function () {
 | 
				
			||||||
            while(screenMode == ScreenMode.Ports) {
 | 
					            while (screenMode == ScreenMode.Ports) {
 | 
				
			||||||
                renderPorts();
 | 
					                renderPorts();
 | 
				
			||||||
                pause(50);
 | 
					                pause(50);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -140,8 +140,20 @@ namespace brick {
 | 
				
			|||||||
    function renderPorts() {
 | 
					    function renderPorts() {
 | 
				
			||||||
        const col = 44;
 | 
					        const col = 44;
 | 
				
			||||||
        const lineHeight8 = image.font8.charHeight + 2;
 | 
					        const lineHeight8 = image.font8.charHeight + 2;
 | 
				
			||||||
 | 
					        const h = screen.height;
 | 
				
			||||||
 | 
					        const w = screen.width;
 | 
				
			||||||
 | 
					        const blink = (control.millis() >> 5) % (h - 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        clearScreen();
 | 
					        clearScreen();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (let i = 0; i < 4; ++i) {
 | 
				
			||||||
 | 
					            const x = i * col + 2;
 | 
				
			||||||
 | 
					            screen.print("ABCD"[i], x, 1 * lineHeight8, 1, image.font8)
 | 
				
			||||||
 | 
					            screen.print((i + 1).toString(), x, h - lineHeight8, 1, image.font8)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        screen.drawLine(0, 5 * lineHeight8, screen.width, 5 * lineHeight8, 1);
 | 
				
			||||||
 | 
					        screen.drawLine(0, h - 5 * lineHeight8, screen.width, h - 5 * lineHeight8, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        function scale(x: number) {
 | 
					        function scale(x: number) {
 | 
				
			||||||
            if (Math.abs(x) >= 5000) {
 | 
					            if (Math.abs(x) >= 5000) {
 | 
				
			||||||
                const k = Math.floor(x / 1000);
 | 
					                const k = Math.floor(x / 1000);
 | 
				
			||||||
@@ -155,25 +167,38 @@ namespace brick {
 | 
				
			|||||||
        const datas = motors.getAllMotorData();
 | 
					        const datas = motors.getAllMotorData();
 | 
				
			||||||
        for (let i = 0; i < datas.length; ++i) {
 | 
					        for (let i = 0; i < datas.length; ++i) {
 | 
				
			||||||
            const data = datas[i];
 | 
					            const data = datas[i];
 | 
				
			||||||
 | 
					            const x = i * col + 2;
 | 
				
			||||||
            if (!data.actualSpeed && !data.count) continue;
 | 
					            if (!data.actualSpeed && !data.count) continue;
 | 
				
			||||||
            const x = i * col;
 | 
					            screen.print(`${scale(data.actualSpeed)}%`, x, 3 * lineHeight8, 1, image.font8)
 | 
				
			||||||
            screen.print("ABCD"[i], x + 2, 1 * lineHeight8, 1, image.font8)
 | 
					            screen.print(`${scale(data.count)}>`, x, 4 * lineHeight8, 1, image.font8)
 | 
				
			||||||
            screen.print(`${scale(data.actualSpeed)}%`, x + 2, 3 * lineHeight8, 1, image.font8)
 | 
					 | 
				
			||||||
            screen.print(`${scale(data.count)}>`, x + 2, 4 * lineHeight8, 1, image.font8)
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        screen.drawLine(0, 5 * lineHeight8, screen.width, 5 * lineHeight8, 1);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // sensors
 | 
					        // sensors
 | 
				
			||||||
        const sis = sensors.internal.getActiveSensors();
 | 
					        const sis = sensors.internal.getActiveSensors();
 | 
				
			||||||
        const h = screen.height;
 | 
					 | 
				
			||||||
        screen.drawLine(0, h - 5 * lineHeight8, screen.width, h - 5 * lineHeight8, 1)
 | 
					 | 
				
			||||||
        for (let i = 0; i < sis.length; ++i) {
 | 
					        for (let i = 0; i < sis.length; ++i) {
 | 
				
			||||||
            const si = sis[i];
 | 
					            const si = sis[i];
 | 
				
			||||||
            const x = (si.port() - 1) * col;
 | 
					            const x = (si.port() - 1) * col + 2;
 | 
				
			||||||
            const inf = si._info();
 | 
					            const inf = si._info();
 | 
				
			||||||
            screen.print(si.port() + "", x, h - 4 * lineHeight8, 1, image.font8)
 | 
					            if (inf)
 | 
				
			||||||
            screen.print(inf, x, h - 2 * lineHeight8, 1, inf.length > 4 ? image.font5 : image.font8);
 | 
					                screen.print(inf, x, h - 2 * lineHeight8, 1, inf.length > 4 ? image.font5 : image.font8);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // alive dot
 | 
				
			||||||
 | 
					        screen.setPixel(w - 1, blink, 1);
 | 
				
			||||||
 | 
					        screen.setPixel(w - 1, blink - 1, 1);
 | 
				
			||||||
 | 
					        screen.setPixel(w - 2, blink - 1, 1);
 | 
				
			||||||
 | 
					        screen.setPixel(w - 2, blink, 1);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    export function showBoot() {
 | 
				
			||||||
 | 
					        // pulse green, play startup sound, turn off light
 | 
				
			||||||
 | 
					        brick.setStatusLight(StatusLight.GreenPulse);
 | 
				
			||||||
 | 
					        // We pause for 100ms to give time to read sensor values, so they work in on_start block
 | 
				
			||||||
 | 
					        sensors.internal.init();
 | 
				
			||||||
 | 
					        motors.init();
 | 
				
			||||||
 | 
					        pause(800);
 | 
				
			||||||
 | 
					        // and we're ready
 | 
				
			||||||
 | 
					        brick.setStatusLight(StatusLight.Off);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -9,7 +9,6 @@ namespace pxsim {
 | 
				
			|||||||
        private angle: number = 0;
 | 
					        private angle: number = 0;
 | 
				
			||||||
        private tacho: number = 0;
 | 
					        private tacho: number = 0;
 | 
				
			||||||
        private speed: number = 0;
 | 
					        private speed: number = 0;
 | 
				
			||||||
        private polarity: number = 1; // -1, 1 or -1
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        private started: boolean;
 | 
					        private started: boolean;
 | 
				
			||||||
        private speedCmd: DAL;
 | 
					        private speedCmd: DAL;
 | 
				
			||||||
@@ -31,7 +30,7 @@ namespace pxsim {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        getSpeed() {
 | 
					        getSpeed() {
 | 
				
			||||||
            return Math.round(this.speed * (!this._synchedMotor && this.polarity == 0 ? -1 : 1));
 | 
					            return Math.round(this.speed);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        getAngle() {
 | 
					        getAngle() {
 | 
				
			||||||
@@ -82,16 +81,6 @@ namespace pxsim {
 | 
				
			|||||||
            return this.id == NodeType.LargeMotor;
 | 
					            return this.id == NodeType.LargeMotor;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        setPolarity(polarity: number) {
 | 
					 | 
				
			||||||
            // Either 1 or 255 (reverse)
 | 
					 | 
				
			||||||
            /*
 | 
					 | 
				
			||||||
                -1 : Motor will run backward  
 | 
					 | 
				
			||||||
                0 : Motor will run opposite direction  
 | 
					 | 
				
			||||||
                1 : Motor will run forward             
 | 
					 | 
				
			||||||
            */
 | 
					 | 
				
			||||||
            this.polarity = polarity;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        reset() {
 | 
					        reset() {
 | 
				
			||||||
            // not sure what reset does...
 | 
					            // not sure what reset does...
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -119,11 +119,7 @@ namespace pxsim {
 | 
				
			|||||||
                            return 2;
 | 
					                            return 2;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        case DAL.opOutputPolarity: {
 | 
					                        case DAL.opOutputPolarity: {
 | 
				
			||||||
                            // reverse
 | 
					                            console.error("opOutputPolarity not supported");
 | 
				
			||||||
                            const port = buf.data[1];
 | 
					 | 
				
			||||||
                            const polarity = pxsim.BufferMethods.getNumber(buf, BufferMethods.NumberFormat.Int8LE, 2);
 | 
					 | 
				
			||||||
                            const motors = ev3board().getMotor(port);
 | 
					 | 
				
			||||||
                            motors.forEach(motor => motor.setPolarity(polarity));
 | 
					 | 
				
			||||||
                            return 2;
 | 
					                            return 2;
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        case DAL.opOutputSetType: {
 | 
					                        case DAL.opOutputSetType: {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user