Updating radio JSON writing API (#290)

This commit is contained in:
Richard Knoll 2016-10-25 16:38:01 -07:00 committed by Peli de Halleux
parent 7d912110f4
commit f191d9033d
6 changed files with 118 additions and 34 deletions

View File

@ -12,7 +12,7 @@ radio.onDataPacketReceived(() => {
radio.setGroup(0); radio.setGroup(0);
radio.setTransmitPower(7); radio.setTransmitPower(7);
radio.setTransmitSerialNumber(false); radio.setTransmitSerialNumber(false);
radio.writeValueToSerial(); radio.writeReceivedPacketToSerial();
``` ```
```package ```package
@ -28,4 +28,4 @@ radio
[setGroup](/reference/radio/set-group), [setGroup](/reference/radio/set-group),
[setTransmitPower](/reference/radio/set-transmit-power), [setTransmitPower](/reference/radio/set-transmit-power),
[setTransmitSerialNumber](/reference/radio/set-transmit-serial-number), [setTransmitSerialNumber](/reference/radio/set-transmit-serial-number),
[writeValueToSerial](/reference/radio/write-value-to-serial) [writeReceivedPacketToSerial](/reference/radio/write-received-packet-to-serial)

View File

@ -0,0 +1,48 @@
# Write Received Packet To Serial
Writes the last packet received by the ``radio`` to serial in JSON format.
Should be called within a callback to
[on data packet received](/reference/radio/on-data-packet-received).
```sig
radio.writeReceivedPacketToSerial();
```
### Data received format
The format for received data printed to serial is as follows:
- [send number](/reference/radio/send-number): ```{v:ValueSent,t:MicrobitTimeAlive,s:SerialNumber}```
- [send value](/reference/radio/send-value): ```{v:ValueSent,t:MicrobitTimeAlive,s:SerialNumber,n:"Name"}```
- [send string](/reference/radio/send-string): ```{t:MicrobitTimeAlive,s:SerialNumber,n:"Text"}```
### Examples
When ```radio``` data is received (after pressing the ``A`` button on
the second micro:bit), this program sends temperature data to
serial.
```blocks
input.onButtonPressed(Button.A, () => {
radio.sendNumber(input.temperature());
});
radio.onDataPacketReceived(() => {
radio.writeReceivedPacketToSerial();
});
```
Sample output to serial when ``A`` button pressed:
```Text
{v:27,t:323,s:0}
```
### See also
[send number](/reference/radio/send-number),
[send value](/reference/radio/send-value),
[send string](/reference/radio/send-string),
[on data packet received](/reference/radio/on-data-packet-received)
```package
radio
```

View File

@ -1,5 +1,7 @@
# Write Value To Serial # Write Value To Serial
> Note: This API has been deprecated! Use [write received packet to serial](/reference/radio/write-received-packet-to-serial) instead.
Writes the data received by ``radio`` to serial in JSON format. Writes the data received by ``radio`` to serial in JSON format.
```sig ```sig

View File

@ -100,6 +100,25 @@ namespace radio {
return ManagedString().leakData(); return ManagedString().leakData();
} }
void writePacketAsJSON(uint8_t tp, int v, int s, int t, StringData* m) {
// Convert the packet to JSON and send over serial
uBit.serial.send("{");
uBit.serial.send("\"t\":");
uBit.serial.send(t);
uBit.serial.send(",\"s\":");
uBit.serial.send(s);
if (tp == PACKET_TYPE_STRING || tp == PACKET_TYPE_VALUE) {
uBit.serial.send(",\"n\":\"");
uBit.serial.send(m);
uBit.serial.send("\"");
}
if (tp == PACKET_TYPE_NUMBER || tp == PACKET_TYPE_VALUE) {
uBit.serial.send(",\"v\":");
uBit.serial.send(v);
}
uBit.serial.send("}\r\n");
}
/** /**
* Takes a packet from the micro:bit radio queue. * Takes a packet from the micro:bit radio queue.
* @param writeToSerial if true, write the received packet to serial without updating the global packet; * @param writeToSerial if true, write the received packet to serial without updating the global packet;
@ -144,22 +163,7 @@ namespace radio {
msg = m; msg = m;
} }
else { else {
// Convert the packet to JSON and send over serial writePacketAsJSON(tp, v, s, t, m);
uBit.serial.send("{");
uBit.serial.send("\"t\":");
uBit.serial.send(t);
uBit.serial.send(",\"s\":");
uBit.serial.send(s);
if (tp == PACKET_TYPE_STRING || tp == PACKET_TYPE_VALUE) {
uBit.serial.send(",\"n\":\"");
uBit.serial.send(m);
uBit.serial.send("\"");
}
if (tp == PACKET_TYPE_NUMBER || tp == PACKET_TYPE_VALUE) {
uBit.serial.send(",\"v\":");
uBit.serial.send(v);
}
uBit.serial.send("}\r\n");
} }
} }
@ -231,12 +235,25 @@ namespace radio {
//% help=radio/write-value-to-serial //% help=radio/write-value-to-serial
//% weight=3 //% weight=3
//% blockId=radio_write_value_serial block="radio write value to serial" //% blockId=radio_write_value_serial block="radio write value to serial"
//% advanced=true //% deprecated=true
void writeValueToSerial() { void writeValueToSerial() {
if (radioEnable() != MICROBIT_OK) return; if (radioEnable() != MICROBIT_OK) return;
receivePacket(true); receivePacket(true);
} }
/**
* 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
void writeReceivedPacketToSerial() {
if (radioEnable() != MICROBIT_OK) return;
writePacketAsJSON(type, value, (int) serial, (int) time, msg);
}
/** /**
* Reads the next packet from the radio queue and returns the packet's number * 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. * payload or 0 if the packet did not contain a number.

12
libs/radio/shims.d.ts vendored
View File

@ -40,9 +40,19 @@ declare namespace radio {
//% help=radio/write-value-to-serial //% help=radio/write-value-to-serial
//% weight=3 //% weight=3
//% blockId=radio_write_value_serial block="radio write value to serial" //% blockId=radio_write_value_serial block="radio write value to serial"
//% advanced=true shim=radio::writeValueToSerial //% deprecated=true shim=radio::writeValueToSerial
function writeValueToSerial(): void; function writeValueToSerial(): void;
/**
* 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 shim=radio::writeReceivedPacketToSerial
function writeReceivedPacketToSerial(): void;
/** /**
* Reads the next packet from the radio queue and returns the packet's number * 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. * payload or 0 if the packet did not contain a number.

View File

@ -138,21 +138,13 @@ namespace pxsim.radio {
} }
export function writeValueToSerial(): void { export function writeValueToSerial(): void {
let b = board(); const b = board();
let p = b.radioState.bus.datagram.recv(); writePacketToSerial(b, b.radioState.bus.datagram.recv())
}
switch(p.payload.type) { export function writeReceivedPacketToSerial(): void {
case PacketPayloadType.NUMBER: const b = board();
b.writeSerial(`{"t":${p.time},"s":${p.serial},"v":${p.payload.numberData}}`) writePacketToSerial(b, b.radioState.bus.datagram.lastReceived);
break;
case PacketPayloadType.VALUE:
b.writeSerial(`{"t":${p.time},"s":${p.serial},"n":"${p.payload.stringData}","v":${p.payload.numberData}}`)
break;
case PacketPayloadType.STRING:
b.writeSerial(`{"t":${p.time},"s":${p.serial},"n":"${p.payload.stringData}"}`)
break;
default:
}
} }
export function sendValue(name: string, value: number) { export function sendValue(name: string, value: number) {
@ -200,4 +192,19 @@ namespace pxsim.radio {
export function receivedTime(): number { export function receivedTime(): number {
return board().radioState.bus.datagram.lastReceived.time; return board().radioState.bus.datagram.lastReceived.time;
} }
function writePacketToSerial(b: DalBoard, p: PacketBuffer) {
switch(p.payload.type) {
case PacketPayloadType.NUMBER:
b.writeSerial(`{"t":${p.time},"s":${p.serial},"v":${p.payload.numberData}}\r\n`)
break;
case PacketPayloadType.VALUE:
b.writeSerial(`{"t":${p.time},"s":${p.serial},"n":"${p.payload.stringData}","v":${p.payload.numberData}}\r\n`)
break;
case PacketPayloadType.STRING:
b.writeSerial(`{"t":${p.time},"s":${p.serial},"n":"${p.payload.stringData}"}\r\n`)
break;
default:
}
}
} }