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 // Joystick 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 "joystick.h"
Shage 0:e8d7be634e3c 7 #define JOY_RES_ID "joy"
Shage 0:e8d7be634e3c 8
Shage 0:e8d7be634e3c 9 BusIn joy(p15,p12,p13,p16);
Shage 0:e8d7be634e3c 10 DigitalIn fire(p14);
Shage 0:e8d7be634e3c 11 static uint8_t old_joy_val = 0;
Shage 0:e8d7be634e3c 12 static uint8_t joy_val = 0;
Shage 0:e8d7be634e3c 13 static int old_fire_val = 0;
Shage 0:e8d7be634e3c 14 static int fire_val = 0;
Shage 0:e8d7be634e3c 15 static uint8_t obs_number = 0;
Shage 0:e8d7be634e3c 16 static uint8_t *obs_token_ptr = NULL;
Shage 0:e8d7be634e3c 17 static uint8_t obs_token_len = 0;
Shage 0:e8d7be634e3c 18 static char joy_msg[10];
Shage 0:e8d7be634e3c 19 extern Serial pc;
Shage 0:e8d7be634e3c 20
Shage 0:e8d7be634e3c 21 /* Thread for calling libNsdl exec function (cleanup, resendings etc..) */
Shage 0:e8d7be634e3c 22 /* Node detects joystick state changes and then sends data. Notification sending is done here. */
Shage 0:e8d7be634e3c 23 static void exec_call_thread(void const *args)
Shage 0:e8d7be634e3c 24 {
Shage 0:e8d7be634e3c 25 int32_t time = 0;
Shage 0:e8d7be634e3c 26 while (true)
Shage 0:e8d7be634e3c 27 {
Shage 0:e8d7be634e3c 28 // Only if joystick state has changed
Shage 0:e8d7be634e3c 29 joy_val = joy.read();
Shage 0:e8d7be634e3c 30 fire_val = fire.read();
Shage 0:e8d7be634e3c 31 if (fire_val != old_fire_val) {
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 (fire_val == 1) {
Shage 0:e8d7be634e3c 38 sprintf(joy_msg, "fire on");
Shage 0:e8d7be634e3c 39 }
Shage 0:e8d7be634e3c 40 else if (fire_val == 0) {
Shage 0:e8d7be634e3c 41 sprintf(joy_msg, "fire off");
Shage 0:e8d7be634e3c 42 }
Shage 0:e8d7be634e3c 43 if (sn_nsdl_send_observation_notification(obs_token_ptr, obs_token_len, (uint8_t*)joy_msg, strlen(joy_msg), &obs_number, 1, COAP_MSG_TYPE_NON_CONFIRMABLE, 0) == 0) {
Shage 0:e8d7be634e3c 44 pc.printf("Joystick data sending failed!\r\n");
Shage 0:e8d7be634e3c 45 }
Shage 0:e8d7be634e3c 46 }
Shage 0:e8d7be634e3c 47 old_fire_val = fire_val;
Shage 0:e8d7be634e3c 48 }
Shage 0:e8d7be634e3c 49 if (joy_val != old_joy_val) {
Shage 0:e8d7be634e3c 50 time++;
Shage 0:e8d7be634e3c 51 sn_nsdl_exec(time);
Shage 0:e8d7be634e3c 52 if(obs_token_ptr != NULL)
Shage 0:e8d7be634e3c 53 {
Shage 0:e8d7be634e3c 54 obs_number++;
Shage 0:e8d7be634e3c 55 if (joy_val == 0x08) {
Shage 0:e8d7be634e3c 56 sprintf(joy_msg, "down");
Shage 0:e8d7be634e3c 57 }
Shage 0:e8d7be634e3c 58 else if (joy_val == 0x04) {
Shage 0:e8d7be634e3c 59 sprintf(joy_msg, "up");
Shage 0:e8d7be634e3c 60 }
Shage 0:e8d7be634e3c 61 else if (joy_val == 0x02) {
Shage 0:e8d7be634e3c 62 sprintf(joy_msg, "left");
Shage 0:e8d7be634e3c 63 }
Shage 0:e8d7be634e3c 64 else if (joy_val == 0x01) {
Shage 0:e8d7be634e3c 65 sprintf(joy_msg, "right");
Shage 0:e8d7be634e3c 66 }
Shage 0:e8d7be634e3c 67 else if (joy_val == 0x00) {
Shage 0:e8d7be634e3c 68 sprintf(joy_msg, "release");
Shage 0:e8d7be634e3c 69 }
Shage 0:e8d7be634e3c 70 if (sn_nsdl_send_observation_notification(obs_token_ptr, obs_token_len, (uint8_t*)joy_msg, strlen(joy_msg), &obs_number, 1, COAP_MSG_TYPE_NON_CONFIRMABLE, 0) == 0) {
Shage 0:e8d7be634e3c 71 pc.printf("Joystick data sending failed!\r\n");
Shage 0:e8d7be634e3c 72 }
Shage 0:e8d7be634e3c 73 }
Shage 0:e8d7be634e3c 74 old_joy_val = joy_val;
Shage 0:e8d7be634e3c 75 }
Shage 0:e8d7be634e3c 76 }
Shage 0:e8d7be634e3c 77 }
Shage 0:e8d7be634e3c 78
Shage 0:e8d7be634e3c 79 // Only GET allowed
Shage 0:e8d7be634e3c 80 static uint8_t joy_resource_cb(sn_coap_hdr_s *received_coap_ptr, sn_nsdl_addr_s *address, sn_proto_info_s * proto)
Shage 0:e8d7be634e3c 81 {
Shage 0:e8d7be634e3c 82 old_joy_val = joy.read();
Shage 0:e8d7be634e3c 83 old_fire_val = fire.read();
Shage 0:e8d7be634e3c 84 sn_coap_hdr_s *coap_res_ptr = 0;
Shage 0:e8d7be634e3c 85 coap_res_ptr = sn_coap_build_response(received_coap_ptr, COAP_MSG_CODE_RESPONSE_CONTENT);
Shage 0:e8d7be634e3c 86
Shage 0:e8d7be634e3c 87 coap_res_ptr->payload_len = 10;
Shage 0:e8d7be634e3c 88 coap_res_ptr->payload_ptr = (uint8_t*)joy_msg;
Shage 0:e8d7be634e3c 89
Shage 0:e8d7be634e3c 90 if(received_coap_ptr->token_ptr)
Shage 0:e8d7be634e3c 91 {
Shage 0:e8d7be634e3c 92 if(obs_token_ptr)
Shage 0:e8d7be634e3c 93 {
Shage 0:e8d7be634e3c 94 free(obs_token_ptr);
Shage 0:e8d7be634e3c 95 obs_token_ptr = 0;
Shage 0:e8d7be634e3c 96 }
Shage 0:e8d7be634e3c 97 obs_token_ptr = (uint8_t*)malloc(received_coap_ptr->token_len);
Shage 0:e8d7be634e3c 98 if(obs_token_ptr)
Shage 0:e8d7be634e3c 99 {
Shage 0:e8d7be634e3c 100 memcpy(obs_token_ptr, received_coap_ptr->token_ptr, received_coap_ptr->token_len);
Shage 0:e8d7be634e3c 101 obs_token_len = received_coap_ptr->token_len;
Shage 0:e8d7be634e3c 102 }
Shage 0:e8d7be634e3c 103 }
Shage 0:e8d7be634e3c 104
Shage 0:e8d7be634e3c 105 if(received_coap_ptr->options_list_ptr->observe)
Shage 0:e8d7be634e3c 106 {
Shage 0:e8d7be634e3c 107 coap_res_ptr->options_list_ptr = (sn_coap_options_list_s*)malloc(sizeof(sn_coap_options_list_s));
Shage 0:e8d7be634e3c 108 memset(coap_res_ptr->options_list_ptr, 0, sizeof(sn_coap_options_list_s));
Shage 0:e8d7be634e3c 109 coap_res_ptr->options_list_ptr->observe_ptr = &obs_number;
Shage 0:e8d7be634e3c 110 coap_res_ptr->options_list_ptr->observe_len = 1;
Shage 0:e8d7be634e3c 111 obs_number++;
Shage 0:e8d7be634e3c 112 }
Shage 0:e8d7be634e3c 113
Shage 0:e8d7be634e3c 114 sn_nsdl_send_coap_message(address, coap_res_ptr);
Shage 0:e8d7be634e3c 115
Shage 0:e8d7be634e3c 116 coap_res_ptr->options_list_ptr->observe_ptr = 0;
Shage 0:e8d7be634e3c 117 sn_coap_parser_release_allocated_coap_msg_mem(coap_res_ptr);
Shage 0:e8d7be634e3c 118 return 0;
Shage 0:e8d7be634e3c 119 }
Shage 0:e8d7be634e3c 120
Shage 0:e8d7be634e3c 121 int create_joystick_resource(sn_nsdl_resource_info_s *resource_ptr)
Shage 0:e8d7be634e3c 122 {
Shage 0:e8d7be634e3c 123 static Thread exec_thread(exec_call_thread);
Shage 0:e8d7be634e3c 124 nsdl_create_dynamic_resource(resource_ptr, sizeof(JOY_RES_ID)-1, (uint8_t*)JOY_RES_ID, 0, 0, 1, &joy_resource_cb, SN_GRS_GET_ALLOWED);
Shage 0:e8d7be634e3c 125 return 0;
Shage 0:e8d7be634e3c 126 }