Demo starter application to connect WiGo to NSP and expose on-board sensors

Dependencies:   NVIC_set_all_priorities cc3000_hostdriver_mbedsocket mbed nsdl_lib TEMT6200 TSI Wi-Go_eCompass_Lib_V3 WiGo_BattCharger

This is the mbed project for the IoT World Hackathon event, June 17th and 18th in Palo Also.

The setup instructions for participants are at the Setup page of this wiki:

http://mbed.org/teams/MBED_DEMOS/code/IoT_World_Hackathon_WiGo_NSP_Demo/wiki/Setup-Guide-for-the-IoT-World-Hackathon

Committer:
sam_grove
Date:
Wed Jun 18 03:29:01 2014 +0000
Revision:
16:d6812604cf92
Parent:
8:3926a80af3e0
Child:
18:11b9d98ecae2
Changed comport to 9600 baud (default for nearly all terminals); Moved UDPSocket and Endpoint to main (extern in nsdl); Added heap checking and hard fault handler; Don't register the Magnetometer

Who changed what in which revision?

UserRevisionLine numberNew contents of line
michaeljkoster 0:07581223f90c 1 // NSDL library support functions
michaeljkoster 0:07581223f90c 2
michaeljkoster 0:07581223f90c 3 #include "mbed.h"
michaeljkoster 0:07581223f90c 4 #include "nsdl_support.h"
michaeljkoster 0:07581223f90c 5 #include "mbed.h"
michaeljkoster 0:07581223f90c 6 //#include "rtos.h"
michaeljkoster 0:07581223f90c 7 //put re-registration in timeout loop instead of thread
michaeljkoster 0:07581223f90c 8 #include "cc3000.h"
michaeljkoster 0:07581223f90c 9 #include "UDPSocket.h"
michaeljkoster 0:07581223f90c 10 #include "Endpoint.h"
michaeljkoster 0:07581223f90c 11
sam_grove 16:d6812604cf92 12 /* __heapvalid((__heapprt)fprintf,stdout, 1);\*/
sam_grove 16:d6812604cf92 13 #define MEM_VALID(x) \
sam_grove 16:d6812604cf92 14 int s##x=0;\
sam_grove 16:d6812604cf92 15 int *h##x = new int [1];\
sam_grove 16:d6812604cf92 16 std::printf("[stack]0x%08x\t[heap]0x%08x\t[memory avail]%d bytes \tLine: %d %s\r\n", &s##x, h##x, &s##x-h##x, __LINE__, __FILE__);\
sam_grove 16:d6812604cf92 17 if (h##x > &s##x)\
sam_grove 16:d6812604cf92 18 printf("collision\n");\
sam_grove 16:d6812604cf92 19 else\
sam_grove 16:d6812604cf92 20 delete [] h##x;\
sam_grove 16:d6812604cf92 21 __nop()
sam_grove 16:d6812604cf92 22
michaeljkoster 0:07581223f90c 23 extern Serial pc;
michaeljkoster 0:07581223f90c 24 extern cc3000 wifi;
michaeljkoster 0:07581223f90c 25 extern Endpoint nsp;
michaeljkoster 0:07581223f90c 26 extern UDPSocket server;
michaeljkoster 7:01d01c5cf409 27 extern char endpoint_name[24];
michaeljkoster 0:07581223f90c 28 extern uint8_t ep_type[];
michaeljkoster 0:07581223f90c 29 extern uint8_t lifetime_ptr[];
michaeljkoster 8:3926a80af3e0 30 char null_ep_name[] = "";
michaeljkoster 8:3926a80af3e0 31 uint8_t null_ep_type[] = "";
michaeljkoster 8:3926a80af3e0 32 uint8_t null_lifetime_ptr[] = "";
michaeljkoster 0:07581223f90c 33
michaeljkoster 0:07581223f90c 34 /* The number of seconds between NSP registration messages */
michaeljkoster 0:07581223f90c 35 #define RD_UPDATE_PERIOD 60
michaeljkoster 0:07581223f90c 36
michaeljkoster 0:07581223f90c 37 void *nsdl_alloc(uint16_t size)
michaeljkoster 0:07581223f90c 38 {
sam_grove 16:d6812604cf92 39 void *buf = malloc(size);
sam_grove 16:d6812604cf92 40 printf("alloc\r\n");
sam_grove 16:d6812604cf92 41 MEM_VALID(0);
sam_grove 16:d6812604cf92 42 return buf;
michaeljkoster 0:07581223f90c 43 }
michaeljkoster 0:07581223f90c 44
michaeljkoster 0:07581223f90c 45 void nsdl_free(void* ptr_to_free)
michaeljkoster 0:07581223f90c 46 {
michaeljkoster 0:07581223f90c 47 free(ptr_to_free);
sam_grove 16:d6812604cf92 48 printf("de-alloc\r\n");
sam_grove 16:d6812604cf92 49 MEM_VALID(0);
michaeljkoster 0:07581223f90c 50 }
michaeljkoster 0:07581223f90c 51
michaeljkoster 0:07581223f90c 52 /*
michaeljkoster 0:07581223f90c 53 * Create a static resoure
michaeljkoster 0:07581223f90c 54 * Only get is allowed
michaeljkoster 0:07581223f90c 55 */
michaeljkoster 0:07581223f90c 56 void nsdl_create_static_resource(sn_nsdl_resource_info_s *resource_structure, uint16_t pt_len, uint8_t *pt, uint16_t rpp_len, uint8_t *rpp_ptr, uint8_t *rsc, uint16_t rsc_len)
michaeljkoster 0:07581223f90c 57 {
michaeljkoster 0:07581223f90c 58 resource_structure->access = SN_GRS_GET_ALLOWED;
michaeljkoster 0:07581223f90c 59 resource_structure->mode = SN_GRS_STATIC;
michaeljkoster 0:07581223f90c 60 resource_structure->pathlen = pt_len;
michaeljkoster 0:07581223f90c 61 resource_structure->path = pt;
michaeljkoster 0:07581223f90c 62 resource_structure->resource_parameters_ptr->resource_type_len = rpp_len;
michaeljkoster 0:07581223f90c 63 resource_structure->resource_parameters_ptr->resource_type_ptr = rpp_ptr;
michaeljkoster 0:07581223f90c 64 resource_structure->resource = rsc;
michaeljkoster 0:07581223f90c 65 resource_structure->resourcelen = rsc_len;
michaeljkoster 0:07581223f90c 66 sn_nsdl_create_resource(resource_structure);
michaeljkoster 0:07581223f90c 67 }
michaeljkoster 0:07581223f90c 68
michaeljkoster 0:07581223f90c 69 void nsdl_create_dynamic_resource(sn_nsdl_resource_info_s *resource_structure, uint16_t pt_len, uint8_t *pt, uint16_t rpp_len, uint8_t *rpp_ptr, uint8_t is_observable, sn_grs_dyn_res_callback_t callback_ptr, int access_right)
michaeljkoster 0:07581223f90c 70 {
michaeljkoster 0:07581223f90c 71 resource_structure->access = (sn_grs_resource_acl_e)access_right;
michaeljkoster 0:07581223f90c 72 resource_structure->resource = 0;
michaeljkoster 0:07581223f90c 73 resource_structure->resourcelen = 0;
michaeljkoster 0:07581223f90c 74 resource_structure->sn_grs_dyn_res_callback = callback_ptr;
michaeljkoster 0:07581223f90c 75 resource_structure->mode = SN_GRS_DYNAMIC;
michaeljkoster 0:07581223f90c 76 resource_structure->pathlen = pt_len;
michaeljkoster 0:07581223f90c 77 resource_structure->path = pt;
michaeljkoster 0:07581223f90c 78 resource_structure->resource_parameters_ptr->resource_type_len = rpp_len;
michaeljkoster 0:07581223f90c 79 resource_structure->resource_parameters_ptr->resource_type_ptr = rpp_ptr;
michaeljkoster 0:07581223f90c 80 resource_structure->resource_parameters_ptr->observable = is_observable;
michaeljkoster 0:07581223f90c 81 sn_nsdl_create_resource(resource_structure);
michaeljkoster 0:07581223f90c 82 }
michaeljkoster 0:07581223f90c 83
michaeljkoster 0:07581223f90c 84 sn_nsdl_ep_parameters_s* nsdl_init_register_endpoint(sn_nsdl_ep_parameters_s *endpoint_structure, uint8_t* name, uint8_t* typename_ptr, uint8_t *lifetime_ptr)
michaeljkoster 0:07581223f90c 85 {
michaeljkoster 0:07581223f90c 86 if (NULL == endpoint_structure)
michaeljkoster 0:07581223f90c 87 {
michaeljkoster 0:07581223f90c 88 endpoint_structure = (sn_nsdl_ep_parameters_s*)nsdl_alloc(sizeof(sn_nsdl_ep_parameters_s));
michaeljkoster 0:07581223f90c 89 }
michaeljkoster 0:07581223f90c 90 if (endpoint_structure)
michaeljkoster 0:07581223f90c 91 {
michaeljkoster 0:07581223f90c 92 memset(endpoint_structure, 0, sizeof(sn_nsdl_ep_parameters_s));
michaeljkoster 0:07581223f90c 93 endpoint_structure->endpoint_name_ptr = name;
michaeljkoster 0:07581223f90c 94 endpoint_structure->endpoint_name_len = strlen((char*)name);
michaeljkoster 0:07581223f90c 95 endpoint_structure->type_ptr = typename_ptr;
michaeljkoster 0:07581223f90c 96 endpoint_structure->type_len = strlen((char*)typename_ptr);
michaeljkoster 0:07581223f90c 97 endpoint_structure->lifetime_ptr = lifetime_ptr;
michaeljkoster 0:07581223f90c 98 endpoint_structure->lifetime_len = strlen((char*)lifetime_ptr);
michaeljkoster 0:07581223f90c 99 }
michaeljkoster 0:07581223f90c 100 return endpoint_structure;
michaeljkoster 0:07581223f90c 101 }
michaeljkoster 0:07581223f90c 102
michaeljkoster 0:07581223f90c 103 void nsdl_clean_register_endpoint(sn_nsdl_ep_parameters_s **endpoint_structure)
michaeljkoster 0:07581223f90c 104 {
michaeljkoster 0:07581223f90c 105 if (*endpoint_structure)
michaeljkoster 0:07581223f90c 106 {
michaeljkoster 0:07581223f90c 107 nsdl_free(*endpoint_structure);
michaeljkoster 0:07581223f90c 108 *endpoint_structure = NULL;
michaeljkoster 0:07581223f90c 109 }
michaeljkoster 0:07581223f90c 110 }
michaeljkoster 0:07581223f90c 111
michaeljkoster 0:07581223f90c 112 static uint8_t tx_cb(sn_nsdl_capab_e protocol, uint8_t *data_ptr, uint16_t data_len, sn_nsdl_addr_s *address_ptr)
michaeljkoster 0:07581223f90c 113 {
michaeljkoster 0:07581223f90c 114 pc.printf("TX callback!\n\rSending %d bytes\r\n", data_len);
michaeljkoster 0:07581223f90c 115
michaeljkoster 0:07581223f90c 116 if(server.sendTo(nsp, (char*)data_ptr, data_len) != data_len)
michaeljkoster 0:07581223f90c 117 pc.printf("sending failed\n\r");
michaeljkoster 0:07581223f90c 118
michaeljkoster 0:07581223f90c 119 return 1;
michaeljkoster 0:07581223f90c 120 }
michaeljkoster 0:07581223f90c 121
michaeljkoster 0:07581223f90c 122 static uint8_t rx_cb(sn_coap_hdr_s *coap_packet_ptr, sn_nsdl_addr_s *address_ptr)
michaeljkoster 0:07581223f90c 123 {
michaeljkoster 0:07581223f90c 124 pc.printf("RX callback!\r\n");
michaeljkoster 0:07581223f90c 125 return 0;
michaeljkoster 0:07581223f90c 126 }
michaeljkoster 0:07581223f90c 127
michaeljkoster 0:07581223f90c 128 static void registration_update_thread(void const *args)
michaeljkoster 0:07581223f90c 129 {
michaeljkoster 0:07581223f90c 130 sn_nsdl_ep_parameters_s *endpoint_ptr = NULL;
michaeljkoster 0:07581223f90c 131
michaeljkoster 0:07581223f90c 132 while(true)
michaeljkoster 0:07581223f90c 133 {
michaeljkoster 0:07581223f90c 134 wait(RD_UPDATE_PERIOD);
michaeljkoster 0:07581223f90c 135 endpoint_ptr = nsdl_init_register_endpoint(endpoint_ptr, (uint8_t*)endpoint_name, ep_type, lifetime_ptr);
michaeljkoster 0:07581223f90c 136 if(sn_nsdl_register_endpoint(endpoint_ptr) != 0)
michaeljkoster 0:07581223f90c 137 pc.printf("NSP re-registering failed\r\n");
michaeljkoster 0:07581223f90c 138 else
michaeljkoster 0:07581223f90c 139 pc.printf("NSP re-registering OK\r\n");
michaeljkoster 0:07581223f90c 140 nsdl_clean_register_endpoint(&endpoint_ptr);
michaeljkoster 0:07581223f90c 141 }
michaeljkoster 0:07581223f90c 142 }
michaeljkoster 0:07581223f90c 143
michaeljkoster 0:07581223f90c 144 void nsdl_init()
michaeljkoster 0:07581223f90c 145 {
michaeljkoster 0:07581223f90c 146 uint8_t nsp_addr[4];
michaeljkoster 0:07581223f90c 147 sn_nsdl_mem_s memory_cbs;
michaeljkoster 0:07581223f90c 148
michaeljkoster 0:07581223f90c 149 /* Initialize libNsdl */
michaeljkoster 0:07581223f90c 150 memory_cbs.sn_nsdl_alloc = &nsdl_alloc;
michaeljkoster 0:07581223f90c 151 memory_cbs.sn_nsdl_free = &nsdl_free;
michaeljkoster 0:07581223f90c 152 if(sn_nsdl_init(&tx_cb, &rx_cb, &memory_cbs) == -1)
michaeljkoster 0:07581223f90c 153 pc.printf("libNsdl init failed\r\n");
michaeljkoster 0:07581223f90c 154 else
michaeljkoster 0:07581223f90c 155 pc.printf("libNsdl init done\r\n");
michaeljkoster 0:07581223f90c 156
michaeljkoster 0:07581223f90c 157 /* Set nsp address for library */
michaeljkoster 0:07581223f90c 158 set_NSP_address(nsp_addr, 5683, SN_NSDL_ADDRESS_TYPE_IPV4);
michaeljkoster 0:07581223f90c 159 }
michaeljkoster 0:07581223f90c 160
michaeljkoster 8:3926a80af3e0 161 void nsdl_reg_update()
michaeljkoster 7:01d01c5cf409 162 {
michaeljkoster 8:3926a80af3e0 163 sn_nsdl_ep_parameters_s *endpoint_ptr = NULL;
michaeljkoster 8:3926a80af3e0 164 // endpoint_ptr = nsdl_init_register_endpoint(endpoint_ptr, (uint8_t*)endpoint_name, ep_type, lifetime_ptr);
michaeljkoster 8:3926a80af3e0 165 // if(sn_nsdl_register_endpoint(endpoint_ptr) != 0)
michaeljkoster 8:3926a80af3e0 166 // reg update should be invoked with null parameters if nothing is changing
michaeljkoster 8:3926a80af3e0 167 endpoint_ptr = nsdl_init_register_endpoint(endpoint_ptr, (uint8_t*)null_ep_name, null_ep_type, null_lifetime_ptr);
michaeljkoster 8:3926a80af3e0 168 if(sn_nsdl_update_registration(endpoint_ptr) != 0)
michaeljkoster 7:01d01c5cf409 169 pc.printf("NSP re-registering failed\r\n");
michaeljkoster 7:01d01c5cf409 170 else
michaeljkoster 7:01d01c5cf409 171 pc.printf("NSP re-registering OK\r\n");
michaeljkoster 7:01d01c5cf409 172 nsdl_clean_register_endpoint(&endpoint_ptr);
michaeljkoster 7:01d01c5cf409 173 }
michaeljkoster 8:3926a80af3e0 174
michaeljkoster 8:3926a80af3e0 175 Ticker regUpdateTicker;
michaeljkoster 7:01d01c5cf409 176
michaeljkoster 0:07581223f90c 177 void nsdl_event_loop()
michaeljkoster 0:07581223f90c 178 {
michaeljkoster 0:07581223f90c 179 // Thread registration_thread(registration_update_thread);
michaeljkoster 0:07581223f90c 180 //put re-registration in timeout loop instead of thread
michaeljkoster 8:3926a80af3e0 181 // regUpdateTicker.attach(&nsdl_reg_update, RD_UPDATE_PERIOD);
michaeljkoster 0:07581223f90c 182
michaeljkoster 0:07581223f90c 183 sn_nsdl_addr_s received_packet_address;
michaeljkoster 0:07581223f90c 184 uint8_t received_address[4];
michaeljkoster 0:07581223f90c 185 char buffer[1024];
michaeljkoster 0:07581223f90c 186 Endpoint from;
michaeljkoster 0:07581223f90c 187
michaeljkoster 0:07581223f90c 188 memset(&received_packet_address, 0, sizeof(sn_nsdl_addr_s));
michaeljkoster 0:07581223f90c 189 received_packet_address.addr_ptr = received_address;
michaeljkoster 0:07581223f90c 190
michaeljkoster 0:07581223f90c 191 while(1)
michaeljkoster 0:07581223f90c 192 {
michaeljkoster 0:07581223f90c 193 int n = server.receiveFrom(from, buffer, sizeof(buffer));
michaeljkoster 0:07581223f90c 194 if (n < 0)
michaeljkoster 0:07581223f90c 195 {
michaeljkoster 0:07581223f90c 196 pc.printf("Socket error %d\n\r", n);
michaeljkoster 0:07581223f90c 197 }
michaeljkoster 0:07581223f90c 198 else
michaeljkoster 0:07581223f90c 199 {
michaeljkoster 0:07581223f90c 200 pc.printf("Received %d bytes\r\n", n);
michaeljkoster 0:07581223f90c 201 sn_nsdl_process_coap((uint8_t*)buffer, n, &received_packet_address);
michaeljkoster 0:07581223f90c 202 }
michaeljkoster 0:07581223f90c 203 }
michaeljkoster 0:07581223f90c 204 }
michaeljkoster 0:07581223f90c 205
michaeljkoster 0:07581223f90c 206