NanoService device game controller for NSPong.

Dependencies:   Beep C12832_lcd EthernetInterface MMA7660 mbed-rtos mbed nsdl_lib

NS_Game_Controller

NS_Game_Controller is a game controller software for NSPong.

NSPong is a HTML5 demo game developed on top of ARM Sensinode’s NanoService Platform. The game uses for example RealTimeMultiplayerNodeJS, Box2D and CAAT libraries, which are specifically built for HTML5 multiplayer games with the client/server model.

NSPong is available at https://github.com/NSPong/NSPong.

Demo video is available at https://vimeo.com/95207889.

Committer:
Shage
Date:
Tue May 13 17:17:38 2014 +0000
Revision:
0:e8d7be634e3c
Initial version

Who changed what in which revision?

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