NSP demo runnig over WiFi

Dependencies:   Beep C12832_lcd LM75B MMA7660 WiflyInterface mbed-rtos mbed nsdl_lib

Fork of NSDL_HelloWorld by Sensinode

Files at this revision

API Documentation at this revision

Comitter:
terohoo
Date:
Wed Oct 09 09:31:17 2013 +0000
Child:
1:e35d7f10999a
Commit message:
Adding nsdl example app

Changed in this revision

Beep.lib Show annotated file Show diff for this revision Revisions of this file
C12832_lcd.lib Show annotated file Show diff for this revision Revisions of this file
EthernetInterface.lib Show annotated file Show diff for this revision Revisions of this file
LM75B.lib Show annotated file Show diff for this revision Revisions of this file
MMA7660.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
nsdl_lib.lib Show annotated file Show diff for this revision Revisions of this file
resource_generation_help.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Beep.lib	Wed Oct 09 09:31:17 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/shimniok/code/Beep/#3eb39e374fc3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/C12832_lcd.lib	Wed Oct 09 09:31:17 2013 +0000
@@ -0,0 +1,1 @@
+https://mbed.org/users/dreschpe/code/C12832_lcd/#c9afe58d786a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/EthernetInterface.lib	Wed Oct 09 09:31:17 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/EthernetInterface/#dd9794ce1d64
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LM75B.lib	Wed Oct 09 09:31:17 2013 +0000
@@ -0,0 +1,1 @@
+https://mbed.org/users/chris/code/LM75B/#6a70c9303bbe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MMA7660.lib	Wed Oct 09 09:31:17 2013 +0000
@@ -0,0 +1,1 @@
+https://mbed.org/users/Sissors/code/MMA7660/#a8e20db7901e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Oct 09 09:31:17 2013 +0000
@@ -0,0 +1,453 @@
+/* Define DEBUG for USB serial communication */
+#define DEBUG
+
+#include "mbed.h"
+#include "EthernetInterface.h"
+#include "C12832_lcd.h"
+#include "LM75B.h"
+#include "MMA7660.h"
+#include "Beep.h"
+/* Sensinode includes */
+#include "sn_nsdl.h"
+#include "sn_coap_header.h"
+#include "sn_coap_protocol.h"
+#include "sn_nsdl_lib.h"
+
+#include "resource_generation_help.h"
+
+/* Define this to enable DHCP, otherwise manual address configuration is used */
+#define DHCP
+
+/* Manual IP configurations, if DHCP not defined */
+#define IP      "10.45.0.206"
+#define MASK    "255.255.255.0"
+#define GW      "10.45.0.1"
+
+/* Change this IP address to that of your NanoService Platform installation */
+const char* NSP_ADDRESS = "10.45.3.42"; /* internal NSP*/
+const int NSP_PORT = 5683;
+
+uint8_t nsp_addr[4];
+
+/* The number of seconds between NSP registration messages */
+#define RD_UPDATE_PERIOD  60
+
+/* Resource paths and registration parameters */
+static uint8_t res_mgf[] = {"dev/mfg"};
+static uint8_t res_mgf_val[] = {"Sensinode"};
+static uint8_t res_mdl[] = {"dev/mdl"};
+static uint8_t res_mdl_val[] = {"NSDL-C power node"};
+static uint8_t res_temp[] = {"sen/temp"};
+static uint8_t res_light[] = {"lt/0/dim"};
+static uint8_t res_gps[] = {"gps/loc"};
+static uint8_t res_gps_val[] = {"52.182382,0.178849"};
+static uint8_t res_rel[] = {"lt/0/on"};
+
+static uint8_t ep_type[] = {"PowerNode"};
+static uint8_t lifetime_ptr[] = {"1200"};
+
+/* stored data for observable resource */
+uint8_t obs_number = 0;
+uint8_t *obs_token_ptr = 0;
+uint8_t obs_token_len = 0;
+char temp_val[5];
+
+/* App board related stuff */
+Beep buzzer(p26);
+//PwmOut led1(LED1);
+PwmOut led2(LED2);
+PwmOut led3(LED3);
+//PwmOut led4(LED4);
+#ifdef DEBUG
+Serial pc(USBTX, USBRX); // tx, rx
+#endif
+C12832_LCD lcd;
+LM75B tmp(p28,p27);
+MMA7660 MMA(p28, p27);
+
+EthernetInterface eth;
+UDPSocket server;
+Endpoint nsp;
+Endpoint from;
+
+/* For creating uniq name for board.. */
+char mbed_uid[33];
+char endpoint_name[15] = "MyMbedexam";
+
+extern "C"
+{
+uint8_t tx_cb(sn_nsdl_capab_e protocol, uint8_t *data_ptr, uint16_t data_len, sn_nsdl_addr_s *address_ptr);
+uint8_t rx_cb(sn_coap_hdr_s *coap_packet_ptr, sn_nsdl_addr_s *address_ptr);
+void *own_alloc(uint16_t size);
+void own_free(void* ptr_to_free);
+static uint8_t temp_resource_cb(sn_coap_hdr_s *received_coap_ptr, sn_nsdl_addr_s *address, sn_proto_info_s * proto);
+static uint8_t light_resource_cb(sn_coap_hdr_s *received_coap_ptr, sn_nsdl_addr_s *address, sn_proto_info_s * proto);
+static uint8_t gps_resource_cb(sn_coap_hdr_s *received_coap_ptr, sn_nsdl_addr_s *address, sn_proto_info_s * proto);
+static uint8_t relay_resource_cb(sn_coap_hdr_s *received_coap_ptr, sn_nsdl_addr_s *address, sn_proto_info_s * proto);
+}
+
+/* Thread for handling registration updates */
+void registration_update_thread(void const *args)
+{
+    sn_nsdl_ep_parameters_s *endpoint_ptr = 0;
+    while(true)
+    {
+        wait(RD_UPDATE_PERIOD);
+        INIT_REGISTER_NSDL_ENDPOINT(endpoint_ptr, (uint8_t*)endpoint_name, ep_type, lifetime_ptr);
+        if(sn_nsdl_register_endpoint(endpoint_ptr) != 0)
+            pc.printf("NSP re-registering failed\r\n");
+        else
+            pc.printf("NSP re-registering OK\r\n");
+        CLEAN_REGISTER_NSDL_ENDPOINT(endpoint_ptr);
+
+    }
+}
+
+/* Thread for calling libNsdl exec function (cleanup, resendings etc..) */
+/* Node updates temperature every 10 seconds. Notification sending is done here. */
+void exec_call_thread(void const *args)
+{
+    int32_t time = 0;
+    while (true)
+    {
+        wait(1);
+        time++;
+        sn_nsdl_exec(time);
+        if((!(time % 10)) && obs_number != 0)
+        {
+            obs_number++;
+            sprintf(temp_val,"%2.2f" ,tmp.read());
+            if(sn_nsdl_send_observation_notification(obs_token_ptr, obs_token_len, (uint8_t*)temp_val, 5, &obs_number, 1, COAP_MSG_TYPE_NON_CONFIRMABLE, 0) == 0)
+                pc.printf("Observation sending failed\r\n");
+            else
+                pc.printf("Observation\r\n");
+        }
+    }
+}
+
+int main()
+{
+
+    Thread registration_thread(registration_update_thread);
+    Thread exec_thread(exec_call_thread);
+
+    sn_nsdl_mem_s memory_cbs;
+    sn_nsdl_resource_info_s *resource_ptr = 0;
+    sn_nsdl_ep_parameters_s *endpoint_ptr = 0;
+    sn_nsdl_addr_s received_packet_address;
+    uint8_t received_address[4];
+
+    memset(&received_packet_address, 0, sizeof(sn_nsdl_addr_s));
+    received_packet_address.addr_ptr = received_address;
+
+    lcd.cls();
+    lcd.locate(0,0);
+    lcd.printf("mbed NanoService demo");
+#ifdef DEBUG
+    pc.printf("mbed NanoService Example App 0.1\n\n\r");
+#endif
+
+    /* Initialize network */
+#ifdef DHCP
+#ifdef DEBUG
+    pc.printf("DHCP in use\r\n");
+#endif
+    eth.init();
+#else
+    eth.init(IP, MASK, GW);
+#endif
+    if(eth.connect(30000) == 0)
+        pc.printf("Connect OK\n\r");
+
+    mbed_interface_uid(mbed_uid);
+    mbed_uid[32] = '\0';
+    memcpy(&endpoint_name[10], &mbed_uid[27], 5);
+
+    lcd.locate(0,11);
+    lcd.printf("IP:%s", eth.getIPAddress());
+
+#ifdef DEBUG
+    pc.printf("IP Address:%s \n\r", eth.getIPAddress());
+#endif
+    server.init();
+    server.bind(NSP_PORT);
+
+    nsp.set_address(NSP_ADDRESS,NSP_PORT);
+
+#ifdef DEBUG
+    pc.printf("name: %s\n\r", endpoint_name);
+    pc.printf("NSP=%s - port %d\r\n\n",NSP_ADDRESS, NSP_PORT);
+#endif
+
+    lcd.locate(0,22);
+    lcd.printf("EP name:%s", endpoint_name);
+
+    memory_cbs.sn_nsdl_alloc = &own_alloc;
+    memory_cbs.sn_nsdl_free = &own_free;
+
+    /* Initialize libNsdl */
+    if(sn_nsdl_init(&tx_cb, &rx_cb, &memory_cbs) == -1)
+        pc.printf("libNsdl init failed\r\n");
+    else
+        pc.printf("libNsdl init done\r\n");
+
+    /* Set nsp address for library */
+    set_NSP_address(nsp_addr, 5683, SN_NSDL_ADDRESS_TYPE_IPV4);
+
+#ifdef DEBUG
+    pc.printf("Creating resources\r\n");
+#endif
+    /* Create resources */
+    resource_ptr = (sn_nsdl_resource_info_s*)own_alloc(sizeof(sn_nsdl_resource_info_s));
+    if(!resource_ptr)
+        return 0;
+    memset(resource_ptr, 0, sizeof(sn_nsdl_resource_info_s));
+
+    resource_ptr->resource_parameters_ptr = (sn_nsdl_resource_parameters_s*)own_alloc(sizeof(sn_nsdl_resource_parameters_s));
+    if(!resource_ptr->resource_parameters_ptr)
+    {
+        own_free(resource_ptr);
+        return 0;
+    }
+    memset(resource_ptr->resource_parameters_ptr, 0, sizeof(sn_nsdl_resource_parameters_s));
+
+    /* Static resurces */
+    CREATE_STATIC_RESOURCE(resource_ptr, sizeof(res_mgf)-1, (uint8_t*) res_mgf, 0, 0,  (uint8_t*) res_mgf_val, sizeof(res_mgf_val)-1);
+    CREATE_STATIC_RESOURCE(resource_ptr, sizeof(res_mdl)-1, (uint8_t*) res_mdl, 0, 0,  (uint8_t*) res_mdl_val, sizeof(res_mdl_val)-1);
+
+    CREATE_DYNAMIC_RESOURCE(resource_ptr, sizeof(res_temp)-1, (uint8_t*) res_temp, 0, 0, 1, &temp_resource_cb, SN_GRS_GET_ALLOWED);
+    CREATE_DYNAMIC_RESOURCE(resource_ptr, sizeof(res_light)-1, (uint8_t*) res_light, 0, 0, 0, &light_resource_cb, (SN_GRS_GET_ALLOWED | SN_GRS_PUT_ALLOWED));
+    CREATE_DYNAMIC_RESOURCE(resource_ptr, sizeof(res_gps)-1, (uint8_t*) res_gps, 0, 0, 0, &gps_resource_cb, SN_GRS_GET_ALLOWED);
+    CREATE_DYNAMIC_RESOURCE(resource_ptr, sizeof(res_rel)-1, (uint8_t*) res_rel, 0, 0, 0, &relay_resource_cb, (SN_GRS_GET_ALLOWED | SN_GRS_PUT_ALLOWED));
+
+
+        /* Register with NSP */
+    INIT_REGISTER_NSDL_ENDPOINT(endpoint_ptr, (uint8_t*)endpoint_name, ep_type, lifetime_ptr);
+
+    if(sn_nsdl_register_endpoint(endpoint_ptr) != 0)
+        pc.printf("NSP registering failed\r\n");
+    else
+        pc.printf("NSP registering OK\r\n");
+
+    CLEAN_REGISTER_NSDL_ENDPOINT(endpoint_ptr);
+
+    own_free(resource_ptr->resource_parameters_ptr);
+    own_free(resource_ptr);
+
+    char buffer[1024];
+    while(1)
+    {
+        int n = server.receiveFrom(from, buffer, sizeof(buffer));
+        if (n < 0)
+        {
+            pc.printf("Socket error\n\r");
+        }
+        else
+        {   
+            pc.printf("Received %d bytes\r\n", n);
+            sn_nsdl_process_coap((uint8_t*)buffer, n, &received_packet_address);
+        }
+    }
+}
+uint8_t tx_cb(sn_nsdl_capab_e protocol, uint8_t *data_ptr, uint16_t data_len, sn_nsdl_addr_s *address_ptr)
+{
+    pc.printf("TX callback!\n\rSending %d bytes:\r\n", data_len);
+
+    if(server.sendTo(nsp, (char*)data_ptr, data_len) != data_len)
+        pc.printf("sending failed\n\r");
+
+    return 1;
+}
+
+
+uint8_t rx_cb(sn_coap_hdr_s *coap_packet_ptr, sn_nsdl_addr_s *address_ptr)
+{
+    pc.printf("RX callback!\r\n");
+
+    return 0;
+}
+
+void *own_alloc(uint16_t size)
+{
+    return malloc(size);
+}
+
+void own_free(void* ptr_to_free)
+{
+    free(ptr_to_free);
+}
+
+/* Only GET method allowed */
+/* Observable resource */
+static uint8_t temp_resource_cb(sn_coap_hdr_s *received_coap_ptr, sn_nsdl_addr_s *address, sn_proto_info_s * proto)
+{
+    sprintf(temp_val,"%2.2f" ,tmp.read());
+    sn_coap_hdr_s *coap_res_ptr = 0;
+
+    pc.printf("temp callback\r\n");
+    coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CONTENT);
+
+    coap_res_ptr->payload_len = 5;
+    coap_res_ptr->payload_ptr = (uint8_t*)temp_val;
+
+    if(received_coap_ptr->token_ptr)
+    {
+        pc.printf("Token included\r\n");
+        if(obs_token_ptr)
+        {
+            free(obs_token_ptr);
+            obs_token_ptr = 0;
+        }
+        obs_token_ptr = (uint8_t*)malloc(received_coap_ptr->token_len);
+        if(obs_token_ptr)
+        {
+            memcpy(obs_token_ptr, received_coap_ptr->token_ptr, received_coap_ptr->token_len);
+            obs_token_len = received_coap_ptr->token_len;
+        }
+    }
+
+    if(received_coap_ptr->options_list_ptr->observe)
+    {
+        coap_res_ptr->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s));
+        memset(coap_res_ptr->options_list_ptr, 0, sizeof(sn_coap_options_list_s));
+        coap_res_ptr->options_list_ptr->observe_ptr = &obs_number;
+        coap_res_ptr->options_list_ptr->observe_len = 1;
+        obs_number++;
+    }
+
+    sn_nsdl_send_coap_message(address, coap_res_ptr);
+
+    /* sn_coap_release.... */
+    if(coap_res_ptr->options_list_ptr)
+        free(coap_res_ptr->options_list_ptr);
+    if(coap_res_ptr->token_ptr)
+    {
+        own_free(coap_res_ptr->token_ptr);
+    }
+    own_free(coap_res_ptr);
+    return 0;
+}
+
+/* Only GET and PUT method allowed */
+static uint8_t light_resource_cb(sn_coap_hdr_s *received_coap_ptr, sn_nsdl_addr_s *address, sn_proto_info_s * proto)
+{
+    sn_coap_hdr_s *coap_res_ptr = 0;
+    static float led_dimm = 0;
+    int led_state = 0;
+    char led_dimm_temp[4];
+
+    pc.printf("light callback\r\n");
+
+    if(received_coap_ptr->msg_code == COAP_MSG_CODE_REQUEST_GET)
+    {
+        coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CONTENT);
+
+        led_state = led_dimm * 100;
+        sprintf(led_dimm_temp, "%d", led_state);
+
+        coap_res_ptr->payload_len = strlen(led_dimm_temp);
+        coap_res_ptr->payload_ptr = (uint8_t*)led_dimm_temp;
+    }
+    if(received_coap_ptr->msg_code == COAP_MSG_CODE_REQUEST_PUT)
+    {
+        memcpy(led_dimm_temp, (char *)received_coap_ptr->payload_ptr, received_coap_ptr->payload_len);
+
+        led_dimm_temp[received_coap_ptr->payload_len] = '\0';
+
+        led_dimm = atof(led_dimm_temp);
+        led_dimm = led_dimm/100;
+
+        //led1.write(led_dimm);
+        led2.write(led_dimm);
+        led3.write(led_dimm);
+        //led4.write(led_dimm);
+
+        coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CHANGED);
+    }
+
+    sn_nsdl_send_coap_message(address, coap_res_ptr);
+
+    /* sn_coap_release.... */
+    if(coap_res_ptr->token_ptr)
+    {
+        own_free(coap_res_ptr->token_ptr);
+    }
+    own_free(coap_res_ptr);
+    return 0;
+}
+
+/* Only GET method allowed */
+static uint8_t gps_resource_cb(sn_coap_hdr_s *received_coap_ptr, sn_nsdl_addr_s *address, sn_proto_info_s * proto)
+{
+    sn_coap_hdr_s *coap_res_ptr = 0;
+    static float led_dimm = 0;
+    int led_state = 0;
+    char led_dimm_temp[4];
+
+    pc.printf("gps callback\r\n");
+
+    coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CONTENT);
+
+    led_state = led_dimm * 100;
+    sprintf(led_dimm_temp, "%d", led_state);
+
+    coap_res_ptr->payload_len = sizeof(res_gps_val)-1;
+    coap_res_ptr->payload_ptr = (uint8_t*)res_gps_val;
+
+    sn_nsdl_send_coap_message(address, coap_res_ptr);
+
+    /* sn_coap_release.... */
+    if(coap_res_ptr->token_ptr)
+    {
+        own_free(coap_res_ptr->token_ptr);
+    }
+    own_free(coap_res_ptr);
+    return 0;
+}
+
+/* Only GET and PUT method allowed */
+static uint8_t relay_resource_cb(sn_coap_hdr_s *received_coap_ptr, sn_nsdl_addr_s *address, sn_proto_info_s * proto)
+{
+    sn_coap_hdr_s *coap_res_ptr = 0;
+    static uint8_t relay_state = '0';
+
+    pc.printf("relay callback\r\n");
+
+    if(received_coap_ptr->msg_code == COAP_MSG_CODE_REQUEST_GET)
+    {
+        coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CONTENT);
+
+        coap_res_ptr->payload_len = 1;
+        coap_res_ptr->payload_ptr = &relay_state;
+    }
+    if(received_coap_ptr->msg_code == COAP_MSG_CODE_REQUEST_PUT)
+    {
+        if(received_coap_ptr->payload_len)
+        {
+            if(*(received_coap_ptr->payload_ptr) == '1')
+            {
+                buzzer.beep(1000,0);
+                relay_state = '1';
+                
+            }
+            else if(*(received_coap_ptr->payload_ptr) == '0')
+            {
+                buzzer.nobeep();
+                relay_state = '0';
+            }
+            
+            coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CHANGED);
+            
+        }
+    }
+
+    sn_nsdl_send_coap_message(address, coap_res_ptr);
+
+    /* sn_coap_release.... */
+    if(coap_res_ptr->token_ptr)
+    {
+        own_free(coap_res_ptr->token_ptr);
+    }
+    own_free(coap_res_ptr);
+    return 0;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Wed Oct 09 09:31:17 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-rtos/#53e6cccd8782
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Wed Oct 09 09:31:17 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/a9913a65894f
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/nsdl_lib.lib	Wed Oct 09 09:31:17 2013 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/terohoo/code/nsdl_lib/#58c4f13c4b9a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/resource_generation_help.h	Wed Oct 09 09:31:17 2013 +0000
@@ -0,0 +1,74 @@
+/*
+ * resource_generation_help.h
+ *
+ *  Created on: 6.3.2012
+ *      Author: Sensinode
+ */
+
+#ifndef RESOURCE_GENERATION_HELP_H_
+#define RESOURCE_GENERATION_HELP_H_
+
+/*
+ * A helper macro to create a static resoure
+ * Only get is allowed
+ */
+#define CREATE_STATIC_RESOURCE(resource_structure, pt_len, pt, rpp_len, rpp_ptr, rsc, rsc_len)      \
+{                                                                                                   \
+    resource_structure->access = SN_GRS_GET_ALLOWED;                                       \
+    resource_structure->mode = SN_GRS_STATIC;                                                       \
+    resource_structure->pathlen = pt_len;                                                           \
+    resource_structure->path = pt;                                                                  \
+    resource_structure->resource_parameters_ptr->resource_type_len = rpp_len;                       \
+    resource_structure->resource_parameters_ptr->resource_type_ptr = rpp_ptr;                       \
+    resource_structure->resource = rsc;                                                             \
+    resource_structure->resourcelen = rsc_len;                                                      \
+    sn_nsdl_create_resource(resource_structure);                                                    \
+}
+
+
+/*
+ * A helper macro to create a dynamic resoure
+ */
+#define CREATE_DYNAMIC_RESOURCE(resource_structure, pt_len, pt, rpp_len, rpp_ptr, is_observable, callback_ptr, access_right)  \
+{                                                                                                   \
+    resource_structure->access = (sn_grs_resource_acl_e)access_right;                                       \
+    resource_structure->resource = 0;                                                               \
+    resource_structure->resourcelen = 0;                                                            \
+    resource_structure->sn_grs_dyn_res_callback = callback_ptr;                             \
+    resource_structure->mode = SN_GRS_DYNAMIC;                                                      \
+    resource_structure->pathlen = pt_len;                                                           \
+    resource_structure->path = pt;                                                                  \
+    resource_structure->resource_parameters_ptr->resource_type_len = rpp_len;                       \
+    resource_structure->resource_parameters_ptr->resource_type_ptr = rpp_ptr;                       \
+    resource_structure->resource_parameters_ptr->observable = is_observable;                        \
+    sn_nsdl_create_resource(resource_structure);                                                    \
+}
+
+#define INIT_REGISTER_NSDL_ENDPOINT(endpoint_structure, name, typename_ptr, lifetime_ptr)               \
+{                                                                                                   \
+            if(!endpoint_structure)                                                                 \
+            {                                                                                       \
+                endpoint_structure = (sn_nsdl_ep_parameters_s*)own_alloc(sizeof(sn_nsdl_ep_parameters_s));                    \
+            }                                                                                       \
+            if(endpoint_structure)                                                                  \
+            {                                                                                       \
+                memset(endpoint_structure, 0, sizeof(sn_nsdl_ep_parameters_s));                     \
+                endpoint_structure->endpoint_name_ptr = name;                                       \
+                endpoint_structure->endpoint_name_len = 15;                             \
+                endpoint_structure->type_ptr = typename_ptr;                                        \
+                endpoint_structure->type_len =  sizeof(typename_ptr)-1;                             \
+                endpoint_structure->lifetime_ptr = lifetime_ptr;                                    \
+                endpoint_structure->lifetime_len =  sizeof(lifetime_ptr)-1;                         \
+            }                                                                                       \
+}
+
+#define CLEAN_REGISTER_NSDL_ENDPOINT(endpoint_structure)                                            \
+{                                                                                                   \
+            if(endpoint_structure)                                                                  \
+            {                                                                                       \
+                own_free(endpoint_structure);                                                       \
+                endpoint_structure = 0;                                                                 \
+            }                                                                                       \
+}                                                                                                   \
+
+#endif /* RESOURCE_GENERATION_HELP_H_ */