Compare commits
19 Commits
Author | SHA1 | Date | |
---|---|---|---|
119bed0b75 | |||
3997819cda | |||
804c569e84 | |||
8b7d93af03 | |||
a18fbd713c | |||
1ebb55d11f | |||
74cb02db8d | |||
b88191ee54 | |||
9c4acba7eb | |||
87d22db6f3 | |||
d2cf715423 | |||
60a74ac525 | |||
864ed608bb | |||
a8b9d3e0fd | |||
01d08c6d4f | |||
426ad005d5 | |||
853625107c | |||
9c1b29cc80 | |||
9badaffee9 |
12
.github/workflows/compress-images-on-pull-request.yml
vendored
Normal file
12
.github/workflows/compress-images-on-pull-request.yml
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
name: Compress images
|
||||||
|
on: pull_request
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: calibreapp/image-actions
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@master
|
||||||
|
- name: calibreapp/image-actions
|
||||||
|
uses: calibreapp/image-actions@master
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
6
docs/static/testfilelogo.svg
vendored
Normal file
6
docs/static/testfilelogo.svg
vendored
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" id="svg4487" fill-rule="evenodd" stroke-linejoin="round" stroke-miterlimit="1.4" clip-rule="evenodd" version="1.1" width="32" height="32" viewBox="0 0 32 32">
|
||||||
|
<path id="path4485" fill="#696969" d="M16.1 2.7a13.8 13.8 0 00-4.4 27c.7 0 1-.4 1-.7v-2.4c-3.9.9-4.7-1.8-4.7-1.8-.6-1.6-1.5-2-1.5-2-1.3-1 0-.9 0-.9 1.4.1 2.2 1.4 2.2 1.4 1.2 2.1 3.2 1.5 4 1.2a3 3 0 01.9-1.9c-3.1-.3-6.3-1.5-6.3-6.8 0-1.5.5-2.7 1.4-3.7a5 5 0 01.1-3.7s1.2-.3 3.8 1.4a13.2 13.2 0 013.5-.4c1.2 0 2.4.1 3.5.4 2.6-1.7 3.8-1.4 3.8-1.4a5 5 0 01.1 3.7c.9 1 1.4 2.2 1.4 3.7 0 5.3-3.2 6.5-6.3 6.8.5.5 1 1.3 1 2.6V29c0 .4.2.8.9.6a13.8 13.8 0 00-4.4-27"/>
|
||||||
|
<g id="text4497" fill="#000" fill-opacity="1" stroke="none" stroke-width=".7" aria-label="v" font-family="consolas" font-size="26.6" font-stretch="normal" font-style="normal" font-variant="normal" font-weight="400" letter-spacing="0" style="line-height:1.25;-inkscape-font-specification:consolas" transform="rotate(14.1)" word-spacing="0">
|
||||||
|
<path id="path4499" stroke-width=".7" d="M21.4-1.7l2.9 8 3-8.3.8-1.5q.4-.4 1-.4.8 0 1.2.5.5.4.5 1v.6l-.3.5-.2.7-3.4 8.4-.4 1-.5 1-.7.5q-.4.2-1 .2-.8 0-1.2-.3-.5-.3-.7-.8l-.7-1.6-3.4-8.3q0-.4-.2-.7l-.2-.6-.1-.6.2-.7.6-.6q.4-.2.9-.2.9 0 1.2.5l.7 1.7z" font-family="Arial Rounded MT Bold" font-stretch="normal" font-style="normal" font-variant="normal" font-weight="400" style="-inkscape-font-specification:'Arial Rounded MT Bold, '"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
@ -1,16 +1,18 @@
|
|||||||
# Troubleshooting download problems
|
# Troubleshooting
|
||||||
|
|
||||||
|
## Download issues
|
||||||
|
|
||||||
If you're having trouble getting your code onto the EV3 Brick, try these steps to see if you can fix the problem.
|
If you're having trouble getting your code onto the EV3 Brick, try these steps to see if you can fix the problem.
|
||||||
|
|
||||||
## Check your **@drivename@** firmware
|
### Check your **@drivename@** firmware
|
||||||
|
|
||||||
MakeCode needs a firmware version of **1.10E** or higher installed on your brick.
|
MakeCode needs a firmware version of **1.10E** or higher installed on your brick.
|
||||||
|
|
||||||
### ~hint
|
#### ~hint
|
||||||
|
|
||||||
Firmware is the software that runs all the basic operations on your EV3 Brick. Your programs and the firmware work together to make the EV3 Brick do all things you want it to. Your EV3 Brick comes with firmware pre-installed, but it may need to be updated to work properly with MakeCode.
|
Firmware is the software that runs all the basic operations on your EV3 Brick. Your programs and the firmware work together to make the EV3 Brick do all things you want it to. Your EV3 Brick comes with firmware pre-installed, but it may need to be updated to work properly with MakeCode.
|
||||||
|
|
||||||
### ~
|
#### ~
|
||||||
|
|
||||||
To check the the firmware version on your EV3 Brick:
|
To check the the firmware version on your EV3 Brick:
|
||||||
|
|
||||||
@ -25,15 +27,15 @@ To check the the firmware version on your EV3 Brick:
|
|||||||
|
|
||||||
If you can't find the **Brick Info** or you see that the version is less than **1.10E**, **you need to upgrade your firmware**.
|
If you can't find the **Brick Info** or you see that the version is less than **1.10E**, **you need to upgrade your firmware**.
|
||||||
|
|
||||||
## Upgrade your **@drivename@**
|
### Upgrade your **@drivename@**
|
||||||
|
|
||||||
If your a firmware version level is less than **1.10E**, you need to install an upgraded version. You can upgrade the firmware with the **EV3 Lab** or **EV3 Programming** software. Also, you can do a manual upgrade by downloading the firmware install file. See the [Firmware Update](https://education.lego.com/en-us/support/mindstorms-ev3/firmware-update) support page to learn about the upgrade process.
|
If your a firmware version level is less than **1.10E**, you need to install an upgraded version. You can upgrade the firmware with the **EV3 Lab** or **EV3 Programming** software. Also, you can do a manual upgrade by downloading the firmware install file. See the [Firmware Update](https://education.lego.com/en-us/support/mindstorms-ev3/firmware-update) support page to learn about the upgrade process.
|
||||||
|
|
||||||
### ~ hint
|
#### ~ hint
|
||||||
|
|
||||||
**Recommended:** Upgrade with the **[EV3 Device Manager](https://ev3manager.education.lego.com/)**
|
**Recommended:** Upgrade with the **[EV3 Device Manager](https://ev3manager.education.lego.com/)**
|
||||||
|
|
||||||
### ~
|
#### ~
|
||||||
|
|
||||||
## Can I see the **@drivename@** drive on my computer?
|
## Can I see the **@drivename@** drive on my computer?
|
||||||
|
|
||||||
@ -45,14 +47,24 @@ On Windows, it looks like this in Explorer:
|
|||||||
|
|
||||||
If you don't see the **@drivename@** drive, make sure your brick is powered on and check that your USB connection is good.
|
If you don't see the **@drivename@** drive, make sure your brick is powered on and check that your USB connection is good.
|
||||||
|
|
||||||
## The display on the EV3 Brick is blank
|
### The display on the EV3 Brick is blank
|
||||||
|
|
||||||
Make sure your EV3 Brick is charged and powered on. If your it doesn't turn on, find the charger and plug it into wall power, then connect it to your EV3 Brick. Does it turn on and start up?
|
Make sure your EV3 Brick is charged and powered on. If your it doesn't turn on, find the charger and plug it into wall power, then connect it to your EV3 Brick. Does it turn on and start up?
|
||||||
|
|
||||||
## I still can't see my @drivename@ drive
|
### I still can't see my @drivename@ drive
|
||||||
|
|
||||||
Make sure that one end of your USB cable is firmly inserted into a USB port on the computer and the other end is connected to the EV3 Brick. If you still can't see the **@drivename@** drive, try a different port on the computer. If that doesn't work then maybe your cable is faulty or you need to reset the EV3 Brick.
|
Make sure that one end of your USB cable is firmly inserted into a USB port on the computer and the other end is connected to the EV3 Brick. If you still can't see the **@drivename@** drive, try a different port on the computer. If that doesn't work then maybe your cable is faulty or you need to reset the EV3 Brick.
|
||||||
|
|
||||||
|
## Why can't I delete my program (*.uf2) files from the Brick? #deletefiles
|
||||||
|
|
||||||
|
There's a bug in the firmware which prevents you from deleting the programs (``*.uf2`` files) from your EV3 Brick. There isn't a firmware update to fix this yet.
|
||||||
|
|
||||||
|
We have prepared a special program that lets you delete UF2 files from the brick.
|
||||||
|
Download [these PDF instructions](/file-manager.pdf) and drop the PDF on the brick drive.
|
||||||
|
This will present you with an menu for deleting files.
|
||||||
|
|
||||||
|
For other common questions, try the FAQ page https://makecode.mindstorms.com/faq.
|
||||||
|
|
||||||
## How do I reset my EV3 Brick?
|
## How do I reset my EV3 Brick?
|
||||||
|
|
||||||
If you think your USB connection is good and you still can't see your **@drivename@** drive, try giving the EV3 Brick a reset. You can follow these steps to reset:
|
If you think your USB connection is good and you still can't see your **@drivename@** drive, try giving the EV3 Brick a reset. You can follow these steps to reset:
|
||||||
|
@ -55,13 +55,11 @@ namespace sensors {
|
|||||||
export class ColorSensor extends internal.UartSensor {
|
export class ColorSensor extends internal.UartSensor {
|
||||||
thresholdDetector: sensors.ThresholdDetector;
|
thresholdDetector: sensors.ThresholdDetector;
|
||||||
calibrating: boolean;
|
calibrating: boolean;
|
||||||
private _curr: number;
|
|
||||||
|
|
||||||
constructor(port: number) {
|
constructor(port: number) {
|
||||||
super(port)
|
super(port)
|
||||||
this.thresholdDetector = new sensors.ThresholdDetector(this.id());
|
this.thresholdDetector = new sensors.ThresholdDetector(this.id());
|
||||||
this.calibrating = false;
|
this.calibrating = false;
|
||||||
this._curr = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_colorEventValue(value: number) {
|
_colorEventValue(value: number) {
|
||||||
@ -104,18 +102,17 @@ namespace sensors {
|
|||||||
"yellow",
|
"yellow",
|
||||||
"red",
|
"red",
|
||||||
"white",
|
"white",
|
||||||
"brown"][this._curr];
|
"brown"][this._query()];
|
||||||
case ColorSensorMode.AmbientLightIntensity:
|
case ColorSensorMode.AmbientLightIntensity:
|
||||||
case ColorSensorMode.ReflectedLightIntensity:
|
case ColorSensorMode.ReflectedLightIntensity:
|
||||||
return `${this._curr}%`;
|
return `${this._query()}%`;
|
||||||
default:
|
default:
|
||||||
return this._curr.toString();
|
return this._query().toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_update(prev: number, curr: number) {
|
_update(prev: number, curr: number) {
|
||||||
if (this.calibrating) return; // simply ignore data updates while calibrating
|
if (this.calibrating) return; // simply ignore data updates while calibrating
|
||||||
this._curr = curr;
|
|
||||||
if (this.mode == ColorSensorMode.Color || this.mode == ColorSensorMode.RgbRaw || this.mode == ColorSensorMode.RefRaw)
|
if (this.mode == ColorSensorMode.Color || this.mode == ColorSensorMode.RgbRaw || this.mode == ColorSensorMode.RefRaw)
|
||||||
control.raiseEvent(this._id, this._colorEventValue(curr));
|
control.raiseEvent(this._id, this._colorEventValue(curr));
|
||||||
else
|
else
|
||||||
@ -179,7 +176,7 @@ namespace sensors {
|
|||||||
color(): ColorSensorColor {
|
color(): ColorSensorColor {
|
||||||
this.poke();
|
this.poke();
|
||||||
this.setMode(ColorSensorMode.Color)
|
this.setMode(ColorSensorMode.Color)
|
||||||
return this._curr;
|
return this.getNumber(NumberFormat.UInt8LE, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -271,7 +268,7 @@ namespace sensors {
|
|||||||
case LightIntensityMode.ReflectedRaw:
|
case LightIntensityMode.ReflectedRaw:
|
||||||
return this.reflectedLightRaw();
|
return this.reflectedLightRaw();
|
||||||
default:
|
default:
|
||||||
return this._curr;
|
return this.getNumber(NumberFormat.UInt8LE, 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -298,7 +295,7 @@ namespace sensors {
|
|||||||
reflectedLightRaw(): number {
|
reflectedLightRaw(): number {
|
||||||
this.poke();
|
this.poke();
|
||||||
this.setMode(ColorSensorMode.RefRaw);
|
this.setMode(ColorSensorMode.RefRaw);
|
||||||
return this._curr;
|
return this.getNumber(NumberFormat.UInt16LE, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,7 +1,4 @@
|
|||||||
namespace sensors.internal {
|
namespace sensors.internal {
|
||||||
const UART_PORT_CHANGED = 1
|
|
||||||
const UART_DATA_READY = 8
|
|
||||||
|
|
||||||
export class Poller {
|
export class Poller {
|
||||||
private query: () => number;
|
private query: () => number;
|
||||||
private update: (previous: number, current: number) => void;
|
private update: (previous: number, current: number) => void;
|
||||||
@ -39,7 +36,6 @@ namespace sensors.internal {
|
|||||||
|
|
||||||
private poll() {
|
private poll() {
|
||||||
control.runInBackground(() => {
|
control.runInBackground(() => {
|
||||||
pause(this.interval);
|
|
||||||
this.lastQuery = this.lastPause = control.millis();
|
this.lastQuery = this.lastPause = control.millis();
|
||||||
this.previousValue = this.currentValue = this.query();
|
this.previousValue = this.currentValue = this.query();
|
||||||
this.update(this.previousValue, this.currentValue);
|
this.update(this.previousValue, this.currentValue);
|
||||||
@ -64,6 +60,8 @@ namespace sensors.internal {
|
|||||||
let uartMM: MMap
|
let uartMM: MMap
|
||||||
let IICMM: MMap
|
let IICMM: MMap
|
||||||
let powerMM: MMap
|
let powerMM: MMap
|
||||||
|
let devcon: Buffer
|
||||||
|
let devPoller: Poller
|
||||||
let sensorInfos: SensorInfo[];
|
let sensorInfos: SensorInfo[];
|
||||||
|
|
||||||
let batteryInfo: {
|
let batteryInfo: {
|
||||||
@ -106,10 +104,11 @@ namespace sensors.internal {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function init() {
|
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))
|
||||||
|
devcon = output.createBuffer(DevConOff.Size)
|
||||||
|
|
||||||
analogMM = control.mmap("/dev/lms_analog", AnalogOff.Size, 0)
|
analogMM = control.mmap("/dev/lms_analog", AnalogOff.Size, 0)
|
||||||
if (!analogMM) control.fail("no analog sensor")
|
if (!analogMM) control.fail("no analog sensor")
|
||||||
@ -122,10 +121,10 @@ namespace sensors.internal {
|
|||||||
|
|
||||||
powerMM = control.mmap("/dev/lms_power", 2, 0)
|
powerMM = control.mmap("/dev/lms_power", 2, 0)
|
||||||
|
|
||||||
forever(function () {
|
devPoller = new Poller(250, () => { return hashDevices(); },
|
||||||
pause(500)
|
(prev, curr) => {
|
||||||
detectDevices();
|
detectDevices();
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getActiveSensors(): Sensor[] {
|
export function getActiveSensors(): Sensor[] {
|
||||||
@ -133,6 +132,16 @@ namespace sensors.internal {
|
|||||||
return sensorInfos.filter(si => si.sensor && si.sensor.isActive()).map(si => si.sensor);
|
return sensorInfos.filter(si => si.sensor && si.sensor.isActive()).map(si => si.sensor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function readUartInfo(port: number, mode: number) {
|
||||||
|
let buf = output.createBuffer(UartCtlOff.Size)
|
||||||
|
buf[UartCtlOff.Port] = port
|
||||||
|
buf[UartCtlOff.Mode] = mode
|
||||||
|
uartMM.ioctl(IO.UART_READ_MODE_INFO, buf)
|
||||||
|
return buf
|
||||||
|
//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)
|
||||||
|
}
|
||||||
|
|
||||||
export function readIICID(port: number) {
|
export function readIICID(port: number) {
|
||||||
const buf = output.createBuffer(IICStr.Size)
|
const buf = output.createBuffer(IICStr.Size)
|
||||||
buf[IICStr.Port] = port
|
buf[IICStr.Port] = port
|
||||||
@ -264,26 +273,38 @@ void cUiUpdatePower(void)
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function detectDevices() {
|
function hashDevices(): number {
|
||||||
control.dmesg(`detect devices`)
|
|
||||||
const conns = analogMM.slice(AnalogOff.InConn, DAL.NUM_INPUTS)
|
const conns = analogMM.slice(AnalogOff.InConn, DAL.NUM_INPUTS)
|
||||||
let devcon: Buffer = undefined;
|
let r = 0;
|
||||||
|
for (let i = 0; i < conns.length; ++i) {
|
||||||
|
r = conns[i] + (r << 6) + (r << 16) - r;
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
let nonActivated = 0;
|
||||||
|
function detectDevices() {
|
||||||
|
control.dmesg(`detect devices (hash ${hashDevices()})`)
|
||||||
|
const conns = analogMM.slice(AnalogOff.InConn, DAL.NUM_INPUTS)
|
||||||
|
let numChanged = 0;
|
||||||
|
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()) {
|
||||||
|
if (newConn == DAL.CONN_INPUT_UART)
|
||||||
|
uartSensors.push(sensorInfo);
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
numChanged++
|
||||||
sensorInfo.connType = newConn
|
sensorInfo.connType = newConn
|
||||||
sensorInfo.devType = DAL.DEVICE_TYPE_NONE
|
sensorInfo.devType = DAL.DEVICE_TYPE_NONE
|
||||||
sensorInfo.sensor = undefined;
|
|
||||||
|
|
||||||
if (newConn == DAL.CONN_INPUT_UART) {
|
if (newConn == DAL.CONN_INPUT_UART) {
|
||||||
control.dmesg(`new UART connection at ${sensorInfo.port}`)
|
control.dmesg(`new UART connection at ${sensorInfo.port}`)
|
||||||
const status = getUartStatus(sensorInfo.port);
|
updateUartMode(sensorInfo.port, 0);
|
||||||
if (status & UART_PORT_CHANGED) {
|
uartSensors.push(sensorInfo);
|
||||||
if (!devcon) devcon = output.createBuffer(DevConOff.Size)
|
|
||||||
updateUartMode(devcon, sensorInfo.port, 0);
|
|
||||||
}
|
|
||||||
} else if (newConn == DAL.CONN_NXT_IIC) {
|
} else if (newConn == DAL.CONN_NXT_IIC) {
|
||||||
control.dmesg(`new IIC connection at ${sensorInfo.port}`)
|
control.dmesg(`new IIC connection at ${sensorInfo.port}`)
|
||||||
sensorInfo.devType = DAL.DEVICE_TYPE_IIC_UNKNOWN
|
sensorInfo.devType = DAL.DEVICE_TYPE_IIC_UNKNOWN
|
||||||
@ -294,31 +315,33 @@ void cUiUpdatePower(void)
|
|||||||
// TODO? for now assume touch
|
// TODO? for now assume touch
|
||||||
sensorInfo.devType = DAL.DEVICE_TYPE_TOUCH
|
sensorInfo.devType = DAL.DEVICE_TYPE_TOUCH
|
||||||
} else if (newConn == DAL.CONN_NONE || newConn == 0) {
|
} else if (newConn == DAL.CONN_NONE || newConn == 0) {
|
||||||
control.dmesg(`disconnected port ${sensorInfo.port}`)
|
//control.dmesg(`disconnect at port ${sensorInfo.port}`)
|
||||||
// clear sensor
|
|
||||||
sensorInfo.sensor = undefined;
|
|
||||||
} else {
|
} else {
|
||||||
control.dmesg(`unknown connection type: ${newConn} at ${sensorInfo.port}`)
|
control.dmesg(`unknown connection type: ${newConn} at ${sensorInfo.port}`)
|
||||||
// clear sensor
|
|
||||||
sensorInfo.sensor = undefined;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (devcon)
|
if (uartSensors.length > 0) {
|
||||||
setUartModes(devcon);
|
setUartModes();
|
||||||
|
for (const sensorInfo of uartSensors) {
|
||||||
for (const sensorInfo of sensorInfos.filter(si => si.connType == DAL.CONN_INPUT_UART && si.devType == DAL.CONN_NONE)) {
|
let uinfo = readUartInfo(sensorInfo.port, 0)
|
||||||
const uinfo = readUartInfo(sensorInfo.port, 0);
|
sensorInfo.devType = uinfo[TypesOff.Type]
|
||||||
sensorInfo.devType = uinfo[TypesOff.Type];
|
const mode = uinfo[TypesOff.Mode];
|
||||||
control.dmesg(`UART type ${sensorInfo.devType}`)
|
control.dmesg(`UART type ${sensorInfo.devType} mode ${mode}`)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// assign sensors
|
if (numChanged == 0 && nonActivated == 0)
|
||||||
for (const sensorInfo of sensorInfos.filter(si => !si.sensor)) {
|
return
|
||||||
|
|
||||||
|
//control.dmesg(`updating sensor status`)
|
||||||
|
nonActivated = 0;
|
||||||
|
for (const sensorInfo of sensorInfos) {
|
||||||
if (sensorInfo.devType == DAL.DEVICE_TYPE_IIC_UNKNOWN) {
|
if (sensorInfo.devType == DAL.DEVICE_TYPE_IIC_UNKNOWN) {
|
||||||
sensorInfo.sensor = sensorInfo.sensors.filter(s => s._IICId() == sensorInfo.iicid)[0]
|
sensorInfo.sensor = sensorInfo.sensors.filter(s => s._IICId() == sensorInfo.iicid)[0]
|
||||||
if (!sensorInfo.sensor) {
|
if (!sensorInfo.sensor) {
|
||||||
control.dmesg(`sensor not found for iicid=${sensorInfo.iicid} at ${sensorInfo.port}`)
|
control.dmesg(`sensor not found for iicid=${sensorInfo.iicid} at ${sensorInfo.port}`)
|
||||||
|
nonActivated++;
|
||||||
} else {
|
} else {
|
||||||
control.dmesg(`sensor connected iicid=${sensorInfo.iicid} at ${sensorInfo.port}`)
|
control.dmesg(`sensor connected iicid=${sensorInfo.iicid} at ${sensorInfo.port}`)
|
||||||
sensorInfo.sensor._activated()
|
sensorInfo.sensor._activated()
|
||||||
@ -327,29 +350,14 @@ void cUiUpdatePower(void)
|
|||||||
sensorInfo.sensor = sensorInfo.sensors.filter(s => s._deviceType() == sensorInfo.devType)[0]
|
sensorInfo.sensor = sensorInfo.sensors.filter(s => s._deviceType() == sensorInfo.devType)[0]
|
||||||
if (!sensorInfo.sensor) {
|
if (!sensorInfo.sensor) {
|
||||||
control.dmesg(`sensor not found for type=${sensorInfo.devType} at ${sensorInfo.port}`)
|
control.dmesg(`sensor not found for type=${sensorInfo.devType} at ${sensorInfo.port}`)
|
||||||
|
nonActivated++;
|
||||||
} else {
|
} else {
|
||||||
control.dmesg(`sensor connected type=${sensorInfo.devType} at ${sensorInfo.port}`)
|
control.dmesg(`sensor connected type=${sensorInfo.devType} at ${sensorInfo.port}`)
|
||||||
sensorInfo.sensor._activated()
|
sensorInfo.sensor._activated()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//control.dmesg(`detect devices done`)
|
||||||
// check uart sensors
|
|
||||||
for (const sensorInfo of sensorInfos.filter(si => si.connType == DAL.CONN_INPUT_UART && !!si.sensor)) {
|
|
||||||
const status = getUartStatus(sensorInfo.port);
|
|
||||||
control.dmesg(`UART status ${status} at ${sensorInfo.port}`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// this function will return a meaningful result only when stats & CHANGED
|
|
||||||
// it is cleared afterwards
|
|
||||||
function readUartInfo(port: number, mode: number) {
|
|
||||||
const buf = output.createBuffer(UartCtlOff.Size)
|
|
||||||
buf[UartCtlOff.Port] = port
|
|
||||||
buf[UartCtlOff.Mode] = mode
|
|
||||||
uartMM.ioctl(IO.UART_READ_MODE_INFO, buf)
|
|
||||||
control.dmesg(`UART_READ_MODE t:${buf[TypesOff.Type]} c:${buf[TypesOff.Connection]} m:${buf[TypesOff.Mode]} n:${buf.slice(0, 12).toHex()}`);
|
|
||||||
return buf
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export class Sensor extends control.Component {
|
export class Sensor extends control.Component {
|
||||||
@ -508,8 +516,8 @@ void cUiUpdatePower(void)
|
|||||||
export const iicsensor = new IICSensor(3)
|
export const iicsensor = new IICSensor(3)
|
||||||
|
|
||||||
function uartReset(port: number) {
|
function uartReset(port: number) {
|
||||||
|
if (port < 0) return
|
||||||
control.dmesg(`UART reset at ${port}`)
|
control.dmesg(`UART reset at ${port}`)
|
||||||
const devcon = output.createBuffer(DevConOff.Size)
|
|
||||||
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Connection + port, DAL.CONN_NONE)
|
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Connection + port, DAL.CONN_NONE)
|
||||||
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Type + port, 0)
|
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Type + port, 0)
|
||||||
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Mode + port, 0)
|
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Mode + port, 0)
|
||||||
@ -517,18 +525,17 @@ void cUiUpdatePower(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getUartStatus(port: number) {
|
function getUartStatus(port: number) {
|
||||||
|
if (port < 0) return 0
|
||||||
return uartMM.getNumber(NumberFormat.Int8LE, UartOff.Status + port)
|
return uartMM.getNumber(NumberFormat.Int8LE, UartOff.Status + port)
|
||||||
}
|
}
|
||||||
|
|
||||||
function waitNonZeroUartStatus(port: number): number {
|
function waitNonZeroUartStatus(port: number) {
|
||||||
let retry = 20;
|
while (true) {
|
||||||
while (retry-- > 0) {
|
if (port < 0) return 0
|
||||||
const s = getUartStatus(port)
|
let s = getUartStatus(port)
|
||||||
if (s) return s;
|
if (s) return s
|
||||||
control.dmesg(`UART status 0, waiting...`)
|
|
||||||
pause(25)
|
pause(25)
|
||||||
}
|
}
|
||||||
return 0
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function uartClearChange(port: number) {
|
function uartClearChange(port: number) {
|
||||||
@ -540,11 +547,10 @@ void cUiUpdatePower(void)
|
|||||||
if ((status & UART_DATA_READY) != 0 && (status & UART_PORT_CHANGED) == 0)
|
if ((status & UART_DATA_READY) != 0 && (status & UART_PORT_CHANGED) == 0)
|
||||||
break
|
break
|
||||||
|
|
||||||
const devcon = output.createBuffer(DevConOff.Size)
|
|
||||||
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Connection + port, DAL.CONN_INPUT_UART)
|
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Connection + port, DAL.CONN_INPUT_UART)
|
||||||
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Type + port, 0)
|
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Type + port, 0)
|
||||||
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Mode + port, 0)
|
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Mode + port, 0)
|
||||||
control.dmesg(`UART_CLEAR_CHANGED status ${status} ${devcon.toHex()}`)
|
|
||||||
uartMM.ioctl(IO.UART_CLEAR_CHANGED, devcon)
|
uartMM.ioctl(IO.UART_CLEAR_CHANGED, devcon)
|
||||||
|
|
||||||
uartMM.setNumber(NumberFormat.Int8LE, UartOff.Status + port,
|
uartMM.setNumber(NumberFormat.Int8LE, UartOff.Status + port,
|
||||||
@ -553,8 +559,8 @@ void cUiUpdatePower(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function setUartModes(devcon: Buffer) {
|
function setUartModes() {
|
||||||
control.dmesg(`UART_SET_CONN ${devcon.toHex()}`)
|
control.dmesg(`UART set modes 0x${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) {
|
||||||
@ -567,22 +573,25 @@ void cUiUpdatePower(void)
|
|||||||
const port = ports.pop();
|
const port = ports.pop();
|
||||||
const status = waitNonZeroUartStatus(port)
|
const status = waitNonZeroUartStatus(port)
|
||||||
control.dmesg(`UART status ${status} at ${port}`);
|
control.dmesg(`UART status ${status} at ${port}`);
|
||||||
|
if (!(status & UART_DATA_READY))
|
||||||
|
setUartMode(port, devcon[DevConOff.Mode + port]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateUartMode(devcon: Buffer, port: number, mode: number) {
|
function updateUartMode(port: number, mode: number) {
|
||||||
control.dmesg(`UART update mode to ${mode} at ${port}`)
|
control.dmesg(`UART update mode to ${mode} at ${port}`)
|
||||||
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Connection + port, DAL.CONN_INPUT_UART)
|
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Connection + port, DAL.CONN_INPUT_UART)
|
||||||
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Type + port, 33)
|
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Type + port, 33)
|
||||||
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Mode + port, mode)
|
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Mode + port, mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const UART_PORT_CHANGED = 1
|
||||||
|
const UART_DATA_READY = 8
|
||||||
function setUartMode(port: number, mode: number) {
|
function setUartMode(port: number, mode: number) {
|
||||||
control.dmesg(`UART set mode ${mode} at ${port}`);
|
|
||||||
while (true) {
|
while (true) {
|
||||||
const devcon = output.createBuffer(DevConOff.Size)
|
if (port < 0) return
|
||||||
updateUartMode(devcon, port, mode);
|
updateUartMode(port, mode);
|
||||||
control.dmesg(`UART_SET_CONN ${devcon.toHex()}`)
|
control.dmesg(`UART set mode 0x${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) {
|
||||||
@ -614,7 +623,6 @@ void cUiUpdatePower(void)
|
|||||||
|
|
||||||
export function setIICMode(port: number, type: number, mode: number) {
|
export function setIICMode(port: number, type: number, mode: number) {
|
||||||
if (port < 0) return;
|
if (port < 0) return;
|
||||||
const devcon = output.createBuffer(DevConOff.Size)
|
|
||||||
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Connection + port, DAL.CONN_NXT_IIC)
|
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Connection + port, DAL.CONN_NXT_IIC)
|
||||||
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Type + port, type)
|
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Type + port, type)
|
||||||
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Mode + port, mode)
|
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Mode + port, mode)
|
||||||
@ -623,7 +631,7 @@ void cUiUpdatePower(void)
|
|||||||
|
|
||||||
export function transactionIIC(port: number, deviceAddress: number, writeBuf: number[], readLen: number) {
|
export function transactionIIC(port: number, deviceAddress: number, writeBuf: number[], readLen: number) {
|
||||||
if (port < 0) return;
|
if (port < 0) return;
|
||||||
const iicdata = output.createBuffer(IICDat.Size)
|
let iicdata = output.createBuffer(IICDat.Size)
|
||||||
iicdata.setNumber(NumberFormat.Int8LE, IICDat.Port, port)
|
iicdata.setNumber(NumberFormat.Int8LE, IICDat.Port, port)
|
||||||
iicdata.setNumber(NumberFormat.Int8LE, IICDat.Repeat, 0)
|
iicdata.setNumber(NumberFormat.Int8LE, IICDat.Repeat, 0)
|
||||||
iicdata.setNumber(NumberFormat.Int16LE, IICDat.Time, 0)
|
iicdata.setNumber(NumberFormat.Int16LE, IICDat.Time, 0)
|
||||||
|
@ -55,7 +55,7 @@ namespace motors {
|
|||||||
Size = 12
|
Size = 12
|
||||||
}
|
}
|
||||||
|
|
||||||
export function init() {
|
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")
|
||||||
|
@ -2,6 +2,5 @@
|
|||||||
console.addListener(function(priority: ConsolePriority, msg: string) {
|
console.addListener(function(priority: ConsolePriority, msg: string) {
|
||||||
control.dmesg(msg.substr(0, msg.length - 1))
|
control.dmesg(msg.substr(0, msg.length - 1))
|
||||||
})
|
})
|
||||||
|
|
||||||
// boot sequence
|
// boot sequence
|
||||||
brick.showBoot();
|
brick.showBoot();
|
@ -141,8 +141,6 @@ namespace brick {
|
|||||||
const col = 44;
|
const col = 44;
|
||||||
const lineHeight8 = image.font8.charHeight + 2;
|
const lineHeight8 = image.font8.charHeight + 2;
|
||||||
const h = screen.height;
|
const h = screen.height;
|
||||||
const w = screen.width;
|
|
||||||
const blink = (control.millis() >> 5) % (h - 1);
|
|
||||||
|
|
||||||
clearScreen();
|
clearScreen();
|
||||||
|
|
||||||
@ -182,23 +180,21 @@ namespace brick {
|
|||||||
if (inf)
|
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() {
|
export function showBoot() {
|
||||||
// pulse green, play startup sound, turn off light
|
// pulse green, play startup sound, turn off light
|
||||||
brick.setStatusLight(StatusLight.GreenPulse);
|
brick.setStatusLight(StatusLight.GreenPulse);
|
||||||
// We pause for 100ms to give time to read sensor values, so they work in on_start block
|
// We pause for 100ms to give time to read sensor values, so they work in on_start block
|
||||||
sensors.internal.init();
|
pause(400)
|
||||||
motors.init();
|
|
||||||
pause(800)
|
|
||||||
// and we're ready
|
// and we're ready
|
||||||
brick.setStatusLight(StatusLight.Off);
|
brick.setStatusLight(StatusLight.Off);
|
||||||
|
// always show port by default if no UI is set
|
||||||
|
control.runInParallel(function () {
|
||||||
|
// show ports if nothing is has been shown
|
||||||
|
if (screenMode != ScreenMode.None) return;
|
||||||
|
showPorts();
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "pxt-ev3",
|
"name": "pxt-ev3",
|
||||||
"version": "1.4.8",
|
"version": "1.4.17",
|
||||||
"description": "LEGO MINDSTORMS EV3 for Microsoft MakeCode",
|
"description": "LEGO MINDSTORMS EV3 for Microsoft MakeCode",
|
||||||
"private": false,
|
"private": false,
|
||||||
"keywords": [
|
"keywords": [
|
||||||
@ -45,8 +45,8 @@
|
|||||||
"@types/web-bluetooth": "0.0.4"
|
"@types/web-bluetooth": "0.0.4"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"pxt-common-packages": "6.16.18",
|
"pxt-common-packages": "6.16.37",
|
||||||
"pxt-core": "5.28.8"
|
"pxt-core": "5.30.19"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "node node_modules/pxt-core/built/pxt.js travis"
|
"test": "node node_modules/pxt-core/built/pxt.js travis"
|
||||||
|
@ -37,7 +37,10 @@
|
|||||||
"publishing": true,
|
"publishing": true,
|
||||||
"importing": true,
|
"importing": true,
|
||||||
"preferredPackages": [],
|
"preferredPackages": [],
|
||||||
"githubPackages": true
|
"githubPackages": true,
|
||||||
|
"cloudProviders": {
|
||||||
|
"github": {}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"compile": {
|
"compile": {
|
||||||
"isNative": true,
|
"isNative": true,
|
||||||
@ -201,5 +204,6 @@
|
|||||||
"alwaysGithubItem": true,
|
"alwaysGithubItem": true,
|
||||||
"enableTrace": true
|
"enableTrace": true
|
||||||
},
|
},
|
||||||
"ignoreDocsErrors": true
|
"ignoreDocsErrors": true,
|
||||||
|
"uploadDocs": true
|
||||||
}
|
}
|
Reference in New Issue
Block a user