Project

General

Profile

Statistics
| Revision:

root / trunk / code / projects / colonet / client / ColonetServerInterface.java @ 633

History | View | Annotate | Download (18.8 KB)

1 32 gtress
/*
2 539 emarinel
* ColonetServerInterface.java
3
* Gregory Tress
4 32 gtress
*/
5
6
import java.net.*;
7
import java.io.*;
8
import javax.swing.JOptionPane;
9
import javax.swing.JTextArea;
10
11 333 gtress
/**
12
* The Colonet server interface class. This class handles direct communication with the Colonet server. The general
13 527 emarinel
* contract is that this class will encapsulate the process of sending commands and requests to the server and
14
* receiving responses. This class should provide methods to send specific commands and requests so that the
15
* Colonet can easily communicate with the server. When data is received from the server, the ColonetServerInterface
16
* decides how to handle it and in many cases this means simply passing it to the Colonet.
17 333 gtress
* <p>
18
* The motivation is that any number of Colonet-type classes could be designed for different purposes if needed, with
19 527 emarinel
* this class being used by each one for communication.
20 333 gtress
* For instance, if an application is designed which only monitors sensor data, or that only has access to
21
* the task queue, etc., the application could easily plug in to this interface.
22 527 emarinel
* The Colonet should generally not contain communication-specific code or Strings of command and request data.
23 333 gtress
* If additional commands and requests are needed for permanent implementation, it is suggested that convenience
24
* classes be created in the ColonetServerInterface and called from the Colonet.
25
*
26 527 emarinel
* @author Gregory Tress
27 333 gtress
*/
28 527 emarinel
public class ColonetServerInterface
29 32 gtress
{
30 531 emarinel
/*        Old packet structure:
31 527 emarinel

32 539 emarinel
                COMMAND PACKET STRUCTURE
33
        1:        SEND_TO_ROBOT
34
        2:        # of robot, or GLOBAL_DEST
35
        3:        COLONET_COMMMAND
36
        4:        message code (i.e. ORB_SET)
37
        5:        any data, as many that fit in the packet
38 527 emarinel

39 32 gtress
        REQUEST PACKET STRUCTURE
40 539 emarinel
        1:        REQUEST_FROM_SERVER
41
        2:        # of robot
42
        3:        COLONET_REQUEST
43
        4:        ???
44 527 emarinel

45 539 emarinel
        9/12/07 New server interface structure
46
                Client will no longer send full robot packets to the server.
47
                Commands will be defined as necessary.
48 32 gtress
        */
49 527 emarinel
50 76 gtress
        //General Colonet Interface
51 32 gtress
        public static final String SEND_TO_ROBOT = "0";
52 67 gtress
        public static final String REQUEST_FROM_SERVER = "1";
53 32 gtress
        public static final String RESPONSE_TO_CLIENT_REQUEST = "2";
54 76 gtress
        public static final String REQUEST_BOM_MATRIX = "144";
55 155 gtress
        public static final String REQUEST_XBEE_IDS = "145";
56 527 emarinel
57 32 gtress
        public static final String COLONET_COMMAND = "13"; //0x0D
58
        public static final String COLONET_REQUEST = "14"; //0x0E
59
        public static final String CORONET_RESPONSE = "15"; //0x0F
60 76 gtress
        public static final String GLOBAL_DEST = "200";
61 459 gtress
        public static final String CLIENT_REQUEST_ROBOT_POSITIONS = "86";
62
        public static final String CLIENT_ASSIGN_ROBOT_ID = "87";
63 470 gtress
        public static final String MOVE_TO_ABSOLUTE_POSITION = "83"; //0x53
64 527 emarinel
65 107 gtress
        //Queue instructions
66
        public static final String COLONET_QUEUE = "100";
67 527 emarinel
        public static final String QUEUE_UPDATE = "101";
68 107 gtress
        public static final String QUEUE_ADD = "102";
69
        public static final String QUEUE_REMOVE = "103";
70
        public static final String QUEUE_REORDER = "104";
71 527 emarinel
72 32 gtress
        //Use BATTERY to request battery level
73
        public static final String BATTERY = "56"; //0x38
74 527 emarinel
75 32 gtress
        //MOTORS
76
        public static final String MOTORS_INIT = "23"; //0x17
77
        public static final String MOTOR1_SET = "24"; //0x18
78
        public static final String MOTOR2_SET = "25"; //0x19
79
        public static final String MOTORS_OFF = "26"; //0x1A
80
        public static final String MOVE = "27"; //0x1B
81 39 gtress
        public static final String MOVE_AVOID = "28"; //0x1C
82 586 gtress
        public static final String MOVE_R = "29"; //0x1D
83
        public static final String MOVE_L = "30"; //0x1E
84
        public static final String MOVE_F = "31"; //0x1F
85
        public static final String MOVE_B = "32"; //0x1G
86 527 emarinel
87 32 gtress
        //BUZZER
88
        public static final String BUZZER_INIT = "0"; //0x00
89
        public static final String BUZZER_SET_VAL = "1"; //0x01
90
        public static final String BUZZER_SET_FREQ = "2"; //0x02
91
        public static final String BUZZER_CHIRP = "3"; //0x03
92
        public static final String BUZZER_OFF = "4"; //0x04
93
94
        //ORB
95
        public static final String ORB_INIT = "12"; //0x0C
96
        public static final String ORB_SET = "13"; //0x0D
97
        public static final String ORB_SET_COLOR = "14"; //0x0E
98
        public static final String ORB_DISABLE = "15"; //0x0F
99
        public static final String ORB_ENABLE = "16"; //0x10
100
        public static final String ORB_SET_DIO = "17"; //0x11
101
        public static final String LED_INIT = "18"; //0x12
102
        public static final String LED_USER = "19"; //0x13
103
        public static final String ORB_SET_NUM_NS = "20"; //0x14
104
        public static final String ORB_SET_NUM = "21"; //0x15
105
        public static final String ORB_SEND = "22"; //0x16
106
107 539 emarinel
        Colonet colonet;        //save reference to the entire applet locally
108 32 gtress
        Socket socket;
109
        OutputStreamWriter out;
110
        BufferedReader reader;
111 76 gtress
        DataListener dataListener;
112 527 emarinel
113 32 gtress
        /*
114 539 emarinel
        * FUNCTION IMPLEMENTATIONS
115 32 gtress
        */
116
117 333 gtress
        /**
118
        * Constructs a new ColonetServerInterface. When constructing a ColonetServerInterface, a valid Colonet object
119 527 emarinel
        * reference must be provided to ensure that data is routed correctly.
120 333 gtress
        *
121 527 emarinel
        * @param colonet The Colonet object to save locally. This reference cannot be changed once the
122 539 emarinel
        *                ColonetSreverInterface has been contsructed.
123 333 gtress
        * @throws NullPointerException if colonet is null
124
        *
125
        */
126 136 gtress
        public ColonetServerInterface (Colonet colonet) {
127
                this.colonet = colonet;
128 76 gtress
                dataListener = new DataListener();
129 32 gtress
        }
130
131
        public Socket getSocket () {
132
                return socket;
133
        }
134 527 emarinel
135 32 gtress
        public OutputStreamWriter getOutputStreamWriter () {
136
                return out;
137
        }
138 527 emarinel
139 32 gtress
        public BufferedReader getBufferedReader () {
140
                return reader;
141
        }
142 527 emarinel
143 32 gtress
        public boolean isReady () {
144 333 gtress
                if (socket == null || out == null || reader == null)
145
                        return false;
146
                if (!socket.isConnected() || socket.isClosed() || socket.isInputShutdown() || socket.isOutputShutdown())
147
                        return false;
148 32 gtress
                return true;
149
        }
150 527 emarinel
151 32 gtress
        public boolean isInputReady () {
152
                try {
153
                        if (reader.ready()) return true;
154
                } catch (Exception e) {
155
                        return false;
156
                }
157
                return false;
158
        }
159 527 emarinel
160 420 gtress
        public String getLine () throws IOException {
161
                return reader.readLine();
162 39 gtress
        }
163 527 emarinel
164 32 gtress
        /**
165
         * Create socket connection to Colonet server.
166 333 gtress
         * If successful, start thread for listening for incoming data.
167 32 gtress
         */
168
        public void connect (String strHost, String strPort) {
169
                //make sure hostname and port are valid
170
                if (strHost.equals("") || strPort.equals("")) {
171
                        err("Please enter a hostname and port.");
172
                        return;
173
                }
174
                int port = 0;
175
                try {
176
                        port = Integer.parseInt(strPort);
177
                } catch (Exception e) {
178
                        err("Invalid port");
179
                        return;
180
                }
181 527 emarinel
182 181 gtress
                //make sure we aren't already connected.
183 32 gtress
                if (socket != null && socket.isConnected()) {
184 181 gtress
                        return;
185 32 gtress
                }
186 527 emarinel
187 32 gtress
                try {
188
                        socket = new Socket(strHost, port);
189 420 gtress
                        socket.setKeepAlive(true);
190 32 gtress
                } catch (UnknownHostException e) {
191
                        err("Unknown Host Exception");
192
                        return;
193
                } catch (IOException e) {
194 542 emarinel
                        err("Failed to connect to " + strHost + ".\n");
195 32 gtress
                        return;
196
                } catch (java.security.AccessControlException e) {
197 585 gtress
                        err("Permission denied.\n\n"
198 542 emarinel
                                + "You may only connect to the server from which this applet was loaded.");
199 32 gtress
                        return;
200
                }
201 542 emarinel
202 32 gtress
                if (socket == null || !socket.isConnected()) {
203
                        return;
204
                }
205
                try {
206
                        out = new OutputStreamWriter(socket.getOutputStream());
207
                        reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
208
                } catch (IOException e) {
209
                        warn("Could not get transfer streams from socket connection.");
210
                }
211 542 emarinel
212 76 gtress
                dataListener.start();
213 32 gtress
        }
214 527 emarinel
215 420 gtress
        public void disconnect () {
216 542 emarinel
                try {
217
                        if (reader != null) {
218
                                reader.close();
219 539 emarinel
                        }
220 542 emarinel
                        if (out != null) {
221
                                out.close();
222
                        }
223 549 gtress
                        colonet.disconnect();
224 542 emarinel
                } catch (IOException e) {
225
                }
226 420 gtress
        }
227 527 emarinel
228 107 gtress
        /*
229 517 gtress
        * Send a general String to the OutputStream.
230 107 gtress
        */
231 333 gtress
        private void sendString (String s) {
232 32 gtress
                //make sure we can send
233
                if (!this.isReady()) {
234 585 gtress
                        colonet.getInfoPanel().append("Could not send data.\n");
235 32 gtress
                        return;
236
                }
237
                //send packet
238
                try {
239 590 gtress
                        Thread.sleep(100);         //pause to be safe
240 107 gtress
                        out.write(s);
241 32 gtress
                        out.flush();
242
                } catch (IOException e) {
243 585 gtress
                        colonet.getInfoPanel().setText("Could not send data.\n");
244 107 gtress
                } catch (InterruptedException e) {
245 67 gtress
                }
246 32 gtress
        }
247 527 emarinel
248 333 gtress
        /**
249
        * General send-to-server method. This method is used by other command methods, which are usually convenience
250 527 emarinel
        * methods that simply specify arguments to this method. A command consists of a String which holds integers
251
        * separated by spaces. This method should not be used directly unless you know the format of the particular
252
        * command you are sending. If implementing a particular command for permanent use, it is recommended that
253 333 gtress
        * you create a new wrapper method specific to that command in the ColonetServerInterface file.
254
        *
255
        * Note that no checking is performed in this method to ensure the correct formatting of the String arguments.
256
        * If malformed commands or robot numbers are specified, the behavior of the request at the server will be
257 527 emarinel
        * undefined and could result in server failure.
258 333 gtress
        *
259
        * @param s The command String in its correct format. The format of a command String is ultimately specified
260 527 emarinel
        * by the Colonet server application and may change.
261
        * @param robotNumber The number of the robot that is the subject of the command, if any. The robot number
262
        * is specified as a single integer in a String. If the command does not have a single robot subject, this
263
        * argument can be null or an empty String, whichever is convenient.
264 333 gtress
        */
265 527 emarinel
        public void sendData (String s, String robotNumber) {
266 107 gtress
                //create packet
267
                String packet = "";
268
                packet += ColonetServerInterface.SEND_TO_ROBOT;
269 333 gtress
                if (robotNumber != null)
270 517 gtress
                        packet += " " + robotNumber;
271 107 gtress
                packet += " " + ColonetServerInterface.COLONET_COMMAND;
272 539 emarinel
                packet += " " + s;        //add         the command code here
273 107 gtress
                packet += "\n";
274
                sendString(packet);
275 585 gtress
                //colonet.getInfoPanel().append("S:" + packet);
276 107 gtress
        }
277 527 emarinel
278 333 gtress
        /**
279
        * General request-from-server method. This method is used by other request methods, which are usually convenience
280 527 emarinel
        * methods that simply specify arguments to this method. A request consists of a String which holds integers
281
        * separated by spaces. This method should not be used directly unless you know the format of the particular
282 333 gtress
        * request you are making. If implementing a particular request, it is recommended that you create a new method
283
        * specific to that request in the ColonetServerInterface file.
284
        *
285
        */
286
        private void sendRequest (String s, String robotNumber) {
287 32 gtress
                //create packet
288 107 gtress
                String packet = "";
289
                packet += ColonetServerInterface.REQUEST_FROM_SERVER;
290 270 gtress
                packet += " " + robotNumber;
291 539 emarinel
                packet += " " + s;        //add         the command code here
292 32 gtress
                packet += "\n";
293 107 gtress
                sendString(packet);
294 32 gtress
        }
295 527 emarinel
296
        /**
297
        * Sends a request to the server to report the entire BOM sensor matrix. The server will reply at its convenience.
298 333 gtress
        * No guarantee is made (end-to-end or otherwise) that the server will respond in a timely manner or at all
299
        * to any individual request.
300
        */
301 107 gtress
        public void sendSensorDataRequest () {
302
                sendRequest(ColonetServerInterface.REQUEST_BOM_MATRIX, "");
303
        }
304 527 emarinel
305 333 gtress
        /**
306 527 emarinel
        * Sends a request to the server to report a list of XBee IDs. The server will reply at its convenience.
307 333 gtress
        * The purpose of having this list is to ensure that robots are properly identified for control purposes.
308 527 emarinel
        * This keeps robot identification consistent between sessions and prevents arbitrary assignment.
309 333 gtress
        * No guarantee is made (end-to-end or otherwise) that the server will respond in a timely manner or at all
310
        * to any individual request.
311
        *
312
        * @see Colonet#parseXBeeIDs(String)
313
        */
314 136 gtress
        public void sendXBeeIDRequest () {
315
                sendRequest(ColonetServerInterface.REQUEST_XBEE_IDS, "");
316
        }
317 527 emarinel
318 333 gtress
        /**
319 527 emarinel
        * Sends a battery request for a specific robot to the server. The server will reply at its convenience.
320
        * Behavior is undefined if an invalid robot number is specified. The server will probably not respond in
321 333 gtress
        * this case.
322
        * No guarantee is made (end-to-end or otherwise) that the server will respond in a timely manner or at all
323
        * to any individual request.
324
        *
325
        * @param robotNum The number of the robot for which we are requesting the battery. Note that this value
326
        * is sent as-is to the server. No mapping to or from XBee IDs is performed. The contract for this is
327
        * currently undefined.
328
        * @see Colonet#parseBattery(String)
329
        */
330 270 gtress
        public void sendBatteryRequest (int robotNum) {
331 425 gtress
                //create packet
332
                String packet = "";
333
                packet += ColonetServerInterface.SEND_TO_ROBOT;
334
                packet += " " + robotNum;
335
                packet += " " + ColonetServerInterface.COLONET_REQUEST;
336 539 emarinel
                packet += " " + ColonetServerInterface.BATTERY;         //add        the command code here
337 425 gtress
                packet += "\n";
338
                sendString(packet);
339 567 gtress
                //System.out.println("Sent battery request: " + packet);
340 270 gtress
        }
341 527 emarinel
342 459 gtress
        /**
343
        * Requests a list of all robot positions and correspondind robot IDs.
344
        */
345
        public void sendPositionRequest () {
346
                sendRequest(ColonetServerInterface.CLIENT_REQUEST_ROBOT_POSITIONS, "");
347
        }
348 527 emarinel
349 459 gtress
        /**
350
        * Send a robot ID assignment update to store on the server.
351
        */
352
        public void sendIDAssignment (int oldID, int newID) {
353
                String packet = "";
354
                packet += ColonetServerInterface.REQUEST_FROM_SERVER;
355 522 gtress
                packet += " " + CLIENT_ASSIGN_ROBOT_ID;
356 459 gtress
                packet += " " + oldID + " " + newID;
357
                packet += "\n";
358
                sendString(packet);
359
        }
360 527 emarinel
361
        /**
362 470 gtress
        * Order a robot to move to an absolute coordinate point.
363
        */
364
        public void sendAbsoluteMove (int id, int x, int y) {
365 539 emarinel
                        sendData(MOVE_TO_ABSOLUTE_POSITION + " " + x + " " + y, "" + id);
366 470 gtress
        }
367 527 emarinel
368 107 gtress
        /*
369 539 emarinel
        * Queue management
370 107 gtress
        */
371 333 gtress
        private void sendQueueInstruction (String inst) {
372 107 gtress
                String packet = "";
373
                packet += ColonetServerInterface.COLONET_QUEUE;
374
                packet += " " + inst;
375
                packet += "\n";
376
                sendString(packet);
377
        }
378 527 emarinel
379 333 gtress
        /**
380 527 emarinel
        * Notifies the Colonet server to add a task to the current task queue. The Colonet server holds the canonical
381 333 gtress
        * task queue. Any applet can send tasks to add to the queue. Local copies of the queue in the applet are for
382
        * display purposes only, and are not authoritative when adding tasks. All clients send additions asynchronously,
383 527 emarinel
        * and as a result no guarantee is made that a task will be added in the specificed location in the queue or at
384 333 gtress
        * all. If an invalid position is specified, the task will probably not be added to the queue and may cause
385
        * server failure. Due to the asynchronous nature of the queue, we cannot easily account for concurrent
386
        * modification failures on the client side.
387
        *
388 527 emarinel
        * @param pos The position in the queue at which we would like the task to be placed. Note that this is not
389 333 gtress
        * guaranteed. Invalid positions may cause the task to be discarded at the server.
390 527 emarinel
        * @param data The String containing the command code(s) for the task and any arguments necessary to fully
391 333 gtress
        * define the behavior of the task. This format is currently not specified. In the future, the canonical format
392
        * of the data String will ultimately be defined by the Colonet server.
393
        * @param description A String that contains a description of the task. This will be the message displayed to
394 527 emarinel
        * the user when information about the task is requested.
395 333 gtress
        */
396 107 gtress
        public void sendQueueAdd (int pos, String data, String description) {
397
                String packet = "";
398
                packet += ColonetServerInterface.QUEUE_ADD;
399
                packet += " " + pos;
400
                packet += " " + data;
401
                packet += " [" + description + "]";
402
                packet += "\n";
403
                sendQueueInstruction(packet);
404
        }
405 527 emarinel
406 333 gtress
        /**
407 527 emarinel
        * Notifies the Colonet server to remove a task from the current task queue. The Colonet server holds the canonical
408 333 gtress
        * task queue. Any applet can remove a task from the queue. Local copies of the queue in the applet are for
409
        * display purposes only, and are not authoritative when removing tasks. All clients remove tasks asynchronously,
410 527 emarinel
        * and as a result no guarantee is made that the correct task will actually be removed.
411 333 gtress
        * If an invalid position is specified, the state of the queue is undefined and server failure may result.
412
        * Due to the asynchronous nature of the queue, we cannot easily account for concurrent
413
        * modification failures on the client side.
414
        *
415 527 emarinel
        * @param pos The position in the queue at which we would like the task to be removed. Note that this is not
416 333 gtress
        * guaranteed. Invalid positions may result in a corrupted queue.
417
        */
418 107 gtress
        public void sendQueueRemove (int pos) {
419
                String packet = "";
420
                packet += ColonetServerInterface.QUEUE_REMOVE;
421
                packet += " " + pos;
422
                packet += "\n";
423
                sendQueueInstruction(packet);
424
        }
425 32 gtress
426 333 gtress
        /**
427 527 emarinel
        * Notifies the Colonet server to reorder tasks in the current task queue. The Colonet server holds the canonical
428 333 gtress
        * task queue. Any applet can reorder tasks in the queue. Local copies of the queue in the applet are for
429
        * display purposes only, and are not authoritative when reordering tasks. All clients reorder tasks asynchronously,
430 527 emarinel
        * and as a result no guarantee is made that the correct tasks will actually be reordered.
431 333 gtress
        * If an invalid position is specified, the state of the queue is undefined and server failure may result.
432
        * Due to the asynchronous nature of the queue, we cannot easily account for concurrent
433
        * modification failures on the client side.
434
        *
435
        * @param pos1 The queue position of a task which we would like to reorder.
436
        * @param pos2 The queue position of a task which we would like to reorder.
437
        */
438 107 gtress
        public void sendQueueReorder (int pos1, int pos2) {
439
                String packet = "";
440
                packet += ColonetServerInterface.QUEUE_REORDER;
441
                packet += " " + pos1;
442
                packet += " " + pos2;
443
                packet += "\n";
444
                sendQueueInstruction(packet);
445
        }
446 32 gtress
447 136 gtress
        public void sendQueueUpdate () {
448
                sendQueueInstruction(ColonetServerInterface.QUEUE_UPDATE);
449
        }
450 527 emarinel
451 32 gtress
        /**
452
         * Display informational message box on the screen. Used for casual communicaton to the user.
453
         * @param text Text to display
454
         */
455 35 gtress
        public void msg (String text) {
456 470 gtress
                JOptionPane.showMessageDialog(colonet, text, "Colonet", JOptionPane.INFORMATION_MESSAGE);
457 32 gtress
        }
458 527 emarinel
459 32 gtress
        /**
460
         * Display warning message box on the screen. Used for minor alerts or exceptions.
461
         * @param text Text to display
462
         */
463 35 gtress
        public void warn (String text) {
464 470 gtress
                JOptionPane.showMessageDialog(colonet, text, "Colonet", JOptionPane.WARNING_MESSAGE);
465 32 gtress
        }
466 527 emarinel
467 32 gtress
        /**
468
         * Display error message box on the screen. Used for major errors or exceptions in the program.
469
         * @param text Text to display
470
         */
471 35 gtress
        public void err (String text) {
472 470 gtress
                JOptionPane.showMessageDialog(colonet, text, "Colonet", JOptionPane.ERROR_MESSAGE);
473 32 gtress
        }
474 527 emarinel
475
476 76 gtress
        /*
477 539 emarinel
        * DataListener thread.
478 76 gtress
        *
479
        */
480
        class DataListener extends Thread {
481 545 gtress
                final int DATALISTENER_DELAY = 122;
482 527 emarinel
483 76 gtress
                public DataListener () {
484
                        super("Colonet DataListener");
485
                }
486 527 emarinel
487 76 gtress
                public void run () {
488
                        String line;
489 527 emarinel
                        while (true) {
490 76 gtress
                                try {
491 420 gtress
                                        line = reader.readLine();
492 539 emarinel
                                        if (line == null) {
493
                                                throw new IOException();
494
                                        }
495 420 gtress
                                        parseData(line);
496 76 gtress
                                        Thread.sleep(DATALISTENER_DELAY);
497
                                } catch (InterruptedException e) {
498
                                        return;
499 420 gtress
                                } catch (IOException e) {
500 539 emarinel
                                        disconnect();
501
                                        return;
502 420 gtress
                                }
503 76 gtress
                        }
504
                }
505 527 emarinel
506 76 gtress
                public void parseData (String line) {
507 333 gtress
                        // Sensor Matrix
508 136 gtress
                        if (line.startsWith(ColonetServerInterface.RESPONSE_TO_CLIENT_REQUEST + " " +
509
                                ColonetServerInterface.REQUEST_BOM_MATRIX))
510
                                colonet.parseMatrix(line);
511 270 gtress
                        // Task Queue
512 155 gtress
                        else if (line.startsWith(ColonetServerInterface.COLONET_QUEUE))
513 136 gtress
                                colonet.parseQueue(line);
514 270 gtress
                        // XBee IDs
515 155 gtress
                        else if (line.startsWith(ColonetServerInterface.RESPONSE_TO_CLIENT_REQUEST + " " +
516 136 gtress
                                ColonetServerInterface.REQUEST_XBEE_IDS))
517
                                colonet.parseXBeeIDs(line);
518 270 gtress
                        // Battery
519
                        else if (line.startsWith(ColonetServerInterface.RESPONSE_TO_CLIENT_REQUEST + " " +
520
                                ColonetServerInterface.BATTERY))
521
                                colonet.parseBattery(line);
522 459 gtress
                        // Robot Positions
523
                        else if (line.startsWith(ColonetServerInterface.RESPONSE_TO_CLIENT_REQUEST + " " +
524
                                ColonetServerInterface.CLIENT_REQUEST_ROBOT_POSITIONS))
525
                                colonet.parsePositions(line);
526 333 gtress
                        // Unknown type
527 510 gtress
                        else {
528 567 gtress
                                System.out.println("Got unknown data: " + line + "\n");
529 510 gtress
                        }
530 76 gtress
                }
531
        }
532 420 gtress
}