Statistics
| Branch: | Revision:

gazetk / DesktopConnector / DesktopConnector.js @ 908a231e

History | View | Annotate | Download (5.648 KB)

1
var net = require('net');
2
var ws = require("nodejs-websocket");
3

    
4
var HOST = '127.0.0.1';
5
var PORT = 6555;
6
var connected = false;
7
var client = new net.Socket();
8

    
9
var connectionManager = [];
10
var connectionId = 0;
11
var websocket_server = null;
12

    
13
var eyeTracker = "";
14
if (process.argv.length == 2) {
15

    
16
        console.log("Start the server with --tracker=smi or --tracker=mygaze or --tracker=eyetribe");
17
        process.exit();
18

    
19
} else if (process.argv.length > 2) {
20
        process.argv.forEach(function(val, index, array) {
21

    
22
                if (val.indexOf("tracker") > -1) {
23
                        eyeTracker = val.split("=")[1];
24
                }
25

    
26
        });
27
}
28

    
29
if (eyeTracker == "" || eyeTracker == undefined) {
30
        console.log("tracker was not set - exiting.");
31
        process.exit();
32
}
33

    
34
console.log("Tracker is " + eyeTracker);
35

    
36
function createServer() {
37
        websocket_server = ws.createServer(function(conn) {
38
                conn.on("text", function(str) {
39

    
40

    
41
                        var senderID;
42
                        for (var c in connectionManager) {
43
                                //console.log(c+"{__}"+position);
44
                                if (conn == connectionManager[c].conn) {
45
                                        senderID = connectionManager[c].id;
46
                                }
47
                        }
48

    
49
                        console.log("Message from connection with id:" + senderID + " : \"" + str + "\"");
50
                        if (str.indexOf("TYPE") > -1) {
51
                                console.log("typestring: " + str);
52
                                var clientType = str.split(':');
53
                                //connectionManager[connectionId] = new Array();
54
                                console.log("type = " + clientType[1]);
55

    
56
                                for (var c in connectionManager) {
57
                                        //console.log("Sending SMI Data: "+str);
58
                                        if (connectionManager[c]['conn'] == conn) {
59
                                                connectionManager[c]['type'] = clientType[1];
60
                                        }
61
                                }
62

    
63

    
64
                        }
65

    
66
                        if (eyeTracker == "smi") {
67
                                try {
68
                                        for (var c in connectionManager) {
69
                                                console.log("Sending SMI Data: " + str);
70
                                                if (connectionManager[c]['type'] == "browser") {
71
                                                        connectionManager[c]['conn'].sendText(str);
72
                                                }
73
                                        }
74
                                } catch (err) {
75
                                        console.log("error in websocketserver: ");
76
                                        console.log("error at line:" + err.lineNumber);
77
                                        console.log("error:" + err);
78
                                        console.log("error at message:" + data);
79
                                        console.log("trying to establish new connection");
80
                                        createServer();
81
                                }
82

    
83

    
84
                        }
85
                        if (eyeTracker == "mygaze") {
86
                                try {
87
                                        for (var c in connectionManager) {
88
                                                console.log("Sending myGaze Data: " + str);
89
                                                if (connectionManager[c]['type'] == "browser") {
90
                                                        connectionManager[c]['conn'].sendText(str);
91
                                                }
92
                                        }
93
                                } catch (err) {
94
                                        console.log("error in websocketserver: ");
95
                                        console.log("error at line:" + err.lineNumber);
96
                                        console.log("error:" + err);
97
                                        console.log("error at message:" + data);
98
                                        console.log("trying to establish new connection");
99
                                        createServer();
100
                                }
101

    
102

    
103
                        }
104
                        if (eyeTracker == "eyetribe") {
105
                                //send the message from the browser directly to the eyetracker
106
                                client.write(str);
107
                        }
108
                });
109

    
110
                        conn.on('error', function(er) {
111
  // The error won't crash the process, but what it does is worse!
112
  // Though we've prevented abrupt process restarting, we are leaking
113
  // resources like crazy if this ever happens.
114
  // This is no better than process.on('uncaughtException')!
115
  console.log(eyeTracker +" disconnected. ERRORMESSAGE: ", er.message);
116
});
117

    
118

    
119
                conn.on("close", function(code, reason) {
120
                        for (var c in connectionManager) {
121
                                //console.log(c+"{__}"+position);
122
                                if (conn == connectionManager[c].conn) {
123
                                        console.log("connection '" + c + "' disconnected.");
124
                                        delete connectionManager[c];
125
                                }
126
                        }
127
                });
128
        }).listen(6777);
129

    
130

    
131

    
132
        websocket_server.on("connection", function(conn) {
133
                connectionManager[connectionId] = [];
134
                connectionManager[connectionId].conn = conn;
135
                connectionManager[connectionId].id = connectionId;
136
                console.log("A new client connected with id: " + connectionId);
137
                connectionId++;
138
        });
139

    
140
}
141

    
142

    
143

    
144
if (eyeTracker == "eyetribe") {
145
        //Heartbeat timer
146
        setInterval(function() {
147
                if (connected) {
148
                        sendHeartbeat(client);
149
                }
150
        }, 250);
151
        client.connect(PORT, HOST, function() {
152

    
153
                console.log('Websocket connected successfully to tcp server(EyeTracker): ' + HOST + ':' + PORT);
154
                connected = true;
155

    
156
                //check the eyetracker status
157
                //client.write('{"category": "tracker","request": "get","values": ["push", "iscalibrated" ]}');
158
                //client.write('{"category": "tracker","request": "set","values": {"push": true,"version": 1}}');
159

    
160
                //client.write('{"category": "tracker","request" : "get","values": [ "push", "iscalibrated" ]}');
161
        });
162
} else if (eyeTracker == "smi") {
163
        console.log('Waiting for messages from SMI EyeTracker on 127.0.0.1:6777');
164

    
165
} else if (eyeTracker == "mygaze") {
166
        console.log('Waiting for messages from myGaze EyeTracker on 127.0.0.1:6777');
167

    
168
}
169

    
170

    
171
//as soon as the websocket receives any data from the eyetracker it is forwarded to the browser
172
client.on('data', function(data) {
173

    
174
        try {
175
                for (var c in connectionManager) {
176
                        console.log("Sending EyeTrackingData to Browser: "+data);
177

    
178
                        connectionManager[c]['conn'].sendText(data);
179

    
180
                }
181
        } catch (err) {
182
                console.log("error in websocketserver: ");
183
                console.log("error at line:" + err.lineNumber);
184
                console.log("error:" + err);
185
                console.log("error at message:" + data);
186
                console.log("trying to establish new connection");
187
                createServer();
188
        }
189
        // Close the client socket completely
190
        //client.destroy();    
191
});
192

    
193
// Add a 'close' event handler for the client socket
194
client.on('close', function() {
195
        connected = false;
196
        console.log('EyeTracker Disconnected.');
197
        createServer();
198
        
199
});
200

    
201
function sendHeartbeat(socket) {
202
        socket.write("{\"category\":\"heartbeat\",\"request\":null}");
203
        //console.log('Heartbeat sent.');        
204
}
205

    
206

    
207

    
208
try {
209
        createServer();
210
} catch (err) {
211
        console.log("error in websocketserver: ");
212
        console.log("error at line:" + err.lineNumber);
213
        console.log("error:" + err);
214
        console.log("error at message:" + data);
215
        console.log("trying to establish new connection");
216
        createServer();
217
}