This commit is contained in:
Michal Moskal 2017-07-10 12:47:00 +01:00
parent 03b864c355
commit 0cc3cfee4b
9 changed files with 86 additions and 20 deletions

View File

@ -27,4 +27,13 @@ int allocateNotifyEvent() {
void dmesg(String s) { void dmesg(String s) {
DMESG("# %s", s->data); DMESG("# %s", s->data);
} }
} }
namespace serial {
/** Send DMESG debug buffer over serial. */
//%
void writeDmesg() {
pxt::dumpDmesg();
}
}

View File

@ -27,6 +27,7 @@ const enum LMS {
DEVICE_TYPE_MINITACHO = 8, DEVICE_TYPE_MINITACHO = 8,
DEVICE_TYPE_NEWTACHO = 9, DEVICE_TYPE_NEWTACHO = 9,
DEVICE_TYPE_TOUCH = 16, DEVICE_TYPE_TOUCH = 16,
DEVICE_TYPE_IR = 33,
DEVICE_TYPE_THIRD_PARTY_START = 50, DEVICE_TYPE_THIRD_PARTY_START = 50,
DEVICE_TYPE_THIRD_PARTY_END = 99, DEVICE_TYPE_THIRD_PARTY_END = 99,
DEVICE_TYPE_IIC_UNKNOWN = 100, DEVICE_TYPE_IIC_UNKNOWN = 100,

6
libs/core/dmesg.txt Normal file
View File

@ -0,0 +1,6 @@
[ 1] runtime starting...
[ 53] runtime started [V0.60]
[ 55] mmap /dev/lms_analog len=5172 off=0
[ 56] mmap /dev/lms_uart len=42744 off=0
[ 64] Error: 7 [0]
[ 64] PANIC 42

View File

@ -80,16 +80,19 @@ namespace input.internal {
info.connType = newConn info.connType = newConn
info.devType = LMS.DEVICE_TYPE_NONE info.devType = LMS.DEVICE_TYPE_NONE
if (newConn == LMS.CONN_INPUT_UART) { if (newConn == LMS.CONN_INPUT_UART) {
control.dmesg(`new UART connection at ${info.port}`)
setUartMode(info.port, 0) setUartMode(info.port, 0)
let uinfo = readUartInfo(info.port, 0) let uinfo = readUartInfo(info.port, 0)
info.devType = uinfo[TypesOff.Type] info.devType = uinfo[TypesOff.Type]
control.dmesg(`UART type ${info.devType}`)
} else if (newConn == LMS.CONN_INPUT_DUMB) { } else if (newConn == LMS.CONN_INPUT_DUMB) {
control.dmesg(`new DUMB connection at ${info.port}`)
// TODO? for now assume touch // TODO? for now assume touch
info.devType = LMS.DEVICE_TYPE_TOUCH info.devType = LMS.DEVICE_TYPE_TOUCH
} else if (newConn == LMS.CONN_NONE) { } else if (newConn == LMS.CONN_NONE || newConn == 0) {
// OK control.dmesg(`disconnect at ${info.port}`)
} else { } else {
// ??? control.dmesg(`unknown connection type: ${newConn} at ${info.port}`)
} }
} }
@ -106,12 +109,16 @@ namespace input.internal {
for (let info of autos) { for (let info of autos) {
if (!info.sensor && info.devType != LMS.DEVICE_TYPE_NONE) { if (!info.sensor && info.devType != LMS.DEVICE_TYPE_NONE) {
let found = false
for (let s of autoSensors) { for (let s of autoSensors) {
if (s.getPort() == 0 && s._deviceType() == info.devType) { if (s.getPort() == 0 && s._deviceType() == info.devType) {
s._setPort(info.port + 1) s._setPort(info.port + 1)
found = true
break break
} }
} }
if (!found)
control.dmesg(`sensor not found for type=${info.devType} at ${info.port}`)
} }
} }
} }
@ -133,6 +140,8 @@ namespace input.internal {
_setPort(port: number, manual = false) { _setPort(port: number, manual = false) {
port = Math.clamp(0, 4, port | 0) - 1; port = Math.clamp(0, 4, port | 0) - 1;
if (port == this.port) return if (port == this.port) return
this.port = port
control.dmesg(`sensor set port ${port} on devtype=${this._deviceType()}`)
for (let i = 0; i < sensors.length; ++i) { for (let i = 0; i < sensors.length; ++i) {
if (i != this.port && sensors[i].sensor == this) { if (i != this.port && sensors[i].sensor == this) {
sensors[i] = null sensors[i] = null
@ -190,27 +199,33 @@ namespace input.internal {
export class UartSensor extends Sensor { export class UartSensor extends Sensor {
protected mode: number protected mode: number
protected realmode: number
constructor() { constructor() {
super() super()
this.mode = 0
this.realmode = -1
} }
protected _portUpdated() { protected _portUpdated() {
this.mode = -1 this.realmode = -1
if (this.port > 0) { if (this.port > 0) {
if (this.isManual()) { if (this.isManual()) {
uartReset(this.port) uartReset(this.port)
} else { } else {
this.mode = 0 this.realmode = 0
} }
this._setMode(this.mode)
} }
} }
protected _setMode(m: number) { protected _setMode(m: number) {
if (this.port < 0) return //control.dmesg(`_setMode p=${this.port} m: ${this.realmode} -> ${m}`)
let v = m | 0 let v = m | 0
if (v != this.mode) { this.mode = v
this.mode = v if (this.port < 0) return
if (this.realmode != this.mode) {
this.realmode = v
setUartMode(this.port, v) setUartMode(this.port, v)
} }
} }
@ -226,6 +241,7 @@ namespace input.internal {
function uartReset(port: number) { function uartReset(port: number) {
if (port < 0) return if (port < 0) return
control.dmesg(`UART reset at ${port}`)
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Connection + port, LMS.CONN_NONE) devcon.setNumber(NumberFormat.Int8LE, DevConOff.Connection + port, LMS.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)
@ -272,6 +288,7 @@ namespace input.internal {
const UART_PORT_CHANGED = 1 const UART_PORT_CHANGED = 1
while (true) { while (true) {
if (port < 0) return if (port < 0) return
control.dmesg(`UART set mode to ${mode} at ${port}`)
devcon.setNumber(NumberFormat.Int8LE, DevConOff.Connection + port, LMS.CONN_INPUT_UART) devcon.setNumber(NumberFormat.Int8LE, DevConOff.Connection + port, LMS.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)

View File

@ -77,6 +77,10 @@ namespace input {
} }
} }
_deviceType() {
return LMS.DEVICE_TYPE_IR
}
setRemoteChannel(c: IrRemoteChannel) { setRemoteChannel(c: IrRemoteChannel) {
c = Math.clamp(0, 3, c | 0) c = Math.clamp(0, 3, c | 0)
this.channel = c this.channel = c

View File

@ -52,6 +52,7 @@ static struct Thread *allThreads;
static struct Event *eventHead, *eventTail; static struct Event *eventHead, *eventTail;
static int usbFD; static int usbFD;
static int dmesgPtr; static int dmesgPtr;
static int dmesgSerialPtr;
static char dmesgBuf[4096]; static char dmesgBuf[4096];
struct Event { struct Event {
@ -366,9 +367,11 @@ uint32_t afterProgramPage() {
return 0; return 0;
} }
void dumpDmesg() { void dumpDmesg() {
sendSerial("\nDMESG:\n", 8); auto len = dmesgPtr - dmesgSerialPtr;
sendSerial(dmesgBuf, dmesgPtr); if (len == 0)
sendSerial("\n\n", 2); return;
sendSerial(dmesgBuf + dmesgSerialPtr, len);
dmesgSerialPtr = dmesgPtr;
} }
int lmsPid; int lmsPid;
@ -458,6 +461,7 @@ void dmesgRaw(const char *buf, uint32_t len) {
return; return;
if (dmesgPtr + len > sizeof(dmesgBuf)) { if (dmesgPtr + len > sizeof(dmesgBuf)) {
dmesgPtr = 0; dmesgPtr = 0;
dmesgSerialPtr = 0;
} }
memcpy(dmesgBuf + dmesgPtr, buf, len); memcpy(dmesgBuf + dmesgPtr, buf, len);
dmesgPtr += len; dmesgPtr += len;

View File

@ -56,6 +56,12 @@ declare namespace control {
//% shim=control::dmesg //% shim=control::dmesg
function dmesg(s: string): void; function dmesg(s: string): void;
} }
declare namespace serial {
/** Send DMESG debug buffer over serial. */
//% shim=serial::writeDmesg
function writeDmesg(): void;
}
declare namespace input { declare namespace input {
/** /**

View File

@ -26,12 +26,27 @@ input.buttonUp.onEvent(ButtonEvent.Click, () => {
screen.scroll(10) screen.scroll(10)
}) })
for (let i = 0; i < 3; ++i) {
loops.forever(() => { let num = 0
let r = Math.randomRange(0, 100)
serial.writeValue("R", r) input.touch.button.onEvent(ButtonEvent.Click, () => {
//screen.drawText(10, 10, `R=${r}`) screen.drawText(10, 60, "Click! " + num)
loops.pause(1000) num++
}) })
loops.pause(300)
} input.ir.getRemoteCommand()
input.ir.button(IrRemoteButton.TopLeft).onEvent(ButtonEvent.Down, () => {
screen.drawText(10, 60, "TOPLEFT " + num)
num++
})
input.ir.button(IrRemoteButton.TopRight).onEvent(ButtonEvent.Down, () => {
screen.drawText(10, 60, "TOPRIGH " + num)
num++
})
loops.forever(() => {
serial.writeDmesg()
loops.pause(400)
})

View File

@ -14,6 +14,10 @@ namespace input {
_update(prev: number, curr: number) { _update(prev: number, curr: number) {
this.button.update(curr > 0) this.button.update(curr > 0)
} }
_deviceType() {
return LMS.DEVICE_TYPE_TOUCH
}
} }
//% whenUsed //% whenUsed