Compare commits

...

11 Commits

Author SHA1 Message Date
4a73c5d700 1.2.28 2020-08-21 06:07:32 +02:00
a47a06ac19 Cooperate (#985)
* cooperate pause

* fix math

* update lastPause before pausing

* faster cooperation

Co-authored-by: Peli de Halleux <peli@DESKTOP-5B7QRAM.corp.microsoft.com>
2020-08-21 06:06:59 +02:00
3f598a3eee 1.2.27 2020-01-19 21:49:57 -08:00
ded2e9d82c don't close bt connection 2020-01-19 21:41:43 -08:00
c8381d7626 1.2.26 2019-10-20 09:02:44 -07:00
62b5941143 is color detected (#952)
* added query function

* reshuffle
2019-10-20 09:02:17 -07:00
1d5d18dc88 1.2.25 2019-10-18 22:53:46 -07:00
bc4b71e0d6 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
2019-10-18 22:53:30 -07:00
00194d4aa6 1.2.24 2019-10-13 00:36:00 -07:00
ec900f805e 1.2.23 2019-10-13 00:35:47 -07:00
5f5bdd7294 blink fix (#949) 2019-10-13 00:35:20 -07:00
20 changed files with 186 additions and 79 deletions

View File

@ -27,7 +27,6 @@ while (true) {
music.playSoundEffectUntilDone(sounds.mechanicalMotorStart) music.playSoundEffectUntilDone(sounds.mechanicalMotorStart)
music.playSoundEffectUntilDone(sounds.mechanicalMotorIdle); music.playSoundEffectUntilDone(sounds.mechanicalMotorIdle);
} }
pause(1);
} }
``` ```
@ -43,6 +42,5 @@ while (true) {
music.playSoundEffectUntilDone(sounds.mechanicalMotorStart) music.playSoundEffectUntilDone(sounds.mechanicalMotorStart)
music.playSoundEffectUntilDone(sounds.mechanicalMotorIdle); music.playSoundEffectUntilDone(sounds.mechanicalMotorIdle);
} }
pause(1);
} }
``` ```

