from LPC1768_LWM2M_Client

Dependencies:   F7_Ethernet mbed-rtos mbed nsdl_lib

Fork of rtos_basic by Mbed

Committer:
zef
Date:
Wed Dec 21 03:08:39 2016 +0000
Revision:
8:5bcb48a04554
from LPC1768_LWM2M_Client Project

Who changed what in which revision?

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