parent
7433fd8beb
commit
36b8e5d661
@ -41,14 +41,18 @@ namespace radio {
|
||||
//% help=radio/received-packet
|
||||
Buffer readRawPacket() {
|
||||
if (radioEnable() != MICROBIT_OK) return mkBuffer(NULL, 0);
|
||||
packet = uBit.radio.datagram.recv();
|
||||
return mkBuffer(packet.getBytes(), packet.length());
|
||||
uint8_t buf[32];
|
||||
int size = uBit.radio.datagram.recv(buf, sizeof(buf));
|
||||
if (size <= 0)
|
||||
return mkBuffer(NULL, 0);
|
||||
return mkBuffer(buf, size);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a raw packet through the radio
|
||||
*/
|
||||
//% advanced=true
|
||||
//% async
|
||||
void sendRawPacket(Buffer msg) {
|
||||
if (radioEnable() != MICROBIT_OK || NULL == msg) return;
|
||||
uBit.radio.datagram.send(msg->data, msg->length);
|
||||
|
@ -16,10 +16,6 @@ enum RadioPacketProperty {
|
||||
*/
|
||||
//% color=#E3008C weight=96 icon="\uf012"
|
||||
namespace radio {
|
||||
export const MAKECODE_RADIO_EVT_NUMBER = 10;
|
||||
export const MAKECODE_RADIO_EVT_STRING = 11;
|
||||
export const MAKECODE_RADIO_EVT_BUFFER = 12;
|
||||
export const MAKECODE_RADIO_EVT_VALUE = 13;
|
||||
|
||||
const MAX_FIELD_DOUBLE_NAME_LENGTH = 8;
|
||||
const MAX_PAYLOAD_LENGTH = 20;
|
||||
@ -51,30 +47,43 @@ namespace radio {
|
||||
let initialized = false;
|
||||
|
||||
export let lastPacket: RadioPacket;
|
||||
let onReceivedNumberHandler: (receivedNumber: number) => void;
|
||||
let onReceivedValueHandler: (name: string, value: number) => void;
|
||||
let onReceivedStringHandler: (receivedString: string) => void;
|
||||
let onReceivedBufferHandler: (receivedBuffer: Buffer) => void;
|
||||
|
||||
function init() {
|
||||
if (initialized) return;
|
||||
initialized = true;
|
||||
|
||||
onDataReceived(() => {
|
||||
lastPacket = RadioPacket.getPacket(readRawPacket());
|
||||
lastPacket.signal = receivedSignalStrength();
|
||||
let buffer: Buffer = readRawPacket();
|
||||
while (buffer && buffer.length) {
|
||||
lastPacket = RadioPacket.getPacket(buffer);
|
||||
lastPacket.signal = receivedSignalStrength();
|
||||
switch (lastPacket.packetType) {
|
||||
case PACKET_TYPE_NUMBER:
|
||||
case PACKET_TYPE_DOUBLE:
|
||||
if (onReceivedNumberHandler)
|
||||
onReceivedNumberHandler(lastPacket.numberPayload);
|
||||
break;
|
||||
case PACKET_TYPE_VALUE:
|
||||
case PACKET_TYPE_DOUBLE_VALUE:
|
||||
if (onReceivedValueHandler)
|
||||
onReceivedValueHandler(lastPacket.stringPayload, lastPacket.numberPayload);
|
||||
break;
|
||||
case PACKET_TYPE_BUFFER:
|
||||
if(onReceivedBufferHandler)
|
||||
onReceivedBufferHandler(lastPacket.bufferPayload);
|
||||
break;
|
||||
case PACKET_TYPE_STRING:
|
||||
if (onReceivedStringHandler)
|
||||
onReceivedStringHandler(lastPacket.stringPayload);
|
||||
break;
|
||||
}
|
||||
|
||||
switch (lastPacket.packetType) {
|
||||
case PACKET_TYPE_NUMBER:
|
||||
case PACKET_TYPE_DOUBLE:
|
||||
control.raiseEvent(DAL.MICROBIT_ID_RADIO, MAKECODE_RADIO_EVT_NUMBER);
|
||||
break;
|
||||
case PACKET_TYPE_VALUE:
|
||||
case PACKET_TYPE_DOUBLE_VALUE:
|
||||
control.raiseEvent(DAL.MICROBIT_ID_RADIO, MAKECODE_RADIO_EVT_VALUE);
|
||||
break;
|
||||
case PACKET_TYPE_BUFFER:
|
||||
control.raiseEvent(DAL.MICROBIT_ID_RADIO, MAKECODE_RADIO_EVT_BUFFER);
|
||||
break;
|
||||
case PACKET_TYPE_STRING:
|
||||
control.raiseEvent(DAL.MICROBIT_ID_RADIO, MAKECODE_RADIO_EVT_STRING);
|
||||
break;
|
||||
// read next packet if any
|
||||
buffer = readRawPacket();
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -87,9 +96,7 @@ namespace radio {
|
||||
//% useLoc="radio.onDataPacketReceived" draggableParameters=reporter
|
||||
export function onReceivedNumber(cb: (receivedNumber: number) => void) {
|
||||
init();
|
||||
control.onEvent(DAL.MICROBIT_ID_RADIO, MAKECODE_RADIO_EVT_NUMBER, () => {
|
||||
cb(lastPacket.numberPayload);
|
||||
});
|
||||
onReceivedNumberHandler = cb;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -100,9 +107,7 @@ namespace radio {
|
||||
//% useLoc="radio.onDataPacketReceived" draggableParameters=reporter
|
||||
export function onReceivedValue(cb: (name: string, value: number) => void) {
|
||||
init();
|
||||
control.onEvent(DAL.MICROBIT_ID_RADIO, MAKECODE_RADIO_EVT_VALUE, () => {
|
||||
cb(lastPacket.stringPayload, lastPacket.numberPayload);
|
||||
});
|
||||
onReceivedValueHandler = cb;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -113,9 +118,7 @@ namespace radio {
|
||||
//% useLoc="radio.onDataPacketReceived" draggableParameters=reporter
|
||||
export function onReceivedString(cb: (receivedString: string) => void) {
|
||||
init();
|
||||
control.onEvent(DAL.MICROBIT_ID_RADIO, MAKECODE_RADIO_EVT_STRING, () => {
|
||||
cb(lastPacket.stringPayload);
|
||||
});
|
||||
onReceivedStringHandler = cb;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -126,9 +129,7 @@ namespace radio {
|
||||
//% useLoc="radio.onDataPacketReceived" draggableParameters=reporter
|
||||
export function onReceivedBuffer(cb: (receivedBuffer: Buffer) => void) {
|
||||
init();
|
||||
control.onEvent(DAL.MICROBIT_ID_RADIO, MAKECODE_RADIO_EVT_BUFFER, () => {
|
||||
cb(lastPacket.bufferPayload);
|
||||
});
|
||||
onReceivedBufferHandler = cb;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -140,7 +141,7 @@ namespace radio {
|
||||
//% blockId=radio_received_packet block="received packet %type=radio_packet_property" blockGap=16
|
||||
export function receivedPacket(type: number) {
|
||||
if (lastPacket) {
|
||||
switch(type) {
|
||||
switch (type) {
|
||||
case RadioPacketProperty.Time: return lastPacket.time;
|
||||
case RadioPacketProperty.SerialNumber: return lastPacket.serial;
|
||||
case RadioPacketProperty.SignalStrength: return lastPacket.signal;
|
||||
|
3
libs/radio/shims.d.ts
vendored
3
libs/radio/shims.d.ts
vendored
@ -24,7 +24,8 @@ declare namespace radio {
|
||||
/**
|
||||
* Sends a raw packet through the radio
|
||||
*/
|
||||
//% advanced=true shim=radio::sendRawPacket
|
||||
//% advanced=true
|
||||
//% async shim=radio::sendRawPacket
|
||||
function sendRawPacket(msg: Buffer): void;
|
||||
|
||||
/**
|
||||
|
@ -48,7 +48,7 @@ namespace pxsim {
|
||||
rssi: -1,
|
||||
serial: 0,
|
||||
time: 0,
|
||||
payload: { type: -1, groupId: 0 }
|
||||
payload: { type: -1, groupId: 0, bufferData: new Uint8Array(0) }
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -109,11 +109,13 @@ namespace pxsim.radio {
|
||||
}
|
||||
|
||||
export function sendRawPacket(buf: RefBuffer) {
|
||||
let cb = getResume();
|
||||
board().radioState.datagram.send({
|
||||
type: 0,
|
||||
groupId: board().radioState.groupId,
|
||||
bufferData: buf.data
|
||||
});
|
||||
setTimeout(cb, 1);
|
||||
}
|
||||
|
||||
export function readRawPacket() {
|
||||
|
Loading…
Reference in New Issue
Block a user