View 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();
```

View File

@ -64,6 +64,7 @@ class WebSerialPackageIO implements pxt.HF2.PacketIO {
private _writer: any; private _writer: any;
constructor(private port: SerialPort, private options: SerialOptions) { constructor(private port: SerialPort, private options: SerialOptions) {
console.log(`serial: new io`)
} }
async readSerialAsync() { async readSerialAsync() {
@ -90,17 +91,24 @@ class WebSerialPackageIO implements pxt.HF2.PacketIO {
return !!(<any>navigator).serial; return !!(<any>navigator).serial;
} }
static portIos: WebSerialPackageIO[] = [];
static async mkPacketIOAsync(): Promise<pxt.HF2.PacketIO> { static async mkPacketIOAsync(): Promise<pxt.HF2.PacketIO> {
const serial = (<any>navigator).serial; const serial = (<any>navigator).serial;
if (serial) { if (serial) {
try { try {
const requestOptions: SerialPortRequestOptions = {}; const requestOptions: SerialPortRequestOptions = {};
const port = await serial.requestPort(requestOptions); const port = await serial.requestPort(requestOptions);
const options: SerialOptions = {
baudrate: 460800, let io = WebSerialPackageIO.portIos.filter(i => i.port == port)[0];
buffersize: 4096 if (!io) {
}; const options: SerialOptions = {
return new WebSerialPackageIO(port, options); baudrate: 460800,
buffersize: 4096
};
io = new WebSerialPackageIO(port, options);
WebSerialPackageIO.portIos.push(io);
}
return io;
} catch (e) { } catch (e) {
console.log(`connection error`, e) console.log(`connection error`, e)
} }
@ -125,11 +133,8 @@ class WebSerialPackageIO implements pxt.HF2.PacketIO {
}); });
} }
private closeAsync() { private async closeAsync() {
console.log(`serial: closing port`); // don't close port
this.port.close();
this._reader = undefined;
this._writer = undefined;
return Promise.delay(500); return Promise.delay(500);
} }

View File

@ -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];
} }

View File

@ -1,5 +1,4 @@
const enum ColorSensorMode { const enum ColorSensorMode {
None = 0,
//% block="reflected light intensity" //% block="reflected light intensity"
ReflectedLightIntensity = 0, ReflectedLightIntensity = 0,
//% block="ambient light intensity" //% block="ambient light intensity"
@ -59,7 +58,6 @@ namespace sensors {
constructor(port: number) { constructor(port: number) {
super(port) super(port)
this._setMode(ColorSensorMode.None);
this.thresholdDetector = new sensors.ThresholdDetector(this.id()); this.thresholdDetector = new sensors.ThresholdDetector(this.id());
this.calibrating = false; this.calibrating = false;
} }
@ -181,6 +179,22 @@ namespace sensors {
return this.getNumber(NumberFormat.UInt8LE, 0) return this.getNumber(NumberFormat.UInt8LE, 0)
} }
/**
* Checks the color is being detected
* @param color the color to detect
*/
//% help=sensors/color-sensor/is-color-detected
//% block="is **color sensor** %this|detected|%color=colorEnumPicker"
//% blockId=colorisColorDetectedDetected
//% parts="colorsensor"
//% blockNamespace=sensors
//% this.fieldEditor="ports"
//% weight=99 blockGap=8
//% group="Color Sensor"
isColorDetected(color: number) {
return this.color() == color;
}
/** /**
* Get the current raw rgb values as an array from the color sensor. * Get the current raw rgb values as an array from the color sensor.
* @param sensor the color sensor to query the request * @param sensor the color sensor to query the request

View File

@ -0,0 +1,30 @@
# Is Color Detected
Checks the color is detected
```sig
let b = sensors.color1.isColorDetected(ColorSensorColor.Blue)
```
The [color](/reference/sensors/color) you choose to look for is one of the colors that the sensor can detect. If you want to use colors for tracking, it's best to use a color that is the same or very close to the ones the sensor detects.
## Parameters
* **color**: the [color](/reference/sensors/color) to watch for.
## Example
Wait for the sensor to see ``blue``. Then, show an expression on the screen.
```blocks
brick.showString("Waiting for blue", 1)
while(!sensors.color1.isColorDetected(ColorSensorColor.Blue)) {
pause(20)
}
brick.clearScreen()
brick.showImage(images.expressionsSick)
```
## See also
[on color detected](/reference/sensors/color-sensor/on-color-detected), [color](/reference/sensors/color)

View File

@ -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();

View File

@ -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() {

11
libs/core/cooperate.ts Normal file
View File

@ -0,0 +1,11 @@
namespace control {
let lastPause = 0;
const COOPERATION_INTERVAL = 20
export function cooperate() {
const now = control.millis()
if (now - lastPause > COOPERATION_INTERVAL) {
lastPause = now
pause(1)
}
}
}

View File

@ -21,8 +21,7 @@ namespace sensors.internal {
const now = control.millis(); const now = control.millis();
if (now - this.lastQuery >= this.interval * 2) if (now - this.lastQuery >= this.interval * 2)
this.queryAndUpdate(); // sensor poller is not allowed to run this.queryAndUpdate(); // sensor poller is not allowed to run
if (now - this.lastPause >= this.interval * 5) control.cooperate(); // allow events to trigger
pause(1); // allow events to trigger
} }
private queryAndUpdate() { private queryAndUpdate() {
@ -104,7 +103,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 +136,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)
@ -275,21 +275,23 @@ void cUiUpdatePower(void)
const conns = analogMM.slice(AnalogOff.InConn, DAL.NUM_INPUTS) const conns = analogMM.slice(AnalogOff.InConn, DAL.NUM_INPUTS)
let r = 0; let r = 0;
for (let i = 0; i < conns.length; ++i) { for (let i = 0; i < conns.length; ++i) {
r = (r << 8 | conns[i]); r = conns[i] + (r << 6) + (r << 16) - r;
} }
return r; return r;
} }
let nonActivated = 0; let nonActivated = 0;
function detectDevices() { function detectDevices() {
//control.dmesg(`detect devices (${nonActivated} na)`) control.dmesg(`detect devices (hash ${hashDevices()})`)
const conns = analogMM.slice(AnalogOff.InConn, DAL.NUM_INPUTS) const conns = analogMM.slice(AnalogOff.InConn, DAL.NUM_INPUTS)
let numChanged = 0; let numChanged = 0;
const uartSensors: SensorInfo[] = []; const uartSensors: SensorInfo[] = [];
for (const sensorInfo of sensorInfos) { for (const sensorInfo of sensorInfos) {
const newConn = conns[sensorInfo.port] const newConn = conns[sensorInfo.port]
if (newConn == sensorInfo.connType) { if (newConn == sensorInfo.connType
&& sensorInfo.sensor
&& sensorInfo.sensor.isActive()) {
// control.dmesg(`connection unchanged ${newConn} at ${sensorInfo.port}`) // control.dmesg(`connection unchanged ${newConn} at ${sensorInfo.port}`)
continue; continue;
} }
@ -425,11 +427,11 @@ void cUiUpdatePower(void)
constructor(port: number) { constructor(port: number) {
super(port) super(port)
this.mode = 0 this.mode = 0
this.realmode = 0 this.realmode = -1
} }
_activated() { _activated() {
this.realmode = 0 this.realmode = -1
this._setMode(this.mode) this._setMode(this.mode)
} }
@ -456,7 +458,7 @@ void cUiUpdatePower(void)
reset() { reset() {
if (this.isActive()) uartReset(this._port); if (this.isActive()) uartReset(this._port);
this.realmode = 0; this.realmode = -1;
} }
} }
@ -556,7 +558,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) {
@ -568,7 +570,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}`);
} }
} }
@ -584,6 +586,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) {

View File

@ -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")
@ -124,7 +124,7 @@ namespace motors {
export function stopAll() { export function stopAll() {
const b = mkCmd(Output.ALL, DAL.opOutputStop, 0) const b = mkCmd(Output.ALL, DAL.opOutputStop, 0)
writePWM(b); writePWM(b);
pause(1); control.cooperate();
} }
/** /**
@ -136,7 +136,7 @@ namespace motors {
//% help=motors/reset-all //% help=motors/reset-all
export function resetAll() { export function resetAll() {
reset(Output.ALL) reset(Output.ALL)
pause(1); control.cooperate();
} }
interface MoveSchedule { interface MoveSchedule {
@ -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;
} }
/** /**
@ -265,7 +269,7 @@ namespace motors {
if (this._brake && this._brakeSettleTime > 0) if (this._brake && this._brakeSettleTime > 0)
pause(this._brakeSettleTime); pause(this._brakeSettleTime);
else { else {
pause(1); control.cooperate();
} }
} }
@ -276,7 +280,7 @@ namespace motors {
// allow robot to settle // allow robot to settle
this.settle(); this.settle();
} else { } else {
pause(1); control.cooperate();
} }
} }
@ -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]
} }
@ -352,7 +357,7 @@ namespace motors {
// special: 0 is infinity // special: 0 is infinity
if (schedule.steps[0] + schedule.steps[1] + schedule.steps[2] == 0) { if (schedule.steps[0] + schedule.steps[1] + schedule.steps[2] == 0) {
this._run(schedule.speed); this._run(schedule.speed);
pause(1); control.cooperate();
return; return;
} }
@ -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;

View File

@ -26,7 +26,8 @@
"icons.jres", "icons.jres",
"ns.ts", "ns.ts",
"platform.h", "platform.h",
"integrator.ts" "integrator.ts",
"cooperate.ts"
], ],
"testFiles": [ "testFiles": [
"test.ts" "test.ts"

13
libs/ev3/brick.ts Normal file
View 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();
}
}

View File

@ -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 {
} }

View File

@ -2,8 +2,9 @@
"name": "ev3", "name": "ev3",
"description": "The EV3 library", "description": "The EV3 library",
"files": [ "files": [
"README.md", "README.md",
"ns.ts", "ns.ts",
"brick.ts",
"startup.ts", "startup.ts",
"images.jres", "images.jres",
"images.ts", "images.ts",

View File

@ -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);

View File

@ -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);
} }
/** /**

View File

@ -1,6 +1,6 @@
{ {
"name": "pxt-ev3", "name": "pxt-ev3",
"version": "1.2.22", "version": "1.2.28",
"description": "LEGO MINDSTORMS EV3 for Microsoft MakeCode", "description": "LEGO MINDSTORMS EV3 for Microsoft MakeCode",
"private": false, "private": false,
"keywords": [ "keywords": [

View File

@ -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...
} }

View File

@ -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: {