Advertisement
djazz

CraneTank - node.js server

Sep 6th, 2012
211
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2.  
  3. console.log('Loading HTTP module...'); var http = require('http');
  4. console.log('Loading File System module...'); var fs = require('fs');
  5. console.log('Loading NXT Bluetooth module...'); var Nxt = require('mindstorms_bluetooth').Nxt;
  6. console.log('Loading WebSocket module...'); var WebSocketServer = require('ws').Server;
  7. console.log('Loading Child Process module...'); var child_process = require('child_process');
  8. console.log('All modules loaded');
  9.  
  10.  
  11.  
  12.  
  13. var mainport = 8082;
  14.  
  15. var tank, crane;
  16.  
  17. console.log('Connecting to NXT devices...');
  18.  
  19.  
  20.  
  21. function closeProcess() {
  22.     tank && tank.stop_program();
  23.     crane && crane.stop_program();
  24.     setTimeout(function () {
  25.         //rfcomm.kill('SIGINT');
  26.         process.exit(0);
  27.     }, 100); // Wait for the NXT to stop the program
  28. };
  29. process.on('SIGINT', closeProcess);
  30.  
  31.  
  32.  
  33. tank = new Nxt('/dev/rfcomm0');
  34. crane = new Nxt('/dev/rfcomm1');
  35.  
  36. setTimeout(function () {
  37.     console.log("Starting programs...");
  38.     tank.start_program("tank.rxe");
  39.     crane.start_program("crane.rxe");
  40. }, 8000);
  41.  
  42.  
  43.  
  44. tank.register_callback('messagewrite', function (data) {
  45.     // Got a write callback
  46. });
  47. tank.register_callback('messageread', function (data) {
  48.     var message = data.slice(5, 4+data[4]);
  49.     //console.log("GOT MESSAGE", message.toString().split(","));
  50.     broadcast(JSON.stringify({
  51.         sensorvalues: message.toString().split(","),
  52.         robotId: 0
  53.     }));
  54. });
  55. tank.register_callback('getbatterylevel', function (data) {
  56.     broadcast(JSON.stringify({
  57.         batterylevel: data.readUInt16LE(3)/1000,
  58.         robotId: 0
  59.     }));
  60. });
  61.  
  62. crane.register_callback('messagewrite', function (data) {
  63.     // Got a write callback
  64. });
  65. crane.register_callback('messageread', function (data) {
  66.     var message = data.slice(5, 4+data[4]);
  67.     //console.log("GOT MESSAGE", message.toString().split(","));
  68.     broadcast(JSON.stringify({
  69.         sensorvalues: message.toString().split(",")
  70.     }));
  71. });
  72. crane.register_callback('getbatterylevel', function (data) {
  73.     broadcast(JSON.stringify({
  74.         batterylevel: data.readUInt16LE(3)/1000,
  75.         robotId: 1
  76.     }));
  77. });
  78.  
  79.  
  80. setInterval(function () {
  81.    
  82.     tank.message_read(0);
  83.     //crane.message_read(0);
  84.    
  85. }, 50);
  86.  
  87. setInterval(function () {
  88.     tank.get_battery_level();
  89.     crane.get_battery_level();
  90. }, 2000);
  91. tank.get_battery_level();
  92. crane.get_battery_level();
  93.  
  94.  
  95. var httpserv = http.createServer(function (req, res) {
  96.     switch(req.url) {
  97.         case '/':
  98.             fs.readFile('remote.html', 'utf8', function (err, data) {
  99.                 res.writeHead(200, {'content-type': 'text/html'});
  100.                 res.end(data);
  101.             });
  102.             break;
  103.         default:
  104.             res.writeHead(404);
  105.             res.end("Greetings programs.\n\n - C.L.U.");
  106.             break;
  107.     }
  108. });
  109. httpserv.listen(mainport, function () {
  110.     console.log("Remote webserver is up on port "+mainport);
  111. });
  112.  
  113.  
  114.  
  115.  
  116. var wss = new WebSocketServer({
  117.     server: httpserv
  118. });
  119.  
  120. var sockets = [];
  121. var lastSentAction = "";
  122.  
  123. var broadcast = function (text) {
  124.     for(var i=0; i < sockets.length; i+=1) {
  125.         if (sockets[i].readyState === 1) {
  126.             sockets[i].send(text);
  127.         }
  128.        
  129.     }
  130. };
  131.  
  132. wss.on('connection', function (ws) {
  133.    
  134.     var remoteAddress = ws._socket.remoteAddress;
  135.     console.log(remoteAddress+" joined");
  136.     sockets.push(ws);
  137.  
  138.     ws.on('message', function (message) {
  139.         var data = JSON.parse(message);
  140.        
  141.         var inbox = data[0];
  142.         var action = data[1];
  143.         var robotId = data[2];
  144.         if (action !== lastSentAction) {
  145.             lastSentAction = action;
  146.             var robot = robotId === 0 ? tank : crane;
  147.             robot.message_write(inbox, new Buffer(action));
  148.             console.log(remoteAddress, action, robotId);
  149.         }
  150.        
  151.        
  152.     });
  153.  
  154.     ws.on('close', function (reasonCode, reasonText) {
  155.         tank.message_write(0, new Buffer("TankStop"));
  156.         crane.message_write(0, new Buffer("TurnStop"));
  157.         crane.message_write(0, new Buffer("TiltStop"));
  158.         crane.message_write(0, new Buffer("ClawStop"));
  159.        
  160.         console.log(remoteAddress+" left");
  161.         var index = sockets.indexOf(ws);
  162.  
  163.         sockets.splice(index, 1);
  164.     });
  165.  
  166.     ws.on('error', function () {
  167.         console.log(remoteAddress+" got error");
  168.         var index = sockets.indexOf(ws);
  169.  
  170.         sockets.splice(index, 1);
  171.     });
  172. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement