2019-12-02 05:58:26 +01:00
|
|
|
namespace radio {
|
|
|
|
export class Packet {
|
|
|
|
/**
|
|
|
|
* The number payload if a number was sent in this packet (via ``sendNumber()`` or ``sendValue()``)
|
|
|
|
* or 0 if this packet did not contain a number.
|
|
|
|
*/
|
|
|
|
public receivedNumber: number;
|
|
|
|
/**
|
|
|
|
* The string payload if a string was sent in this packet (via ``sendString()`` or ``sendValue()``)
|
|
|
|
* or the empty string if this packet did not contain a string.
|
|
|
|
*/
|
|
|
|
public receivedString: string;
|
|
|
|
/**
|
|
|
|
* The buffer payload if a buffer was sent in this packet
|
|
|
|
* or the empty buffer
|
|
|
|
*/
|
|
|
|
public receivedBuffer: Buffer;
|
|
|
|
/**
|
|
|
|
* The system time of the sender of the packet at the time the packet was sent.
|
|
|
|
*/
|
|
|
|
public time: number;
|
|
|
|
/**
|
|
|
|
* The serial number of the sender of the packet or 0 if the sender did not sent their serial number.
|
|
|
|
*/
|
|
|
|
public serial: number;
|
|
|
|
/**
|
|
|
|
* The received signal strength indicator (RSSI) of the packet.
|
|
|
|
*/
|
|
|
|
public signal: number;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Deprecated. Use onDataReceived() instead
|
|
|
|
* Registers code to run when the radio receives a packet. Also takes the
|
|
|
|
* received packet from the radio queue.
|
|
|
|
*/
|
|
|
|
//% help=radio/on-data-packet-received blockHandlerKey="radioreceived" deprecated=true
|
|
|
|
//% mutate=objectdestructuring
|
|
|
|
//% mutateText=Packet
|
|
|
|
//% mutateDefaults="receivedNumber;receivedString:name,receivedNumber:value;receivedString"
|
|
|
|
//% blockId=radio_on_packet block="on radio received" blockGap=8
|
|
|
|
export function onDataPacketReceived(cb: (packet: Packet) => void) {
|
|
|
|
onDataReceived(() => {
|
|
|
|
receiveNumber();
|
|
|
|
const packet = new Packet();
|
|
|
|
packet.receivedNumber = receivedNumber();
|
|
|
|
packet.time = receivedTime();
|
|
|
|
packet.serial = receivedSerial();
|
|
|
|
packet.receivedString = receivedString();
|
|
|
|
packet.receivedBuffer = receivedBuffer();
|
|
|
|
packet.signal = receivedSignalStrength();
|
|
|
|
cb(packet)
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Registers code to run when the radio receives a number. Deprecated, use
|
|
|
|
* onReceivedNumber instead.
|
|
|
|
*/
|
|
|
|
//% help=radio/on-received-number blockHandlerKey="radioreceived"
|
|
|
|
//% blockId=radio_on_number block="on radio received" blockGap=16
|
|
|
|
//% useLoc="radio.onDataPacketReceived" deprecated=1
|
|
|
|
export function onReceivedNumberDeprecated(cb: (receivedNumber: number) => void) {
|
|
|
|
onReceivedNumber(cb);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Registers code to run when the radio receives a key value pair. Deprecated, use
|
|
|
|
* onReceivedValue instead.
|
|
|
|
*/
|
|
|
|
//% help=radio/on-received-value blockHandlerKey="radioreceived"
|
|
|
|
//% blockId=radio_on_value block="on radio received" blockGap=16
|
|
|
|
//% useLoc="radio.onDataPacketReceived" deprecated=1
|
|
|
|
export function onReceivedValueDeprecated(cb: (name: string, value: number) => void) {
|
|
|
|
onReceivedValue(cb);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Registers code to run when the radio receives a string. Deprecated, use
|
|
|
|
* onReceivedString instead.
|
|
|
|
*/
|
|
|
|
//% help=radio/on-received-string blockHandlerKey="radioreceived"
|
|
|
|
//% blockId=radio_on_string block="on radio received" blockGap=16
|
|
|
|
//% useLoc="radio.onDataPacketReceived" deprecated=1
|
|
|
|
export function onReceivedStringDeprecated(cb: (receivedString: string) => void) {
|
|
|
|
onReceivedString(cb);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Registers code to run when the radio receives a buffer. Deprecated, use
|
|
|
|
* onReceivedBuffer instead.
|
|
|
|
*/
|
|
|
|
//% help=radio/on-received-buffer blockHandlerKey="radioreceived" blockHidden=1
|
|
|
|
//% blockId=radio_on_buffer block="on radio received" blockGap=16
|
|
|
|
//% useLoc="radio.onDataPacketReceived" deprecated=1
|
|
|
|
export function onReceivedBufferDeprecated(cb: (receivedBuffer: Buffer) => void) {
|
|
|
|
onReceivedBuffer(cb);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the number payload from the last packet taken from the radio queue
|
|
|
|
* (via ``receiveNumber``, ``receiveString``, etc) or 0 if that packet did not
|
|
|
|
* contain a number.
|
|
|
|
*/
|
|
|
|
//% help=radio/received-number deprecated=1
|
|
|
|
export function receivedNumber(): number {
|
|
|
|
return (lastPacket ? lastPacket.numberPayload : 0) || 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the serial number of the sender micro:bit from the last packet taken
|
|
|
|
* from the radio queue (via ``receiveNumber``, ``receiveString``, etc) or 0 if
|
|
|
|
* that packet did not send a serial number.
|
|
|
|
*/
|
|
|
|
//% help=radio/received-serial deprecated=1
|
|
|
|
export function receivedSerial(): number {
|
|
|
|
return lastPacket ? lastPacket.serial : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the string payload from the last packet taken from the radio queue
|
|
|
|
* (via ``receiveNumber``, ``receiveString``, etc) or the empty string if that
|
|
|
|
* packet did not contain a string.
|
|
|
|
*/
|
|
|
|
//% help=radio/received-string deprecated=1
|
|
|
|
export function receivedString(): string {
|
|
|
|
return (lastPacket ? lastPacket.stringPayload : "") || "";
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the buffer payload from the last packet taken from the radio queue
|
|
|
|
* (via ``receiveNumber``, ``receiveString``, etc) or the empty string if that
|
|
|
|
* packet did not contain a string.
|
|
|
|
*/
|
|
|
|
//% help=radio/received-buffer deprecated=1
|
|
|
|
export function receivedBuffer(): Buffer {
|
|
|
|
return (lastPacket ? lastPacket.bufferPayload : null) || control.createBuffer(0);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the system time of the sender micro:bit at the moment when it sent the
|
|
|
|
* last packet taken from the radio queue (via ``receiveNumber``,
|
|
|
|
* ``receiveString``, etc).
|
|
|
|
*/
|
|
|
|
//% help=radio/received-time deprecated=1
|
|
|
|
export function receivedTime(): number {
|
|
|
|
return lastPacket ? lastPacket.time : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Reads the next packet from the radio queue and returns the packet's number
|
|
|
|
* payload or 0 if the packet did not contain a number.
|
|
|
|
*/
|
|
|
|
//% help=radio/receive-number
|
|
|
|
//% weight=46
|
|
|
|
//% blockId=radio_datagram_receive block="radio receive number" blockGap=8
|
|
|
|
//% deprecated=true
|
|
|
|
export function receiveNumber(): number {
|
|
|
|
lastPacket = RadioPacket.getPacket(readRawPacket());
|
|
|
|
return receivedNumber();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Reads the next packet from the radio queue and returns the packet's string
|
|
|
|
* payload or the empty string if the packet did not contain a string.
|
|
|
|
*/
|
|
|
|
//% blockId=radio_datagram_receive_string block="radio receive string" blockGap=8
|
|
|
|
//% weight=44
|
|
|
|
//% help=radio/receive-string
|
|
|
|
//% deprecated=true
|
|
|
|
export function receiveString(): string {
|
|
|
|
lastPacket = RadioPacket.getPacket(readRawPacket());
|
|
|
|
return receivedString();
|
|
|
|
}
|
2020-05-08 18:35:38 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Gets the received signal strength indicator (RSSI) from the last packet taken
|
|
|
|
* from the radio queue (via ``receiveNumber``, ``receiveString``, etc). Not supported in simulator.
|
|
|
|
*/
|
|
|
|
//% help=radio/received-signal-strength
|
|
|
|
//% weight=40
|
|
|
|
//% blockId=radio_datagram_rssi block="radio received signal strength"
|
|
|
|
//% deprecated=true blockHidden=true
|
|
|
|
export function receivedSignalStrength(): number {
|
|
|
|
return lastPacket ? lastPacket.signal : 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Reads the next packet from the radio queue and and writes it to serial
|
|
|
|
* as JSON.
|
|
|
|
*/
|
|
|
|
//% help=radio/write-value-to-serial
|
|
|
|
//% weight=3
|
|
|
|
//% blockId=radio_write_value_serial block="radio write value to serial"
|
|
|
|
//% deprecated=true
|
|
|
|
export function writeValueToSerial() {
|
|
|
|
const p = RadioPacket.getPacket(radio.readRawPacket());
|
|
|
|
writeToSerial(p);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Writes the last received packet to serial as JSON. This should be called
|
|
|
|
* within an ``onDataPacketReceived`` callback.
|
|
|
|
*/
|
|
|
|
//% help=radio/write-received-packet-to-serial
|
|
|
|
//% weight=3
|
|
|
|
//% blockId=radio_write_packet_serial block="radio write received packet to serial"
|
|
|
|
//% advanced=true deprecated=true
|
|
|
|
export function writeReceivedPacketToSerial() {
|
|
|
|
if (lastPacket) writeToSerial(lastPacket)
|
|
|
|
}
|
|
|
|
|
|
|
|
function writeToSerial(packet: RadioPacket) {
|
|
|
|
serial.writeString("{");
|
|
|
|
serial.writeString("\"t\":");
|
|
|
|
serial.writeString("" + packet.time);
|
|
|
|
serial.writeString(",\"s\":");
|
|
|
|
serial.writeString("" + packet.serial);
|
|
|
|
|
|
|
|
if (packet.hasString()) {
|
|
|
|
serial.writeString(",\"n\":\"");
|
|
|
|
serial.writeString(packet.stringPayload);
|
|
|
|
serial.writeString("\"");
|
|
|
|
}
|
|
|
|
if (packet.packetType == PACKET_TYPE_BUFFER) {
|
|
|
|
serial.writeString(",\"b\":\"");
|
|
|
|
// TODO: proper base64 encoding
|
|
|
|
serial.writeString(packet.bufferPayload.toString());
|
|
|
|
serial.writeString("\"");
|
|
|
|
}
|
|
|
|
if (packet.hasNumber()) {
|
|
|
|
serial.writeString(",\"v\":");
|
|
|
|
serial.writeString("" + packet.numberPayload);
|
|
|
|
}
|
|
|
|
|
|
|
|
serial.writeString("}\r\n");
|
|
|
|
}
|
2019-12-02 05:58:26 +01:00
|
|
|
}
|