polarity in synched motor (#945)
* account for polarity * more comments * handle dual motor in runtime * invert steer * don't use firmware polarity
This commit is contained in:
		@@ -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;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -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