to colorize a colorful pixel with a simple touch using nfc technology

Dependencies:   Chainable_RGB_LED mbed

use Arch, NFC Shield and Grove - Chainable RGB LED to DIY a touch pixel. Then use an Android with NFC support to colorize it.

The project is on https://github.com/Seeed-Studio/TouchPixel

main.cpp

Committer:
yihui
Date:
2013-12-27
Revision:
0:88960f3eeb2c

File content as of revision 0:88960f3eeb2c:


#include "mbed.h"
#include "ChainableLED.h"
#include "PN532_SPI.h"
#include "emulatetag.h"
#include "NdefMessage.h"

#include <string.h>

#define LOG(args...)    

BusOut leds(LED1, LED2, LED3, LED4);

ChainableLED rgbled(P1_14, P1_13, 1);

SPI spi(P1_22, P1_21, P1_20);
PN532_SPI interface(spi, P0_2);
EmulateTag nfc(interface);

uint8_t ndefBuf[120];
NdefMessage message;
int messageSize;

uint8_t uid[3] = { 0x12, 0x34, 0x56 };

uint32_t getColor(uint8_t *buf)
{
    uint32_t x = 0;
    for (uint8_t i = 0; i < 8; i++) {
        uint8_t c = *buf;
        if (c >= '0' && c <= '9') {
            x *= 16;
            x += c - '0';
        } else if (c >= 'A' && c <= 'F') {
            x *= 16;
            x += (c - 'A') + 10;
        } else if (c >= 'a' && c <= 'f') {
            x *= 16;
            x += (c - 'a') + 10;
        } else 
            break;

        buf++;
    }

    return x;
}

void processNewNdef(uint8_t *buf, uint16_t length)
{
    NdefMessage msg = NdefMessage(buf, length);

    NdefRecord record = msg.getRecord(0);
    uint8_t recordbuf[32];
    record.getType(recordbuf);
    if (!memcmp(recordbuf, "text/c", 6)) {
        uint8_t r, g, b;
        uint32_t color;
        record.getPayload(recordbuf);
        color = getColor(recordbuf);
        r = (color >> 16) & 0xFF;
        g = (color >> 8) & 0xFF;
        b = color & 0xFF;
        
        rgbled.setColorRGB(0, r, g, b);
        leds = r;
    }
} 

int main()
{
    LOG("------- Emulate Tag --------\n");
    rgbled.setColorRGB(0, 0, 0, 0);

    NdefRecord aarRecord = NdefRecord();
    const uint8_t aarType[] = "android.com:pkg";
    const uint8_t aarPayload[] = "com.seeedstudio.android.nfc.touchpixel";

    aarRecord.setTnf(TNF_EXTERNAL_TYPE);
    aarRecord.setType(aarType, sizeof(aarType) - 1);
    aarRecord.setPayload(aarPayload, sizeof(aarPayload) - 1);

    message = NdefMessage();
    message.addMimeMediaRecord("text/c", "FF000000");
    message.addRecord(aarRecord);
    messageSize = message.getEncodedSize();
    if (messageSize > sizeof(ndefBuf)) {
        while (1) { }
    }

    LOG("Ndef encoded message size: %d\n", messageSize);

    message.encode(ndefBuf);

    // comment out this command for no ndef message
    nfc.setNdefFile(ndefBuf, messageSize);

    // uid must be 3 bytes!
    nfc.setUid(uid);

    nfc.init();

    nfc.attach(processNewNdef);

    while (1) {
        //nfc.setNdefFile(ndefBuf, messageSize);
        nfc.emulate();
    }
}