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

Committer:
yihui
Date:
Fri Dec 27 01:46:32 2013 +0000
Revision:
0:88960f3eeb2c
initial

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yihui 0:88960f3eeb2c 1
yihui 0:88960f3eeb2c 2 #include "snep.h"
yihui 0:88960f3eeb2c 3 #include "PN532_debug.h"
yihui 0:88960f3eeb2c 4
yihui 0:88960f3eeb2c 5 int8_t SNEP::write(const uint8_t *buf, uint8_t len, uint16_t timeout)
yihui 0:88960f3eeb2c 6 {
yihui 0:88960f3eeb2c 7 if (0 >= llcp.activate(timeout)) {
yihui 0:88960f3eeb2c 8 DMSG("failed to activate PN532 as a target\n");
yihui 0:88960f3eeb2c 9 return -1;
yihui 0:88960f3eeb2c 10 }
yihui 0:88960f3eeb2c 11
yihui 0:88960f3eeb2c 12 if (0 >= llcp.connect(timeout)) {
yihui 0:88960f3eeb2c 13 DMSG("failed to set up a connection\n");
yihui 0:88960f3eeb2c 14 return -2;
yihui 0:88960f3eeb2c 15 }
yihui 0:88960f3eeb2c 16
yihui 0:88960f3eeb2c 17 // response a success SNEP message
yihui 0:88960f3eeb2c 18 headerBuf[0] = SNEP_DEFAULT_VERSION;
yihui 0:88960f3eeb2c 19 headerBuf[1] = SNEP_REQUEST_PUT;
yihui 0:88960f3eeb2c 20 headerBuf[2] = 0;
yihui 0:88960f3eeb2c 21 headerBuf[3] = 0;
yihui 0:88960f3eeb2c 22 headerBuf[4] = 0;
yihui 0:88960f3eeb2c 23 headerBuf[5] = len;
yihui 0:88960f3eeb2c 24 if (0 >= llcp.write(headerBuf, 6, buf, len)) {
yihui 0:88960f3eeb2c 25 return -3;
yihui 0:88960f3eeb2c 26 }
yihui 0:88960f3eeb2c 27
yihui 0:88960f3eeb2c 28 uint8_t rbuf[16];
yihui 0:88960f3eeb2c 29 if (6 > llcp.read(rbuf, sizeof(rbuf))) {
yihui 0:88960f3eeb2c 30 return -4;
yihui 0:88960f3eeb2c 31 }
yihui 0:88960f3eeb2c 32
yihui 0:88960f3eeb2c 33 // check SNEP version
yihui 0:88960f3eeb2c 34 if (SNEP_DEFAULT_VERSION != rbuf[0]) {
yihui 0:88960f3eeb2c 35 DMSG("The received SNEP message's major version is different\n");
yihui 0:88960f3eeb2c 36 // To-do: send Unsupported Version response
yihui 0:88960f3eeb2c 37 return -4;
yihui 0:88960f3eeb2c 38 }
yihui 0:88960f3eeb2c 39
yihui 0:88960f3eeb2c 40 // expect a put request
yihui 0:88960f3eeb2c 41 if (SNEP_RESPONSE_SUCCESS != rbuf[1]) {
yihui 0:88960f3eeb2c 42 DMSG("Expect a success response\n");
yihui 0:88960f3eeb2c 43 return -4;
yihui 0:88960f3eeb2c 44 }
yihui 0:88960f3eeb2c 45
yihui 0:88960f3eeb2c 46 llcp.disconnect(timeout);
yihui 0:88960f3eeb2c 47
yihui 0:88960f3eeb2c 48 return 1;
yihui 0:88960f3eeb2c 49 }
yihui 0:88960f3eeb2c 50
yihui 0:88960f3eeb2c 51 int16_t SNEP::read(uint8_t *buf, uint8_t len, uint16_t timeout)
yihui 0:88960f3eeb2c 52 {
yihui 0:88960f3eeb2c 53 if (0 >= llcp.activate(timeout)) {
yihui 0:88960f3eeb2c 54 DMSG("failed to activate PN532 as a target\n");
yihui 0:88960f3eeb2c 55 return -1;
yihui 0:88960f3eeb2c 56 }
yihui 0:88960f3eeb2c 57
yihui 0:88960f3eeb2c 58 if (0 >= llcp.waitForConnection(timeout)) {
yihui 0:88960f3eeb2c 59 DMSG("failed to set up a connection\n");
yihui 0:88960f3eeb2c 60 return -2;
yihui 0:88960f3eeb2c 61 }
yihui 0:88960f3eeb2c 62
yihui 0:88960f3eeb2c 63 uint16_t status = llcp.read(buf, len);
yihui 0:88960f3eeb2c 64 if (6 > status) {
yihui 0:88960f3eeb2c 65 return -3;
yihui 0:88960f3eeb2c 66 }
yihui 0:88960f3eeb2c 67
yihui 0:88960f3eeb2c 68
yihui 0:88960f3eeb2c 69 // check SNEP version
yihui 0:88960f3eeb2c 70 if (SNEP_DEFAULT_VERSION != buf[0]) {
yihui 0:88960f3eeb2c 71 DMSG("The received SNEP message's major version is different\n");
yihui 0:88960f3eeb2c 72 // To-do: send Unsupported Version response
yihui 0:88960f3eeb2c 73 return -4;
yihui 0:88960f3eeb2c 74 }
yihui 0:88960f3eeb2c 75
yihui 0:88960f3eeb2c 76 // expect a put request
yihui 0:88960f3eeb2c 77 if (SNEP_REQUEST_PUT != buf[1]) {
yihui 0:88960f3eeb2c 78 DMSG("Expect a put request\n");
yihui 0:88960f3eeb2c 79 return -4;
yihui 0:88960f3eeb2c 80 }
yihui 0:88960f3eeb2c 81
yihui 0:88960f3eeb2c 82 // check message's length
yihui 0:88960f3eeb2c 83 uint32_t length = (buf[2] << 24) + (buf[3] << 16) + (buf[4] << 8) + buf[5];
yihui 0:88960f3eeb2c 84 // length should not be more than 244 (header + body < 255, header = 6 + 3 + 2)
yihui 0:88960f3eeb2c 85 if (length > (status - 6)) {
yihui 0:88960f3eeb2c 86 DMSG("The SNEP message is too large: ");
yihui 0:88960f3eeb2c 87 DMSG_INT(length);
yihui 0:88960f3eeb2c 88 DMSG_INT(status - 6);
yihui 0:88960f3eeb2c 89 DMSG("\n");
yihui 0:88960f3eeb2c 90 return -4;
yihui 0:88960f3eeb2c 91 }
yihui 0:88960f3eeb2c 92 for (uint8_t i = 0; i < length; i++) {
yihui 0:88960f3eeb2c 93 buf[i] = buf[i + 6];
yihui 0:88960f3eeb2c 94 }
yihui 0:88960f3eeb2c 95
yihui 0:88960f3eeb2c 96 // response a success SNEP message
yihui 0:88960f3eeb2c 97 headerBuf[0] = SNEP_DEFAULT_VERSION;
yihui 0:88960f3eeb2c 98 headerBuf[1] = SNEP_RESPONSE_SUCCESS;
yihui 0:88960f3eeb2c 99 headerBuf[2] = 0;
yihui 0:88960f3eeb2c 100 headerBuf[3] = 0;
yihui 0:88960f3eeb2c 101 headerBuf[4] = 0;
yihui 0:88960f3eeb2c 102 headerBuf[5] = 0;
yihui 0:88960f3eeb2c 103 llcp.write(headerBuf, 6);
yihui 0:88960f3eeb2c 104
yihui 0:88960f3eeb2c 105 return length;
yihui 0:88960f3eeb2c 106 }