Brian Daniels / Mbed 2 deprecated nespresso_demo

Dependencies:   EthernetInterface mbed-rtos mbed nsdl rgb_sensor_buffer

Fork of mbed_nsdl by Nespresso RGB Sensor

Committer:
bjblazkowicz
Date:
Wed Oct 29 18:28:59 2014 +0000
Revision:
9:9d5b0c43579b
Child:
10:9c11a8889d62
Switched to using MODSERIAL.; Added BLE beacon resource.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bjblazkowicz 9:9d5b0c43579b 1 #include <ctype.h>
bjblazkowicz 9:9d5b0c43579b 2 #include "mbed.h"
bjblazkowicz 9:9d5b0c43579b 3 #include "rtos.h"
bjblazkowicz 9:9d5b0c43579b 4 #include "MODSERIAL.h"
bjblazkowicz 9:9d5b0c43579b 5 #include "nsdl_support.h"
bjblazkowicz 9:9d5b0c43579b 6 #include "beacon_resource.h"
bjblazkowicz 9:9d5b0c43579b 7 #include "payload.h"
bjblazkowicz 9:9d5b0c43579b 8
bjblazkowicz 9:9d5b0c43579b 9 #define RESOURCE_ID "sensor/beacon"
bjblazkowicz 9:9d5b0c43579b 10
bjblazkowicz 9:9d5b0c43579b 11 extern MODSERIAL console;
bjblazkowicz 9:9d5b0c43579b 12
bjblazkowicz 9:9d5b0c43579b 13 /* stored data for observable resource */
bjblazkowicz 9:9d5b0c43579b 14 static uint8_t obs_number = 0;
bjblazkowicz 9:9d5b0c43579b 15 static uint8_t *obs_token_ptr = NULL;
bjblazkowicz 9:9d5b0c43579b 16 static uint8_t obs_token_len = 0;
bjblazkowicz 9:9d5b0c43579b 17
bjblazkowicz 9:9d5b0c43579b 18 static MODSERIAL beacon(p9, p10);
bjblazkowicz 9:9d5b0c43579b 19
bjblazkowicz 9:9d5b0c43579b 20 #define UUID_LEN (36)
bjblazkowicz 9:9d5b0c43579b 21
bjblazkowicz 9:9d5b0c43579b 22 static const char *UUID = "3AD81C9B-8B1A-494D-B0C3-C1B6DC87A2A8";
bjblazkowicz 9:9d5b0c43579b 23
bjblazkowicz 9:9d5b0c43579b 24 //
bjblazkowicz 9:9d5b0c43579b 25 // A BLE beacon advertisement record
bjblazkowicz 9:9d5b0c43579b 26 typedef struct {
bjblazkowicz 9:9d5b0c43579b 27 char uuid[UUID_LEN + 1];
bjblazkowicz 9:9d5b0c43579b 28 int rssi;
bjblazkowicz 9:9d5b0c43579b 29 int calibration;
bjblazkowicz 9:9d5b0c43579b 30 int major;
bjblazkowicz 9:9d5b0c43579b 31 int minor;
bjblazkowicz 9:9d5b0c43579b 32 int channel;
bjblazkowicz 9:9d5b0c43579b 33 } beacon_record_t;
bjblazkowicz 9:9d5b0c43579b 34
bjblazkowicz 9:9d5b0c43579b 35 static beacon_record_t record = {0};
bjblazkowicz 9:9d5b0c43579b 36
bjblazkowicz 9:9d5b0c43579b 37 // Encode the beacon record as JSON.
bjblazkowicz 9:9d5b0c43579b 38 void encode_beacon_record(const beacon_record_t *record, char *json, int *json_length) {
bjblazkowicz 9:9d5b0c43579b 39 static const char *format = "{'r':%d, 'c':%d,'m':%d,'n':%d,'ch':%d}";
bjblazkowicz 9:9d5b0c43579b 40 *json_length = sprintf(json, format, record->rssi, record->calibration, record->major, record->minor, record->channel);
bjblazkowicz 9:9d5b0c43579b 41 }
bjblazkowicz 9:9d5b0c43579b 42
bjblazkowicz 9:9d5b0c43579b 43
bjblazkowicz 9:9d5b0c43579b 44 // read next character from UART
bjblazkowicz 9:9d5b0c43579b 45 static inline int next_char() {
bjblazkowicz 9:9d5b0c43579b 46 while (!beacon.readable()) {
bjblazkowicz 9:9d5b0c43579b 47 __WFE();
bjblazkowicz 9:9d5b0c43579b 48 }
bjblazkowicz 9:9d5b0c43579b 49 return beacon.getc();
bjblazkowicz 9:9d5b0c43579b 50 }
bjblazkowicz 9:9d5b0c43579b 51
bjblazkowicz 9:9d5b0c43579b 52 // Given that we have consumed the begin record character ('>'), parse
bjblazkowicz 9:9d5b0c43579b 53 // characters until a comma is met, and confirm this is the UUID we are
bjblazkowicz 9:9d5b0c43579b 54 // looking for.
bjblazkowicz 9:9d5b0c43579b 55 //
bjblazkowicz 9:9d5b0c43579b 56 // Returns true if the read UUID matches, or false otherwise.
bjblazkowicz 9:9d5b0c43579b 57 //
bjblazkowicz 9:9d5b0c43579b 58 static bool parse_uuid(char *uuid) {
bjblazkowicz 9:9d5b0c43579b 59 int chars_read = 0;
bjblazkowicz 9:9d5b0c43579b 60
bjblazkowicz 9:9d5b0c43579b 61 int ch = next_char();
bjblazkowicz 9:9d5b0c43579b 62 while (isspace(ch)) {
bjblazkowicz 9:9d5b0c43579b 63 ch = next_char();
bjblazkowicz 9:9d5b0c43579b 64 }
bjblazkowicz 9:9d5b0c43579b 65
bjblazkowicz 9:9d5b0c43579b 66 do {
bjblazkowicz 9:9d5b0c43579b 67 uuid[chars_read++] = ch;
bjblazkowicz 9:9d5b0c43579b 68 } while ((ch = next_char()) != ',' && chars_read <= UUID_LEN);
bjblazkowicz 9:9d5b0c43579b 69
bjblazkowicz 9:9d5b0c43579b 70 uuid[chars_read] = '\0';
bjblazkowicz 9:9d5b0c43579b 71
bjblazkowicz 9:9d5b0c43579b 72 return chars_read == UUID_LEN && memcmp(uuid, UUID, UUID_LEN) == 0;
bjblazkowicz 9:9d5b0c43579b 73 }
bjblazkowicz 9:9d5b0c43579b 74
bjblazkowicz 9:9d5b0c43579b 75 // Parse an integer using the given radix.
bjblazkowicz 9:9d5b0c43579b 76 static void parse_int(int *value, int radix) {
bjblazkowicz 9:9d5b0c43579b 77 static const int BUF_SIZE = 16;
bjblazkowicz 9:9d5b0c43579b 78 char buf[BUF_SIZE] = {0};
bjblazkowicz 9:9d5b0c43579b 79 int chars_read = 0;
bjblazkowicz 9:9d5b0c43579b 80 int ch = next_char();
bjblazkowicz 9:9d5b0c43579b 81
bjblazkowicz 9:9d5b0c43579b 82 do {
bjblazkowicz 9:9d5b0c43579b 83 buf[chars_read++] = ch;
bjblazkowicz 9:9d5b0c43579b 84 } while ((ch = next_char()) != ',' && chars_read <= BUF_SIZE);
bjblazkowicz 9:9d5b0c43579b 85
bjblazkowicz 9:9d5b0c43579b 86 *value = strtol(buf, NULL, radix);
bjblazkowicz 9:9d5b0c43579b 87 }
bjblazkowicz 9:9d5b0c43579b 88
bjblazkowicz 9:9d5b0c43579b 89 static void exec_call_thread(void const *args)
bjblazkowicz 9:9d5b0c43579b 90 {
bjblazkowicz 9:9d5b0c43579b 91 while(1) {
bjblazkowicz 9:9d5b0c43579b 92 int ch = next_char();
bjblazkowicz 9:9d5b0c43579b 93 if (ch == '>') {
bjblazkowicz 9:9d5b0c43579b 94 if (!parse_uuid(record.uuid)) {
bjblazkowicz 9:9d5b0c43579b 95 continue;
bjblazkowicz 9:9d5b0c43579b 96 }
bjblazkowicz 9:9d5b0c43579b 97
bjblazkowicz 9:9d5b0c43579b 98 parse_int(&record.rssi, 10);
bjblazkowicz 9:9d5b0c43579b 99 parse_int(&record.calibration, 10);
bjblazkowicz 9:9d5b0c43579b 100 parse_int(&record.major, 16);
bjblazkowicz 9:9d5b0c43579b 101 parse_int(&record.minor, 16);
bjblazkowicz 9:9d5b0c43579b 102 parse_int(&record.channel, 10);
bjblazkowicz 9:9d5b0c43579b 103
bjblazkowicz 9:9d5b0c43579b 104 console.printf("Parsed record: [uuid:%s, rssi:%d, calibration:%d, major:%d, minor:%d, channel: %d]\r\n", record.uuid, record.rssi, record.calibration, record.major, record.minor, record.channel);
bjblazkowicz 9:9d5b0c43579b 105
bjblazkowicz 9:9d5b0c43579b 106 if (obs_number == 0 && obs_token_ptr == NULL)
bjblazkowicz 9:9d5b0c43579b 107 console.printf("ERROR: obs_number: %d, obs_token_ptr: %0x%08x\r\n", obs_number, obs_token_ptr);
bjblazkowicz 9:9d5b0c43579b 108
bjblazkowicz 9:9d5b0c43579b 109 obs_number++;
bjblazkowicz 9:9d5b0c43579b 110
bjblazkowicz 9:9d5b0c43579b 111 static const int JSON_BUFFER_SIZE = 1024;
bjblazkowicz 9:9d5b0c43579b 112 char json[JSON_BUFFER_SIZE] = {0};
bjblazkowicz 9:9d5b0c43579b 113 int json_length = 0;
bjblazkowicz 9:9d5b0c43579b 114 encode_beacon_record(&record, json, &json_length);
bjblazkowicz 9:9d5b0c43579b 115
bjblazkowicz 9:9d5b0c43579b 116 int result = sn_nsdl_send_observation_notification(obs_token_ptr, obs_token_len, (uint8_t *)json, json_length, &obs_number, 1, COAP_MSG_TYPE_NON_CONFIRMABLE, 0);
bjblazkowicz 9:9d5b0c43579b 117 console.printf("Sent to mDS: '%s', result: %d\r\n", json, result);
bjblazkowicz 9:9d5b0c43579b 118 }
bjblazkowicz 9:9d5b0c43579b 119 }
bjblazkowicz 9:9d5b0c43579b 120 }
bjblazkowicz 9:9d5b0c43579b 121
bjblazkowicz 9:9d5b0c43579b 122 int create_beacon_resource(sn_nsdl_resource_info_s *resource_ptr)
bjblazkowicz 9:9d5b0c43579b 123 {
bjblazkowicz 9:9d5b0c43579b 124 beacon.baud(115200);
bjblazkowicz 9:9d5b0c43579b 125 static Thread exec_thread(exec_call_thread);
bjblazkowicz 9:9d5b0c43579b 126 //nsdl_create_dynamic_resource(resource_ptr, sizeof(RESOURCE_ID) - 1, (uint8_t*)RESOURCE_ID, 0, 0, 1, &resource_cb, SN_GRS_GET_ALLOWED);
bjblazkowicz 9:9d5b0c43579b 127 console.printf("Created beacon resource\r\n");
bjblazkowicz 9:9d5b0c43579b 128 return 0;
bjblazkowicz 9:9d5b0c43579b 129 }