From 367b1b0d1a47c136595fd7df2b77dbb5b403f973 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Sun, 17 Dec 2017 23:00:07 -0800 Subject: [PATCH 1/5] properly setting multiple-motor options --- libs/core/output.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/libs/core/output.ts b/libs/core/output.ts index 2781c74a..96f679cb 100644 --- a/libs/core/output.ts +++ b/libs/core/output.ts @@ -242,7 +242,7 @@ namespace motors { if (!this._initialized) { this._initialized = true; // specify motor size on this port - const b = mkCmd(this._port, DAL.opOutputSetType, 1) + const b = mkCmd(outOffset(this._port), DAL.opOutputSetType, 1) b.setNumber(NumberFormat.Int8LE, 2, this._large ? 0x07 : 0x08) writePWM(b) } @@ -352,9 +352,13 @@ namespace motors { protected __init() { if (!this._initialized) { this._initialized = true; - const b = mkCmd(this._port, DAL.opOutputSetType, 1) - b.setNumber(NumberFormat.Int8LE, 2, 0x07) // large motor - writePWM(b) + for (let i = 0; i < DAL.NUM_OUTPUTS; ++i) { + if (this._port & (1 << i)) { + const b = mkCmd(outOffset(1 << i), DAL.opOutputSetType, 1) + b.setNumber(NumberFormat.Int8LE, 2, 0x07) // large motor + writePWM(b) + } + } } } @@ -389,6 +393,7 @@ namespace motors { //% inlineInputMode=inline //% group="Chassis" steer(steering: number, speed: number, value: number, unit: MoveUnit) { + this.__init(); speed = Math.clamp(-100, 100, speed >> 0); if (!speed) { stop(this._port, this._brake); From 217958aec367cd029fef5ac6698847e7f4d7de21 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Sun, 17 Dec 2017 23:19:38 -0800 Subject: [PATCH 2/5] fix polarity --- libs/core/output.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libs/core/output.ts b/libs/core/output.ts index 96f679cb..01f90e53 100644 --- a/libs/core/output.ts +++ b/libs/core/output.ts @@ -144,9 +144,9 @@ namespace motors { setReversed(reversed: boolean) { this.__init(); const b = mkCmd(this._port, DAL.opOutputPolarity, 1) - b.setNumber(NumberFormat.Int8LE, 2, reversed ? -1 : 1); + b.setNumber(NumberFormat.Int8LE, 2, reversed ? 0 : 1); writePWM(b) - } + } /** * Stops the motor(s). From 363e076f36bf4a2585c193752f0c78718f0bcc55 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Mon, 18 Dec 2017 08:54:53 -0800 Subject: [PATCH 3/5] fixing motor compilation --- libs/core/_locales/core-jsdoc-strings.json | 1 - libs/core/output.ts | 112 +++++++++------------ 2 files changed, 49 insertions(+), 64 deletions(-) diff --git a/libs/core/_locales/core-jsdoc-strings.json b/libs/core/_locales/core-jsdoc-strings.json index 222cace1..65ede23f 100644 --- a/libs/core/_locales/core-jsdoc-strings.json +++ b/libs/core/_locales/core-jsdoc-strings.json @@ -55,7 +55,6 @@ "motors.Motor.move|param|speed": "the speed from ``100`` full forward to ``-100`` full backward, eg: 50", "motors.Motor.move|param|unit": "the meaning of the value", "motors.Motor.move|param|value": "the move quantity, eg: 2", - "motors.Motor.port": "Gets the port where this motor is connected", "motors.Motor.reset": "Resets the motor(s).", "motors.Motor.setBrake": "Sets the automatic brake on or off when the motor is off", "motors.Motor.setBrake|param|brake": "a value indicating if the motor should break when off", diff --git a/libs/core/output.ts b/libs/core/output.ts index 01f90e53..3453d9da 100644 --- a/libs/core/output.ts +++ b/libs/core/output.ts @@ -96,31 +96,31 @@ namespace motors { export class Motor extends control.Component { protected _port: Output; protected _brake: boolean; - - constructor(port: Output) { + private _initialized: boolean; + private _init: () => void; + private _setSpeed: (speed: number) => void; + private _move: (steps: boolean, stepsOrTime: number, speed: number) => void; + + constructor(port: Output, init: () => void, setSpeed: (speed: number) => void, move: (steps: boolean, stepsOrTime: number, speed: number) => void) { super(); this._port = port; this._brake = false; + this._initialized = false; + this._init = init; + this._setSpeed = setSpeed; + this._move = move; } /** * Lazy initialization code - */ - protected __init() { - - } - - /** - * Gets the port where this motor is connected */ - //% - //% group="Motion" - port(): Output { - this.__init(); - return this._port; + protected init() { + if (!this._initialized) { + this._initialized = true; + this._init(); + } } - /** * Sets the automatic brake on or off when the motor is off * @param brake a value indicating if the motor should break when off @@ -130,9 +130,9 @@ namespace motors { //% weight=60 blockGap=8 //% group="Motion" setBrake(brake: boolean) { - this.__init(); + this.init(); this._brake = brake; - } + } /** * Reverses the motor polarity @@ -142,7 +142,7 @@ namespace motors { //% weight=59 //% group="Motion" setReversed(reversed: boolean) { - this.__init(); + this.init(); const b = mkCmd(this._port, DAL.opOutputPolarity, 1) b.setNumber(NumberFormat.Int8LE, 2, reversed ? 0 : 1); writePWM(b) @@ -153,7 +153,7 @@ namespace motors { */ //% stop() { - this.__init(); + this.init(); stop(this._port, this._brake); } @@ -162,7 +162,7 @@ namespace motors { */ //% reset() { - this.__init(); + this.init(); reset(this._port); } @@ -176,17 +176,14 @@ namespace motors { //% speed.min=-100 speed.max=100 //% group="Motion" setSpeed(speed: number) { - this.__init(); + this.init(); speed = Math.clamp(-100, 100, speed >> 0); if (!speed) // always stop this.stop(); else - this.__setSpeed(speed); + this._setSpeed(speed); } - protected __setSpeed(speed: number) { - } - /** * Moves the motor by a number of rotations, degress or seconds * @param value the move quantity, eg: 2 @@ -198,7 +195,7 @@ namespace motors { //% speed.min=-100 speed.max=100 //% group="Motion" move(value: number, unit: MoveUnit, speed: number) { - this.__init(); + this.init(); speed = Math.clamp(-100, 100, speed >> 0); if (!speed) { this.stop(); @@ -221,40 +218,33 @@ namespace motors { break; } - this.__move(useSteps, stepsOrTime, speed); + this._move(useSteps, stepsOrTime, speed); } - - protected __move(steps: boolean, stepsOrTime: number, speed: number) { - } } - + //% fixedInstances export class SingleMotor extends Motor { private _large: boolean; - private _initialized: boolean; constructor(port: Output, large: boolean) { - super(port); + super(port, () => this.__init(), (speed) => this.__setSpeed(speed), (steps, stepsOrTime, speed) => this.__move(steps, stepsOrTime, speed)); this._large = large; } - protected __init() { - if (!this._initialized) { - this._initialized = true; - // specify motor size on this port - const b = mkCmd(outOffset(this._port), DAL.opOutputSetType, 1) - b.setNumber(NumberFormat.Int8LE, 2, this._large ? 0x07 : 0x08) - writePWM(b) - } + private __init() { + // specify motor size on this port + const b = mkCmd(outOffset(this._port), DAL.opOutputSetType, 1) + b.setNumber(NumberFormat.Int8LE, 2, this._large ? 0x07 : 0x08) + writePWM(b) } - protected __setSpeed(speed: number) { + private __setSpeed(speed: number) { const b = mkCmd(this._port, DAL.opOutputSpeed, 1) b.setNumber(NumberFormat.Int8LE, 2, speed) writePWM(b) } - protected __move(steps: boolean, stepsOrTime: number, speed: number) { + private __move(steps: boolean, stepsOrTime: number, speed: number) { step(this._port, { useSteps: steps, step1: 0, @@ -273,7 +263,7 @@ namespace motors { //% weight=72 blockGap=8 //% group="Sensors" speed(): number { - this.__init(); + this.init(); return getMotorData(this._port).actualSpeed; } @@ -285,7 +275,7 @@ namespace motors { //% weight=71 blockGap=8 //% group="Sensors" count(): number { - this.__init(); + this.init(); return getMotorData(this._port).count; } @@ -297,7 +287,7 @@ namespace motors { //% weight=70 //% group="Sensors" tachoCount(): number { - this.__init(); + this.init(); return getMotorData(this._port).tachoCount; } @@ -306,7 +296,7 @@ namespace motors { */ //% group="Motion" clearCount() { - this.__init(); + this.init(); const b = mkCmd(this._port, DAL.opOutputClearCount, 0) writePWM(b) for (let i = 0; i < DAL.NUM_OUTPUTS; ++i) { @@ -343,26 +333,22 @@ namespace motors { //% fixedInstances export class SynchedMotorPair extends Motor { - private _initialized: boolean; - + constructor(ports: Output) { - super(ports); + super(ports, () => this.__init(), (speed) => this.__setSpeed(speed), (steps, stepsOrTime, speed) => this.__move(steps, stepsOrTime, speed)); } - protected __init() { - if (!this._initialized) { - this._initialized = true; - for (let i = 0; i < DAL.NUM_OUTPUTS; ++i) { - if (this._port & (1 << i)) { - const b = mkCmd(outOffset(1 << i), DAL.opOutputSetType, 1) - b.setNumber(NumberFormat.Int8LE, 2, 0x07) // large motor - writePWM(b) - } + private __init() { + for (let i = 0; i < DAL.NUM_OUTPUTS; ++i) { + if (this._port & (1 << i)) { + const b = mkCmd(outOffset(1 << i), DAL.opOutputSetType, 1) + b.setNumber(NumberFormat.Int8LE, 2, 0x07) // large motor + writePWM(b) } } } - protected __setSpeed(speed: number) { + private __setSpeed(speed: number) { syncMotors(this._port, { speed: speed, turnRatio: 0, @@ -370,7 +356,7 @@ namespace motors { }) } - protected __move(steps: boolean, stepsOrTime: number, speed: number) { + private __move(steps: boolean, stepsOrTime: number, speed: number) { syncMotors(this._port, { useSteps: steps, speed: speed, @@ -378,7 +364,7 @@ namespace motors { stepsOrTime: stepsOrTime, useBrake: this._brake }); - } + } /** * Turns the motor and the follower motor by a number of rotations @@ -393,7 +379,7 @@ namespace motors { //% inlineInputMode=inline //% group="Chassis" steer(steering: number, speed: number, value: number, unit: MoveUnit) { - this.__init(); + this.init(); speed = Math.clamp(-100, 100, speed >> 0); if (!speed) { stop(this._port, this._brake); From d07f672b28080a25d7b53677d541367b88bcadd2 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Mon, 18 Dec 2017 09:17:19 -0800 Subject: [PATCH 4/5] fixing single motor set speed --- libs/core/output.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libs/core/output.ts b/libs/core/output.ts index 3453d9da..b9f9fa6f 100644 --- a/libs/core/output.ts +++ b/libs/core/output.ts @@ -242,6 +242,9 @@ namespace motors { const b = mkCmd(this._port, DAL.opOutputSpeed, 1) b.setNumber(NumberFormat.Int8LE, 2, speed) writePWM(b) + if (speed) { + writePWM(mkCmd(this._port, DAL.opOutputStart, 0)) + } } private __move(steps: boolean, stepsOrTime: number, speed: number) { From b166f6034ef8fbced017dc0dc2bd96c4d579b1e3 Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Mon, 18 Dec 2017 09:43:44 -0800 Subject: [PATCH 5/5] storing test --- docs/tests/motors.ts | 66 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 docs/tests/motors.ts diff --git a/docs/tests/motors.ts b/docs/tests/motors.ts new file mode 100644 index 00000000..cff15a26 --- /dev/null +++ b/docs/tests/motors.ts @@ -0,0 +1,66 @@ +let errors: string[] = []; +let tachoB = 0; +let tachoC = 0; + +function assert(name: string, condition: boolean) { + if (!condition) { + errors.push(name) + } +} + +function assertClose(name: string, expected: number, actual: number, tolerance = 10) { + assert(name + ` ${expected}/${actual}`, Math.abs(expected - actual) < tolerance); +} + +function test(name: string, f: () => void, check?: () => void) { + motors.stopAllMotors(); + loops.pause(500); + tachoB = motors.largeB.tachoCount() + tachoC = motors.largeB.tachoCount() + brick.clearScreen() + brick.print(name, 0, 0) + f(); + loops.pause(3000); + motors.stopAllMotors(); + motors.largeB.setReversed(false); + motors.largeC.setReversed(false); + motors.mediumA.setReversed(false); + loops.pause(1000); + if (check) + check() +} + +brick.buttonEnter.onEvent(ButtonEvent.Click, function () { + test("lgB set speed 100", () => { + motors.largeB.setSpeed(100) + }); + test("lgB set speed (reversed)", () => { + motors.largeB.setReversed(true) + motors.largeB.setSpeed(100) + }) + test("lgBC set speed 100", () => { + motors.largeBC.setSpeed(100) + }) + test("lgBC steer 50% 2x", () => { + motors.largeBC.steer(50, 50, 2, MoveUnit.Rotations) + }, () => { + assertClose("largeB", 720, motors.largeB.tachoCount() - tachoB) + }); + test("lgBC steer 50% 500deg", () => { + motors.largeBC.steer(50, 50, 500, MoveUnit.Degrees) + }, () => { + assertClose("largeB", 500, motors.largeB.tachoCount() - tachoB) + }); + test("lgBC steer 50% 2s", () => { + motors.largeBC.steer(50, 50, 2, MoveUnit.Seconds) + }) + test("lgBC tank 50% 2s", () => { + motors.largeBC.tank(50, 50, 720, MoveUnit.Degrees) + }) + + brick.clearScreen() + brick.print(`${errors.length} errors`, 0, 0) + let l = 1; + for(const error of errors) + brick.print(`error: ${error}`, 0, l++ * 12) +})