add axes in web view
[scilab.git] / scilab / node / scilab_process.js
1 var spawn = require('child_process').spawn;
2
3 var L = console.log;
4
5 var debug = true;
6 var command_ready = false;
7 var graphic_ready = false;
8
9 L('process id: ' + process.pid);
10 var cmdPort = 10000 + process.pid;
11 var grpPort = 10001 + process.pid;
12 var dspPort = 10002;
13
14 var imagepath;
15 var quitTO = 0;
16 var msgHistory = [];
17
18 //start server to chat with dispatcher
19 var dispatchio = require('socket.io')(dspPort);
20
21 dispatchio.on('connection', function (dspSocket) {
22     //new connection incoming
23     L('dispatchio connection');
24     dspSocket.on('command', function (msg) {
25         L('command (' + process.pid + ') : ' + msg.data);
26         commandio.emit('command', msg);
27     });
28
29     dspSocket.on('callback', function (msg) {
30         graphicio.emit('callback', msg);
31     });
32
33     dspSocket.on('closeWindow', function (msg) {
34         graphicio.emit('closeWindow', msg);
35     });
36
37     dspSocket.on('force_reload', function (msg) {
38         msgHistory = []; //reset history, sciab was closed or has crashed.
39     });
40
41     dspSocket.on('imagepath', function (msg) {
42         imagepath = msg;
43     });
44
45     dspSocket.on('quit', function () {
46         L('quit' + '(' + process.pid + ')');
47
48         //prevent accidental close, wait 10 minutes before really close Scilab.
49         quitTO = setTimeout( function() {
50             L('send quit to Scilab');
51             commandio.emit('command', {data:'quit'});
52             commandio.close();
53             graphicio.close();
54             process.exit(0);
55         }, /*60 * 10 * 1000*/5 * 1000); //5 seconds to test
56     });
57
58     dspSocket.on('reconnection', function () {
59         L('reconnection');
60         clearTimeout(quitTO);
61         quitTO = 0;
62         //resend all gui creation information
63         var size = msgHistory.length;
64         L('history: ' + size);
65         dspSocket.emit("graphic_reconnection", "start");
66         for(var i = 0 ; i < size ; ++i) {
67             //L('%d : %s', i+1, msgHistory[i]);
68             dspSocket.emit('graphic_create', msgHistory[i]);
69             L("history " + i + ": " + msgHistory[i]);
70         }
71         dspSocket.emit("graphic_reconnection", "end");
72     });
73
74     L('open commandio socket');
75     //start command server to chat with Scilab
76     var commandio = require('socket.io')(cmdPort);
77     commandio.on('connection', function (socket) {
78         L('Scilab command connected');
79
80         socket.on('command_end', function () {
81             L('command_end');
82             dspSocket.emit('command_end');
83         });
84
85         socket.on('disconnect', function () {
86             L('scilab command disconnected'+ '(' + process.pid + ')');
87             command_ready = false;
88         });
89
90         //send to server scilab is ready
91         command_ready = true;
92         if(graphic_ready) {
93             msgHistory = []; //reset history, sciab was closed or has crashed.
94             dspSocket.emit('status', {data:'ready'});
95         }
96     });
97
98     //start graphic server to chat with graphic MVC
99     var graphicio = require('socket.io')(grpPort);
100     graphicio.on('connection', function (socket) {
101         L('Scilab graphic connected');
102
103         socket.emit('imagepath', imagepath);
104         socket.on('graphic_create', function (msg) {
105             msgHistory.push(msg);
106             dspSocket.emit('graphic_create', msg);
107         });
108
109         socket.on('graphic_delete', function (msg) {
110             msgHistory.push(msg);
111             dspSocket.emit('graphic_delete', msg);
112         });
113
114         socket.on('graphic_update', function (msg) {
115             msgHistory.push(msg);
116             dspSocket.emit('graphic_update', msg);
117         });
118
119         socket.on('disconnect', function () {
120             msgHistory = []; //reset history, sciab was closed or has crashed.
121
122             L('scilab graphic disconnected'+ '(' + process.pid + ')');
123             graphic_ready = false;
124         });
125
126         //send to server scilab is ready
127         graphic_ready = true;
128         if(command_ready) {
129             dspSocket.emit('status', {data:'ready'});
130         }
131     });
132
133     //launch scilab with init command
134     var app;
135     if(process.platform === "win32") {
136         app = process.env.SCIPATH + "/bin/wscilex.exe";
137     } else {
138         app = process.env.SCIPATH + "/bin/scilab";
139     }
140
141     var addr = 'http://127.0.0.1';
142     var commandaddr = addr + ':' + cmdPort;
143     var graphicaddr = addr + ':' + grpPort;
144
145     var scilabApp = spawn(app, ['-nw', '-commandaddr', commandaddr, '-graphicaddr', graphicaddr]);
146
147     //to debug
148     if(debug) {
149     /*
150         scilabApp.stdout.on('data', function(data) {
151             L('scilab out :' + data.toString());
152         });
153     */
154         scilabApp.stderr.on('data', function(data) {
155             L('scilab err :' + data.toString());
156         });
157     }
158 });