From 2d8667cad15d13e5b03cf4b51ddb63ca355d2af4 Mon Sep 17 00:00:00 2001 From: fros4943 Date: Thu, 15 Jan 2009 13:13:47 +0000 Subject: [PATCH] added simple method for wrapping serial data in SLIP packets --- .../cooja/mspmote/interfaces/SkySerial.java | 26 +++++-- .../java/se/sics/cooja/plugins/SLIP.java | 76 +++++++++++++++++++ 2 files changed, 96 insertions(+), 6 deletions(-) create mode 100644 tools/cooja/java/se/sics/cooja/plugins/SLIP.java diff --git a/tools/cooja/apps/mspsim/src/se/sics/cooja/mspmote/interfaces/SkySerial.java b/tools/cooja/apps/mspsim/src/se/sics/cooja/mspmote/interfaces/SkySerial.java index 8c8b45a91..52f1ef7ca 100644 --- a/tools/cooja/apps/mspsim/src/se/sics/cooja/mspmote/interfaces/SkySerial.java +++ b/tools/cooja/apps/mspsim/src/se/sics/cooja/mspmote/interfaces/SkySerial.java @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: SkySerial.java,v 1.9 2008/12/09 16:58:36 fros4943 Exp $ + * $Id: SkySerial.java,v 1.10 2009/01/15 13:13:47 fros4943 Exp $ */ package se.sics.cooja.mspmote.interfaces; @@ -39,6 +39,7 @@ import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.*; import javax.swing.*; + import org.apache.log4j.Logger; import org.jdom.Element; @@ -48,6 +49,7 @@ import se.sics.mspsim.core.*; import se.sics.cooja.interfaces.Log; import se.sics.cooja.interfaces.SerialPort; import se.sics.cooja.mspmote.SkyMote; +import se.sics.cooja.plugins.SLIP; /** * @author Fredrik Österlind @@ -63,6 +65,7 @@ public class SkySerial extends Log implements SerialPort, USARTListener { private JTextArea logTextPane = null; private USART usart; private JTextField commandField; + private JCheckBox slipCheckbox; private String[] history = new String[50]; private int historyPos = 0; private int historyCount = 0; @@ -186,16 +189,23 @@ public class SkySerial extends Log implements SerialPort, USARTListener { historyCount = (historyCount + 1) % history.length; } historyPos = historyCount; - addToLog("> " + command); - writeString(command); + + if (slipCheckbox.isSelected()) { + addToLog("SLIP> " + command); + command += "\n"; + writeArray(SLIP.asSlip(command.getBytes())); + } else { + addToLog("> " + command); + writeString(command); + } commandField.setText(""); } catch (Exception ex) { System.err.println("could not send '" + command + "':"); ex.printStackTrace(); JOptionPane.showMessageDialog(logTextPane, - "could not send '" + command + "':\n" - + ex, "ERROR", - JOptionPane.ERROR_MESSAGE); + "could not send '" + command + "':\n" + + ex, "ERROR", + JOptionPane.ERROR_MESSAGE); } } else { commandField.getToolkit().beep(); @@ -244,8 +254,12 @@ public class SkySerial extends Log implements SerialPort, USARTListener { }); + slipCheckbox = new JCheckBox("", false); + slipCheckbox.setToolTipText("Wrap data as SLIP"); + commandField.addActionListener(action); sendButton.addActionListener(action); + sendPane.add(BorderLayout.WEST, slipCheckbox); sendPane.add(BorderLayout.CENTER, commandField); sendPane.add(BorderLayout.EAST, sendButton); diff --git a/tools/cooja/java/se/sics/cooja/plugins/SLIP.java b/tools/cooja/java/se/sics/cooja/plugins/SLIP.java new file mode 100644 index 000000000..2d3fd34c2 --- /dev/null +++ b/tools/cooja/java/se/sics/cooja/plugins/SLIP.java @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2009, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: SLIP.java,v 1.1 2009/01/15 13:13:47 fros4943 Exp $ + */ + +package se.sics.cooja.plugins; + +import java.util.ArrayList; + +import org.apache.log4j.Logger; + +public class SLIP { + private static Logger logger = Logger.getLogger(SLIP.class); + + private final static byte SLIP_END = (byte)0300; + private final static byte SLIP_ESC = (byte)0333; + private final static byte SLIP_ESC_END = (byte)0334; + private final static byte SLIP_ESC_ESC = (byte)0335; + + /** + * Wraps packet as SLIP. + * + * @param packet Packet data + */ + public static byte[] asSlip(byte[] packet) { + ArrayList bytes = new ArrayList(); + + bytes.add(SLIP_END); + + for (byte b: packet) { + if (b == SLIP_END) { + bytes.add(SLIP_ESC); + bytes.add(SLIP_ESC_END); + } else if (b == SLIP_ESC) { + bytes.add(SLIP_ESC); + bytes.add(SLIP_ESC_ESC); + } else { + bytes.add(b); + } + } + + bytes.add(SLIP_END); + + byte[] arr = new byte[bytes.size()]; + for (int i=0; i < bytes.size(); i++) { + arr[i] = (bytes.get(i)).byteValue(); + } + return arr; + } +}