added radio dashboard
This commit is contained in:
parent
aec102a42c
commit
2d7e4ff1cd
@ -55,6 +55,11 @@ Here are some fun programs for your @boardname@!
|
||||
"description": "easy time tracking",
|
||||
"url":"/examples/stop-watch",
|
||||
"cardType": "example"
|
||||
}, {
|
||||
"name": "Radio Dashboard",
|
||||
"description": "dashboard for radio clients",
|
||||
"url":"/examples/radio-dashboard",
|
||||
"cardType": "example"
|
||||
}]
|
||||
```
|
||||
|
||||
|
81
docs/examples/radio-dashboard.md
Normal file
81
docs/examples/radio-dashboard.md
Normal file
@ -0,0 +1,81 @@
|
||||
# Radio Dashboard
|
||||
|
||||
```typescript
|
||||
/**
|
||||
* Radio monitoring dashboard
|
||||
*
|
||||
* Each radio client is represented by a dot on the screen.
|
||||
* Once a client is registered, it will stay at the same pixel location
|
||||
* forever.
|
||||
*
|
||||
* Radio clients can simply send a number (between 0..255) on group 4.
|
||||
* The must transmit the serial number using ``radio.setTransmitSerialNumber(true)``
|
||||
*
|
||||
* The received number is used to set the LED brightness for that client.
|
||||
*
|
||||
* If the radio packet is not received for 10sec, the LED starts blinking.
|
||||
*/
|
||||
|
||||
const lostPing = 10000;
|
||||
const group = 4;
|
||||
|
||||
interface Client {
|
||||
// client serial id
|
||||
id: number;
|
||||
// sprite on screen
|
||||
sprite: game.LedSprite;
|
||||
// last ping received
|
||||
ping: number;
|
||||
}
|
||||
|
||||
const clients: Client[] = [];
|
||||
|
||||
/* lazy allocate sprite */
|
||||
function getClient(id: number): Client {
|
||||
// needs an id to track radio client identity
|
||||
if (!id)
|
||||
return undefined;
|
||||
|
||||
// look for cache clients
|
||||
for (const client of clients)
|
||||
if (client.id == id)
|
||||
return client;
|
||||
const n = clients.length;
|
||||
if (n == 24) // out of pixels
|
||||
return undefined;
|
||||
const client: Client = {
|
||||
id: id,
|
||||
sprite: game.createSprite(n % 5, n / 5),
|
||||
ping: input.runningTime()
|
||||
}
|
||||
clients.push(client);
|
||||
return client;
|
||||
}
|
||||
|
||||
// store data received by clients
|
||||
radio.onDataPacketReceived(packet => {
|
||||
const client = getClient(packet.serial);
|
||||
if (!client)
|
||||
return;
|
||||
|
||||
client.ping = input.runningTime()
|
||||
client.sprite.setBrightness(packet.receivedNumber & 0xff);
|
||||
})
|
||||
|
||||
// monitor the sprites and start blinking when no packet is received
|
||||
basic.forever(() => {
|
||||
const now = input.runningTime()
|
||||
for (const client of clients) {
|
||||
// lost signal starts blinking
|
||||
if (now - client.ping > lostPing)
|
||||
client.sprite.setBlink(500);
|
||||
else client.sprite.setBlink(0);
|
||||
}
|
||||
basic.pause(500)
|
||||
})
|
||||
|
||||
// setup the radio and start!
|
||||
radio.setGroup(group)
|
||||
radio.setTransmitPower(6)
|
||||
radio.setTransmitSerialNumber(true)
|
||||
```
|
Loading…
Reference in New Issue
Block a user