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:
michaeljkoster
Date:
Sat Jun 14 09:42:20 2014 +0000
Revision:
7:01d01c5cf409
Parent:
0:07581223f90c
Child:
8:3926a80af3e0
ticker driven reg update + string buffer length fix in nsdl_support for 24

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
michaeljkoster 0:07581223f90c 12 extern Serial pc;
michaeljkoster 0:07581223f90c 13 extern cc3000 wifi;
michaeljkoster 0:07581223f90c 14 extern Endpoint nsp;
michaeljkoster 0:07581223f90c 15 extern UDPSocket server;
michaeljkoster 7:01d01c5cf409 16 extern char endpoint_name[24];
michaeljkoster 0:07581223f90c 17 extern uint8_t ep_type[];
michaeljkoster 0:07581223f90c 18 extern uint8_t lifetime_ptr[];
michaeljkoster 0:07581223f90c 19
michaeljkoster 0:07581223f90c 20 /* The number of seconds between NSP registration messages */
michaeljkoster 0:07581223f90c 21 #define RD_UPDATE_PERIOD 60
michaeljkoster 0:07581223f90c 22
michaeljkoster 0:07581223f90c 23 void *nsdl_alloc(uint16_t size)
michaeljkoster 0:07581223f90c 24 {
michaeljkoster 0:07581223f90c 25 return malloc(size);
michaeljkoster 0:07581223f90c 26 }
michaeljkoster 0:07581223f90c 27
michaeljkoster 0:07581223f90c 28 void nsdl_free(void* ptr_to_free)
michaeljkoster 0:07581223f90c 29 {
michaeljkoster 0:07581223f90c 30 free(ptr_to_free);
michaeljkoster 0:07581223f90c 31 }
michaeljkoster 0:07581223f90c 32
michaeljkoster 0:07581223f90c 33 /*
michaeljkoster 0:07581223f90c 34 * Create a static resoure
michaeljkoster 0:07581223f90c 35 * Only get is allowed
michaeljkoster 0:07581223f90c 36 */
michaeljkoster 0:07581223f90c 37 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 38 {
michaeljkoster 0:07581223f90c 39 resource_structure->access = SN_GRS_GET_ALLOWED;
michaeljkoster 0:07581223f90c 40 resource_structure->mode = SN_GRS_STATIC;
michaeljkoster 0:07581223f90c 41 resource_structure->pathlen = pt_len;
michaeljkoster 0:07581223f90c 42 resource_structure->path = pt;
michaeljkoster 0:07581223f90c 43 resource_structure->resource_parameters_ptr->resource_type_len = rpp_len;
michaeljkoster 0:07581223f90c 44 resource_structure->resource_parameters_ptr->resource_type_ptr = rpp_ptr;
michaeljkoster 0:07581223f90c 45 resource_structure->resource = rsc;
michaeljkoster 0:07581223f90c 46 resource_structure->resourcelen = rsc_len;
michaeljkoster 0:07581223f90c 47 sn_nsdl_create_resource(resource_structure);
michaeljkoster 0:07581223f90c 48 }
michaeljkoster 0:07581223f90c 49
michaeljkoster 0:07581223f90c 50 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 51 {
michaeljkoster 0:07581223f90c 52 resource_structure->access = (sn_grs_resource_acl_e)access_right;
michaeljkoster 0:07581223f90c 53 resource_structure->resource = 0;
michaeljkoster 0:07581223f90c 54 resource_structure->resourcelen = 0;
michaeljkoster 0:07581223f90c 55 resource_structure->sn_grs_dyn_res_callback = callback_ptr;
michaeljkoster 0:07581223f90c 56 resource_structure->mode = SN_GRS_DYNAMIC;
michaeljkoster 0:07581223f90c 57 resource_structure->pathlen = pt_len;
michaeljkoster 0:07581223f90c 58 resource_structure->path = pt;
michaeljkoster 0:07581223f90c 59 resource_structure->resource_parameters_ptr->resource_type_len = rpp_len;
michaeljkoster 0:07581223f90c 60 resource_structure->resource_parameters_ptr->resource_type_ptr = rpp_ptr;
michaeljkoster 0:07581223f90c 61 resource_structure->resource_parameters_ptr->observable = is_observable;
michaeljkoster 0:07581223f90c 62 sn_nsdl_create_resource(resource_structure);
michaeljkoster 0:07581223f90c 63 }
michaeljkoster 0:07581223f90c 64
michaeljkoster 0:07581223f90c 65 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 66 {
michaeljkoster 0:07581223f90c 67 if (NULL == endpoint_structure)
michaeljkoster 0:07581223f90c 68 {
michaeljkoster 0:07581223f90c 69 endpoint_structure = (sn_nsdl_ep_parameters_s*)nsdl_alloc(sizeof(sn_nsdl_ep_parameters_s));
michaeljkoster 0:07581223f90c 70 }
michaeljkoster 0:07581223f90c 71 if (endpoint_structure)
michaeljkoster 0:07581223f90c 72 {
michaeljkoster 0:07581223f90c 73 memset(endpoint_structure, 0, sizeof(sn_nsdl_ep_parameters_s));
michaeljkoster 0:07581223f90c 74 endpoint_structure->endpoint_name_ptr = name;
michaeljkoster 0:07581223f90c 75 endpoint_structure->endpoint_name_len = strlen((char*)name);
michaeljkoster 0:07581223f90c 76 endpoint_structure->type_ptr = typename_ptr;
michaeljkoster 0:07581223f90c 77 endpoint_structure->type_len = strlen((char*)typename_ptr);
michaeljkoster 0:07581223f90c 78 endpoint_structure->lifetime_ptr = lifetime_ptr;
michaeljkoster 0:07581223f90c 79 endpoint_structure->lifetime_len = strlen((char*)lifetime_ptr);
michaeljkoster 0:07581223f90c 80 }
michaeljkoster 0:07581223f90c 81 return endpoint_structure;
michaeljkoster 0:07581223f90c 82 }
michaeljkoster 0:07581223f90c 83
michaeljkoster 0:07581223f90c 84 void nsdl_clean_register_endpoint(sn_nsdl_ep_parameters_s **endpoint_structure)
michaeljkoster 0:07581223f90c 85 {
michaeljkoster 0:07581223f90c 86 if (*endpoint_structure)
michaeljkoster 0:07581223f90c 87 {
michaeljkoster 0:07581223f90c 88 nsdl_free(*endpoint_structure);
michaeljkoster 0:07581223f90c 89 *endpoint_structure = NULL;
michaeljkoster 0:07581223f90c 90 }
michaeljkoster 0:07581223f90c 91 }
michaeljkoster 0:07581223f90c 92
michaeljkoster 0:07581223f90c 93 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 94 {
michaeljkoster 0:07581223f90c 95 pc.printf("TX callback!\n\rSending %d bytes\r\n", data_len);
michaeljkoster 0:07581223f90c 96
michaeljkoster 0:07581223f90c 97 if(server.sendTo(nsp, (char*)data_ptr, data_len) != data_len)
michaeljkoster 0:07581223f90c 98 pc.printf("sending failed\n\r");
michaeljkoster 0:07581223f90c 99
michaeljkoster 0:07581223f90c 100 return 1;
michaeljkoster 0:07581223f90c 101 }
michaeljkoster 0:07581223f90c 102
michaeljkoster 0:07581223f90c 103 static uint8_t rx_cb(sn_coap_hdr_s *coap_packet_ptr, sn_nsdl_addr_s *address_ptr)
michaeljkoster 0:07581223f90c 104 {
michaeljkoster 0:07581223f90c 105 pc.printf("RX callback!\r\n");
michaeljkoster 0:07581223f90c 106 return 0;
michaeljkoster 0:07581223f90c 107 }
michaeljkoster 0:07581223f90c 108
michaeljkoster 0:07581223f90c 109 static void registration_update_thread(void const *args)
michaeljkoster 0:07581223f90c 110 {
michaeljkoster 0:07581223f90c 111 sn_nsdl_ep_parameters_s *endpoint_ptr = NULL;
michaeljkoster 0:07581223f90c 112
michaeljkoster 0:07581223f90c 113 while(true)
michaeljkoster 0:07581223f90c 114 {
michaeljkoster 0:07581223f90c 115 wait(RD_UPDATE_PERIOD);
michaeljkoster 0:07581223f90c 116 endpoint_ptr = nsdl_init_register_endpoint(endpoint_ptr, (uint8_t*)endpoint_name, ep_type, lifetime_ptr);
michaeljkoster 0:07581223f90c 117 if(sn_nsdl_register_endpoint(endpoint_ptr) != 0)
michaeljkoster 0:07581223f90c 118 pc.printf("NSP re-registering failed\r\n");
michaeljkoster 0:07581223f90c 119 else
michaeljkoster 0:07581223f90c 120 pc.printf("NSP re-registering OK\r\n");
michaeljkoster 0:07581223f90c 121 nsdl_clean_register_endpoint(&endpoint_ptr);
michaeljkoster 0:07581223f90c 122 }
michaeljkoster 0:07581223f90c 123 }
michaeljkoster 0:07581223f90c 124
michaeljkoster 0:07581223f90c 125 void nsdl_init()
michaeljkoster 0:07581223f90c 126 {
michaeljkoster 0:07581223f90c 127 uint8_t nsp_addr[4];
michaeljkoster 0:07581223f90c 128 sn_nsdl_mem_s memory_cbs;
michaeljkoster 0:07581223f90c 129
michaeljkoster 0:07581223f90c 130 /* Initialize libNsdl */
michaeljkoster 0:07581223f90c 131 memory_cbs.sn_nsdl_alloc = &nsdl_alloc;
michaeljkoster 0:07581223f90c 132 memory_cbs.sn_nsdl_free = &nsdl_free;
michaeljkoster 0:07581223f90c 133 if(sn_nsdl_init(&tx_cb, &rx_cb, &memory_cbs) == -1)
michaeljkoster 0:07581223f90c 134 pc.printf("libNsdl init failed\r\n");
michaeljkoster 0:07581223f90c 135 else
michaeljkoster 0:07581223f90c 136 pc.printf("libNsdl init done\r\n");
michaeljkoster 0:07581223f90c 137
michaeljkoster 0:07581223f90c 138 /* Set nsp address for library */
michaeljkoster 0:07581223f90c 139 set_NSP_address(nsp_addr, 5683, SN_NSDL_ADDRESS_TYPE_IPV4);
michaeljkoster 0:07581223f90c 140 }
michaeljkoster 0:07581223f90c 141
michaeljkoster 7:01d01c5cf409 142 Ticker regUpdate;
michaeljkoster 7:01d01c5cf409 143 sn_nsdl_ep_parameters_s *endpoint_ptr = NULL;
michaeljkoster 7:01d01c5cf409 144
michaeljkoster 7:01d01c5cf409 145 void regUpdateHandler()
michaeljkoster 7:01d01c5cf409 146 {
michaeljkoster 7:01d01c5cf409 147 endpoint_ptr = nsdl_init_register_endpoint(endpoint_ptr, (uint8_t*)endpoint_name, ep_type, lifetime_ptr);
michaeljkoster 7:01d01c5cf409 148 if(sn_nsdl_register_endpoint(endpoint_ptr) != 0)
michaeljkoster 7:01d01c5cf409 149 pc.printf("NSP re-registering failed\r\n");
michaeljkoster 7:01d01c5cf409 150 else
michaeljkoster 7:01d01c5cf409 151 pc.printf("NSP re-registering OK\r\n");
michaeljkoster 7:01d01c5cf409 152 nsdl_clean_register_endpoint(&endpoint_ptr);
michaeljkoster 7:01d01c5cf409 153 }
michaeljkoster 7:01d01c5cf409 154
michaeljkoster 0:07581223f90c 155 void nsdl_event_loop()
michaeljkoster 0:07581223f90c 156 {
michaeljkoster 0:07581223f90c 157 // Thread registration_thread(registration_update_thread);
michaeljkoster 0:07581223f90c 158 //put re-registration in timeout loop instead of thread
michaeljkoster 7:01d01c5cf409 159 regUpdate.attach(&regUpdateHandler, RD_UPDATE_PERIOD);
michaeljkoster 0:07581223f90c 160
michaeljkoster 0:07581223f90c 161 sn_nsdl_addr_s received_packet_address;
michaeljkoster 0:07581223f90c 162 uint8_t received_address[4];
michaeljkoster 0:07581223f90c 163 char buffer[1024];
michaeljkoster 0:07581223f90c 164 Endpoint from;
michaeljkoster 0:07581223f90c 165
michaeljkoster 0:07581223f90c 166 memset(&received_packet_address, 0, sizeof(sn_nsdl_addr_s));
michaeljkoster 0:07581223f90c 167 received_packet_address.addr_ptr = received_address;
michaeljkoster 0:07581223f90c 168
michaeljkoster 0:07581223f90c 169 while(1)
michaeljkoster 0:07581223f90c 170 {
michaeljkoster 0:07581223f90c 171 int n = server.receiveFrom(from, buffer, sizeof(buffer));
michaeljkoster 0:07581223f90c 172 if (n < 0)
michaeljkoster 0:07581223f90c 173 {
michaeljkoster 0:07581223f90c 174 pc.printf("Socket error %d\n\r", n);
michaeljkoster 0:07581223f90c 175 }
michaeljkoster 0:07581223f90c 176 else
michaeljkoster 0:07581223f90c 177 {
michaeljkoster 0:07581223f90c 178 pc.printf("Received %d bytes\r\n", n);
michaeljkoster 0:07581223f90c 179 sn_nsdl_process_coap((uint8_t*)buffer, n, &received_packet_address);
michaeljkoster 0:07581223f90c 180 }
michaeljkoster 0:07581223f90c 181 }
michaeljkoster 0:07581223f90c 182 }
michaeljkoster 0:07581223f90c 183
michaeljkoster 0:07581223f90c 184