pxt-calliope/docs/examples/radio-dashboard.md
2017-06-14 20:39:55 -07:00

2.0 KiB

Radio Dashboard

/**
 * 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)