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 // Accelerometer resource implementation
Shage 0:e8d7be634e3c 2
Shage 0:e8d7be634e3c 3 #include "mbed.h"
Shage 0:e8d7be634e3c 4 #include "rtos.h"
Shage 0:e8d7be634e3c 5 #include "nsdl_support.h"
Shage 0:e8d7be634e3c 6 #include "accelerometer.h"
Shage 0:e8d7be634e3c 7 #include "MMA7660.h"
Shage 0:e8d7be634e3c 8 #define ACC_RES_ID "acc"
Shage 0:e8d7be634e3c 9 #define X_AXIS "x"
Shage 0:e8d7be634e3c 10 #define Y_AXIS "y"
Shage 0:e8d7be634e3c 11 #define Z_AXIS "z"
Shage 0:e8d7be634e3c 12
Shage 0:e8d7be634e3c 13 static MMA7660 MMA(p28, p27);
Shage 0:e8d7be634e3c 14 static uint8_t obs_number = 0;
Shage 0:e8d7be634e3c 15 static uint8_t *obs_token_ptr = NULL;
Shage 0:e8d7be634e3c 16 static uint8_t obs_token_len = 0;
Shage 0:e8d7be634e3c 17 //static char acc_val[8];
Shage 0:e8d7be634e3c 18 static char acc_val[20];
Shage 0:e8d7be634e3c 19 // Data from PUT request
Shage 0:e8d7be634e3c 20 static char received_cmd[20];
Shage 0:e8d7be634e3c 21 static char selected_axis[20];
Shage 0:e8d7be634e3c 22 extern Serial pc;
Shage 0:e8d7be634e3c 23
Shage 0:e8d7be634e3c 24 /* Thread for calling libNsdl exec function (cleanup, resendings etc..) */
Shage 0:e8d7be634e3c 25 static void exec_call_thread(void const *args)
Shage 0:e8d7be634e3c 26 {
Shage 0:e8d7be634e3c 27 int32_t time = 0;
Shage 0:e8d7be634e3c 28 strcpy(selected_axis, "xy");
Shage 0:e8d7be634e3c 29 MMA.setSampleRate(120);
Shage 0:e8d7be634e3c 30 while (true)
Shage 0:e8d7be634e3c 31 {
Shage 0:e8d7be634e3c 32 time++;
Shage 0:e8d7be634e3c 33 sn_nsdl_exec(time);
Shage 0:e8d7be634e3c 34 if(obs_token_ptr != NULL)
Shage 0:e8d7be634e3c 35 {
Shage 0:e8d7be634e3c 36 obs_number++;
Shage 0:e8d7be634e3c 37 if (!strcmp(selected_axis, X_AXIS Y_AXIS Z_AXIS)) {
Shage 0:e8d7be634e3c 38 sprintf(acc_val,"%2.2f;%2.2f;%2.2f", MMA.x(), MMA.y(), MMA.z());
Shage 0:e8d7be634e3c 39 }
Shage 0:e8d7be634e3c 40 else if (!strcmp(selected_axis, X_AXIS Y_AXIS)) {
Shage 0:e8d7be634e3c 41 sprintf(acc_val,"%2.2f;%2.2f", MMA.x(), MMA.y());
Shage 0:e8d7be634e3c 42 }
Shage 0:e8d7be634e3c 43 else if (!strcmp(selected_axis, X_AXIS Z_AXIS)) {
Shage 0:e8d7be634e3c 44 sprintf(acc_val,"%2.2f;%2.2f", MMA.x(), MMA.z());
Shage 0:e8d7be634e3c 45 }
Shage 0:e8d7be634e3c 46 else if (!strcmp(selected_axis, Y_AXIS Z_AXIS)) {
Shage 0:e8d7be634e3c 47 sprintf(acc_val,"%2.2f;%2.2f", MMA.y(), MMA.z());
Shage 0:e8d7be634e3c 48 }
Shage 0:e8d7be634e3c 49 else if (!strcmp(selected_axis, X_AXIS)) {
Shage 0:e8d7be634e3c 50 sprintf(acc_val,"%2.2f", MMA.x());
Shage 0:e8d7be634e3c 51 }
Shage 0:e8d7be634e3c 52 else if (!strcmp(selected_axis, Y_AXIS)) {
Shage 0:e8d7be634e3c 53 sprintf(acc_val,"%2.2f", MMA.y());
Shage 0:e8d7be634e3c 54 }
Shage 0:e8d7be634e3c 55 else {
Shage 0:e8d7be634e3c 56 sprintf(acc_val,"%2.2f", MMA.z());
Shage 0:e8d7be634e3c 57 }
Shage 0:e8d7be634e3c 58 if (sn_nsdl_send_observation_notification(obs_token_ptr, obs_token_len, (uint8_t*)acc_val, strlen(acc_val), &obs_number, 1, COAP_MSG_TYPE_NON_CONFIRMABLE, 0) == 0) {
Shage 0:e8d7be634e3c 59 pc.printf("Accelerometer data sending failed!\r\n");
Shage 0:e8d7be634e3c 60 }
Shage 0:e8d7be634e3c 61 }
Shage 0:e8d7be634e3c 62 }
Shage 0:e8d7be634e3c 63 }
Shage 0:e8d7be634e3c 64
Shage 0:e8d7be634e3c 65 // GET and PUT allowed
Shage 0:e8d7be634e3c 66 static uint8_t acc_resource_cb(sn_coap_hdr_s *received_coap_ptr, sn_nsdl_addr_s *address, sn_proto_info_s * proto)
Shage 0:e8d7be634e3c 67 {
Shage 0:e8d7be634e3c 68 sn_coap_hdr_s *coap_res_ptr = 0;
Shage 0:e8d7be634e3c 69
Shage 0:e8d7be634e3c 70 // GET, fetches accelerometer value for selected axis
Shage 0:e8d7be634e3c 71 if(received_coap_ptr->msg_code == COAP_MSG_CODE_REQUEST_GET) {
Shage 0:e8d7be634e3c 72 coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CONTENT);
Shage 0:e8d7be634e3c 73
Shage 0:e8d7be634e3c 74 coap_res_ptr->payload_len = 20;
Shage 0:e8d7be634e3c 75 coap_res_ptr->payload_ptr = (uint8_t*)acc_val;
Shage 0:e8d7be634e3c 76
Shage 0:e8d7be634e3c 77 if(received_coap_ptr->token_ptr)
Shage 0:e8d7be634e3c 78 {
Shage 0:e8d7be634e3c 79 if(obs_token_ptr)
Shage 0:e8d7be634e3c 80 {
Shage 0:e8d7be634e3c 81 free(obs_token_ptr);
Shage 0:e8d7be634e3c 82 obs_token_ptr = 0;
Shage 0:e8d7be634e3c 83 }
Shage 0:e8d7be634e3c 84 obs_token_ptr = (uint8_t*)malloc(received_coap_ptr->token_len);
Shage 0:e8d7be634e3c 85 if(obs_token_ptr)
Shage 0:e8d7be634e3c 86 {
Shage 0:e8d7be634e3c 87 memcpy(obs_token_ptr, received_coap_ptr->token_ptr, received_coap_ptr->token_len);
Shage 0:e8d7be634e3c 88 obs_token_len = received_coap_ptr->token_len;
Shage 0:e8d7be634e3c 89 }
Shage 0:e8d7be634e3c 90 }
Shage 0:e8d7be634e3c 91
Shage 0:e8d7be634e3c 92 if(received_coap_ptr->options_list_ptr->observe)
Shage 0:e8d7be634e3c 93 {
Shage 0:e8d7be634e3c 94 coap_res_ptr->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s));
Shage 0:e8d7be634e3c 95 memset(coap_res_ptr->options_list_ptr, 0, sizeof(sn_coap_options_list_s));
Shage 0:e8d7be634e3c 96 coap_res_ptr->options_list_ptr->observe_ptr = &obs_number;
Shage 0:e8d7be634e3c 97 coap_res_ptr->options_list_ptr->observe_len = 1;
Shage 0:e8d7be634e3c 98 obs_number++;
Shage 0:e8d7be634e3c 99 }
Shage 0:e8d7be634e3c 100
Shage 0:e8d7be634e3c 101 sn_nsdl_send_coap_message(address, coap_res_ptr);
Shage 0:e8d7be634e3c 102
Shage 0:e8d7be634e3c 103 coap_res_ptr->options_list_ptr->observe_ptr = 0;
Shage 0:e8d7be634e3c 104 }
Shage 0:e8d7be634e3c 105 // PUT, sets the selected axis from request (msg body 'xyz', 'xy', 'xz', 'yz', 'x', 'y' or 'z')
Shage 0:e8d7be634e3c 106 else if(received_coap_ptr->msg_code == COAP_MSG_CODE_REQUEST_PUT) {
Shage 0:e8d7be634e3c 107 memcpy(received_cmd, (char *)received_coap_ptr->payload_ptr, received_coap_ptr->payload_len);
Shage 0:e8d7be634e3c 108 received_cmd[received_coap_ptr->payload_len] = '\0';
Shage 0:e8d7be634e3c 109 sprintf(selected_axis, "%s", received_cmd);
Shage 0:e8d7be634e3c 110 coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CHANGED);
Shage 0:e8d7be634e3c 111 sn_nsdl_send_coap_message(address, coap_res_ptr);
Shage 0:e8d7be634e3c 112 }
Shage 0:e8d7be634e3c 113 sn_coap_parser_release_allocated_coap_msg_mem(coap_res_ptr);
Shage 0:e8d7be634e3c 114 return 0;
Shage 0:e8d7be634e3c 115 }
Shage 0:e8d7be634e3c 116
Shage 0:e8d7be634e3c 117 int create_accelerometer_resource(sn_nsdl_resource_info_s *resource_ptr)
Shage 0:e8d7be634e3c 118 {
Shage 0:e8d7be634e3c 119 static Thread exec_thread(exec_call_thread);
Shage 0:e8d7be634e3c 120 nsdl_create_dynamic_resource(resource_ptr, sizeof(ACC_RES_ID)-1, (uint8_t*)ACC_RES_ID, 0, 0, 1, &acc_resource_cb, (SN_GRS_GET_ALLOWED | SN_GRS_PUT_ALLOWED));
Shage 0:e8d7be634e3c 121 return 0;
Shage 0:e8d7be634e3c 122 }