Guest User

Untitled

a guest
Nov 25th, 2017
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.83 KB | None | 0 0
  1. var noble = require('noble');
  2. var net = require('net');
  3.  
  4. var PORT = 33333;
  5. // var HOST = '127.0.0.1';
  6. var HOST = '10.8.11.108';
  7.  
  8. var dgram = require('dgram');
  9.  
  10. var wave_service_uuid = '289b473c4d1e11e7b114b2f933d5fe66';
  11. var midi_service_uuid = '03b80e5aede84b33a7516ce34ec4c700';
  12.  
  13. var clients = [];
  14.  
  15. var g_output_char;
  16.  
  17. var quaternion = [1, 0, 0, 0];
  18. var accel = [0, 0, 0];
  19. var gyro = [0, 0, 0];
  20. var magnetometer = [0, 0, 0];
  21.  
  22. var click_count = [0, 0, 0];
  23.  
  24. var OPCODE_QUATERNION = 0x01;
  25. var OPCODE_RAW_DATA = 0x02;
  26. var OPCODE_TAP = 0x03;
  27. var OPCODE_HIT = 0x04;
  28. var OPCODE_CLICK = 0x05;
  29.  
  30. var OPCODE_ACCELEROMETER = 0x01;
  31. var OPCODE_GYROSCOPE = 0x02;
  32. var OPCODE_MAGNETOMETER = 0x03;
  33. var OPCODE_TIMESTAMP = 0x04;
  34.  
  35. var BUTTON_EVENT_DOWN = 0;
  36. var BUTTON_EVENT_UP = 1;
  37. var BUTTON_EVENT_LONG_PRESS = 2;
  38. var BUTTON_EVENT_DOUBLE_CLICK = 3;
  39.  
  40. noble.on('stateChange', function(state) {
  41. console.log('BLE adapter state change: ', state);
  42.  
  43. noble.startScanning([wave_service_uuid, midi_service_uuid]);
  44. });
  45.  
  46. noble.on('discover', function(peripheral) {
  47. console.log('Found device with local name: ' + peripheral.advertisement.localName);
  48. console.log('Advertising the following service uuid\'s: ' + peripheral.advertisement.serviceUuids);
  49.  
  50. noble.stopScanning();
  51.  
  52. // Connect to the first peripheral we find
  53. peripheral.connect(function(error) {
  54. console.log('Connected to peripheral: ' + peripheral.uuid);
  55.  
  56. peripheral.discoverServices(wave_service_uuid, function(error, services) {
  57. console.log('Discovered service:', services[0].uuid);
  58.  
  59. var wave_service = services[0];
  60.  
  61. wave_service.discoverCharacteristics(null, function(error, characteristics) {
  62. console.log('Discovered characteristics:');
  63.  
  64. for(var i in characteristics) {
  65. console.log(' ' + characteristics[i].uuid);
  66. }
  67.  
  68. g_output_char = characteristics[0];
  69.  
  70. // Set up a callback for new incoming data
  71. g_output_char.on('data', on_new_data);
  72.  
  73. g_output_char.subscribe(function(error) {
  74. if(error) {
  75. console.log('Error subscribing to notifications for output characteristic');
  76. return;
  77. }
  78.  
  79. console.log('Enabled notifications for output characteristic');
  80. });
  81.  
  82. wave_ready();
  83. });
  84. });
  85. });
  86. });
  87.  
  88. function enable_quaternion(enable) {
  89. g_output_char.write(new Buffer([OPCODE_QUATERNION, enable]), true, function(error) {
  90. if(error) {
  91. console.log('Error requesting quaternion notifications: ' + error);
  92. return;
  93. }
  94.  
  95. console.log('Requested quaternion notifications');
  96. });
  97. }
  98.  
  99. function enable_raw_data(enable) {
  100. g_output_char.write(new Buffer([OPCODE_RAW_DATA, enable]), true, function(error) {
  101. if(error) {
  102. console.log('Error requesting raw data notifications: ' + error);
  103. return;
  104. }
  105.  
  106. console.log('Requested raw data notifications');
  107. });
  108. }
  109.  
  110. function enable_click(enable) {
  111. g_output_char.write(new Buffer([OPCODE_CLICK, enable]), true, function(error) {
  112. if(error) {
  113. console.log('Error requesting click notifications: ' + error);
  114. return;
  115. }
  116.  
  117. console.log('Requested click notifications');
  118. });
  119. }
  120.  
  121. function on_new_data(data, is_notification) {
  122. var opcode = data.readUInt8(0);
  123.  
  124. switch(opcode) {
  125. case OPCODE_QUATERNION: {
  126. var q0 = data.readFloatLE(1);
  127. var q1 = data.readFloatLE(5);
  128. var q2 = data.readFloatLE(9);
  129. var q3 = data.readFloatLE(13);
  130.  
  131. on_quaternion_data([q0, q1, q2, q3]);
  132.  
  133. break;
  134. }
  135.  
  136. case OPCODE_RAW_DATA: {
  137. var type = data.readUInt8(1);
  138.  
  139. if(type != OPCODE_TIMESTAMP) {
  140. var x = data.readFloatLE(2);
  141. var y = data.readFloatLE(6);
  142. var z = data.readFloatLE(10);
  143.  
  144. on_raw_data(type, [x, y, z]);
  145. } else {
  146. // console.log(data);
  147. // var ts = data.readUInt32LE(2);
  148.  
  149. // on_raw_data(type, ts);z
  150. }
  151.  
  152. break;
  153. }
  154.  
  155. case OPCODE_CLICK: {
  156. var button_id = data.readUInt8(1);
  157. var event = data.readUInt8(2);
  158.  
  159. on_click(button_id, event);
  160.  
  161. break;
  162. }
  163.  
  164. default:
  165. break;
  166. }
  167. }
  168.  
  169. function on_quaternion_data(data) {
  170. // console.log('New quaternion data: ' + data[0] + ' ' + data[1] + ' ' + data[2] + ' ' + data[3]);
  171.  
  172. quaternion = [data[0], data[1], data[2], data[3]];
  173.  
  174. // clients.forEach(function (client) {
  175. // // if (client === sender) return;
  176. // var json = {q0 : data[0], q1 : data[1], q2 : data[2], q3 : data[3]};
  177.  
  178. // client.write(JSON.stringify(json));
  179. // });
  180.  
  181. // var client = dgram.createSocket('udp4');
  182.  
  183. // var buf = new Buffer(16);
  184. // buf.writeFloatLE(data[0], 0);
  185. // buf.writeFloatLE(data[1], 4);
  186. // buf.writeFloatLE(data[2], 8);
  187. // buf.writeFloatLE(data[3], 12);
  188.  
  189. // client.send(buf, 0, buf.length, PORT, HOST, function(error, bytes) {
  190. // if(error) throw error;
  191.  
  192. // client.close();
  193. // })
  194. }
  195.  
  196. function on_raw_data(type, data) {
  197. switch(type) {
  198. case OPCODE_ACCELEROMETER:
  199. // console.log('New accelerometer data: ' + data[0] + ' ' + data[1] + ' ' + data[2]);
  200. accel = [data[0], data[1], data[2]];
  201.  
  202. break;
  203.  
  204. case OPCODE_GYROSCOPE:
  205. // console.log('New gyroscope data: ' + data[0] + ' ' + data[1] + ' ' + data[2]);
  206. gyro = [data[0], data[1], data[2]];
  207.  
  208. break;
  209.  
  210. case OPCODE_MAGNETOMETER:
  211. // console.log('New magnetometer data: ' + data[0] + ' ' + data[1] + ' ' + data[2]);
  212.  
  213. magnetometer = [data[0], data[1], data[2]];
  214. break;
  215.  
  216. case OPCODE_TIMESTAMP:
  217. // console.log('New timestamp: ' + data);
  218. break;
  219.  
  220. default:
  221. break;
  222.  
  223. }
  224. }
  225.  
  226. function on_click(button_id, event) {
  227. // console.log("Received click from button " + button_id + ": " + event);
  228.  
  229. if(event == BUTTON_EVENT_DOWN) {
  230. click_count[button_id-1]++;
  231. }
  232. }
  233.  
  234. function wave_ready() {
  235. enable_click(true);
  236.  
  237. enable_quaternion(true);
  238. enable_raw_data(true);
  239.  
  240. setInterval(function(arg) {
  241.  
  242. clients.forEach(function (client) {
  243. // if (client === sender) return;
  244. var json = {
  245. q0 : quaternion[0],
  246. q1 : quaternion[1],
  247. q2 : quaternion[2],
  248. q3 : quaternion[3],
  249. ax : accel[0],
  250. ay : accel[1],
  251. az : accel[2],
  252. b1 : click_count[0],
  253. b2 : click_count[1],
  254. b3 : click_count[2]
  255. };
  256.  
  257. console.log(json);
  258.  
  259. client.write(JSON.stringify(json));
  260. });
  261. }, 10);
  262. }
  263.  
  264. net.createServer(function (socket) {
  265.  
  266. socket.name = socket.remoteAddress + ":" + socket.remotePort
  267. clients.push(socket);
  268.  
  269. // socket.write("Welcome " + socket.name + "\n");
  270. broadcast(socket.name + " joined the chat\n", socket);
  271.  
  272. socket.on('data', function (data) {
  273. broadcast(socket.name + "> " + data, socket);
  274. });
  275.  
  276. socket.on('end', function () {
  277. clients.splice(clients.indexOf(socket), 1);
  278. broadcast(socket.name + " left the chat.\n");
  279. });
  280.  
  281. function broadcast(message, sender) {
  282. clients.forEach(function (client) {
  283. if (client === sender) return;
  284. client.write(message);
  285. });
  286. process.stdout.write(message)
  287. }
  288.  
  289. }).listen(PORT);
  290.  
  291. // Put a friendly message on the terminal of the server.
  292. console.log("Chat server running at port " * PORT + "\n");
Add Comment
Please, Sign In to add comment