From 7481b9c24c1268640bf2a037caddedd719a822ee Mon Sep 17 00:00:00 2001 From: Peli de Halleux Date: Mon, 8 Aug 2016 16:54:43 -0700 Subject: [PATCH] call receiveNumber in onDataReceived to flush queue if needed (startup race) fixed simulator issue when event onDataReceived gets raised --- libs/microbit-radio/radio.cpp | 27 ++++++++++++++++----------- libs/microbit-radio/shims.d.ts | 16 ++++++++-------- sim/libmbit.ts | 1 + sim/state.ts | 5 ++--- 4 files changed, 27 insertions(+), 22 deletions(-) diff --git a/libs/microbit-radio/radio.cpp b/libs/microbit-radio/radio.cpp index fb59b495..2bcbfbc0 100644 --- a/libs/microbit-radio/radio.cpp +++ b/libs/microbit-radio/radio.cpp @@ -134,16 +134,6 @@ namespace radio { uBit.serial.send("}\r\n"); } - /** - * Registers code to run when a packet is received over radio. - */ - //% help=radio/on-data-received - //% weight=50 - //% blockId=radio_datagram_received_event block="radio on data received" blockGap=8 - void onDataReceived(Action body) { - if (radioEnable() != MICROBIT_OK) return; - registerWithDal(MICROBIT_ID_RADIO, MICROBIT_RADIO_EVT_DATAGRAM, body); - } /** * Reads a number at a given index, between ``0`` and ``3``, from the packet received by ``receive number``. Not supported in simulator. @@ -162,7 +152,7 @@ namespace radio { } return 0; } - + /** * Reads the next packet as a number from the radio queue. */ @@ -175,6 +165,20 @@ namespace radio { packet = uBit.radio.datagram.recv(); return receivedNumberAt(0); } + + /** + * Registers code to run when a packet is received over radio. + */ + //% help=radio/on-data-received + //% weight=50 + //% blockId=radio_datagram_received_event block="radio on data received" blockGap=8 + void onDataReceived(Action body) { + if (radioEnable() != MICROBIT_OK) return; + registerWithDal(MICROBIT_ID_RADIO, MICROBIT_RADIO_EVT_DATAGRAM, body); + // make the the receive buffer has a free spot + receiveNumber(); + } + /** * Reads the next packet as a string and returns it. @@ -231,6 +235,7 @@ namespace radio { //% weight=8 blockGap=8 //% blockId=radio_set_transmit_serial_number block="radio set transmit serial number %transmit" void setTransmitSerialNumber(bool transmit) { + if (radioEnable() != MICROBIT_OK) return; transmitSerialNumber = transmit; } } diff --git a/libs/microbit-radio/shims.d.ts b/libs/microbit-radio/shims.d.ts index 449ac8f1..1d27d7b7 100644 --- a/libs/microbit-radio/shims.d.ts +++ b/libs/microbit-radio/shims.d.ts @@ -41,14 +41,6 @@ declare namespace radio { //% blockId=radio_write_value_serial block="radio write value to serial" shim=radio::writeValueToSerial function writeValueToSerial(): void; - /** - * Registers code to run when a packet is received over radio. - */ - //% help=radio/on-data-received - //% weight=50 - //% blockId=radio_datagram_received_event block="radio on data received" blockGap=8 shim=radio::onDataReceived - function onDataReceived(body: () => void): void; - /** * Reads a number at a given index, between ``0`` and ``3``, from the packet received by ``receive number``. Not supported in simulator. * @param index index of the number to read from 0 to 3. 1 eg @@ -66,6 +58,14 @@ declare namespace radio { //% blockId=radio_datagram_receive block="radio receive number" blockGap=8 shim=radio::receiveNumber function receiveNumber(): number; + /** + * Registers code to run when a packet is received over radio. + */ + //% help=radio/on-data-received + //% weight=50 + //% blockId=radio_datagram_received_event block="radio on data received" blockGap=8 shim=radio::onDataReceived + function onDataReceived(body: () => void): void; + /** * Reads the next packet as a string and returns it. */ diff --git a/sim/libmbit.ts b/sim/libmbit.ts index 6b7d1904..d36fa5a7 100644 --- a/sim/libmbit.ts +++ b/sim/libmbit.ts @@ -517,6 +517,7 @@ namespace pxsim.radio { export function onDataReceived(handler: RefAction): void { pxt.registerWithDal(DAL.MICROBIT_ID_RADIO, DAL.MICROBIT_RADIO_EVT_DATAGRAM, handler); + radio.receiveNumber(); } } diff --git a/sim/state.ts b/sim/state.ts index 2fced2ac..9febc82c 100644 --- a/sim/state.ts +++ b/sim/state.ts @@ -72,10 +72,9 @@ namespace pxsim { } queue(packet: PacketBuffer) { - if (this.datagram.length < 5) { + if (this.datagram.length < 4) this.datagram.push(packet); - (runtime.board).bus.queue(DAL.MICROBIT_ID_RADIO, DAL.MICROBIT_RADIO_EVT_DATAGRAM); - } + (runtime.board).bus.queue(DAL.MICROBIT_ID_RADIO, DAL.MICROBIT_RADIO_EVT_DATAGRAM); } send(buffer: number[] | string) {