diff --git a/tools/cooja/config/cooja_default.config b/tools/cooja/config/cooja_default.config index c9eb798a2..ef177ccf7 100644 --- a/tools/cooja/config/cooja_default.config +++ b/tools/cooja/config/cooja_default.config @@ -28,7 +28,7 @@ se.sics.cooja.contikimote.interfaces.ContikiVib.EXTERNAL_INTERRUPT_bool = true se.sics.cooja.contikimote.interfaces.ContikiCFS.CONSUMPTION_PER_WRITTEN_CHAR_mQ = 2 se.sics.cooja.contikimote.interfaces.ContikiCFS.CONSUMPTION_PER_READ_CHAR_mQ = 1 -se.sics.cooja.contikimote.ContikiMoteType.MOTE_INTERFACES = se.sics.cooja.interfaces.Position se.sics.cooja.interfaces.Battery se.sics.cooja.contikimote.interfaces.ContikiVib se.sics.cooja.contikimote.interfaces.ContikiMoteID se.sics.cooja.contikimote.interfaces.ContikiRS232 se.sics.cooja.contikimote.interfaces.ContikiBeeper se.sics.cooja.contikimote.interfaces.ContikiIPAddress se.sics.cooja.contikimote.interfaces.ContikiRadio se.sics.cooja.contikimote.interfaces.ContikiButton se.sics.cooja.contikimote.interfaces.ContikiPIR se.sics.cooja.contikimote.interfaces.ContikiClock se.sics.cooja.contikimote.interfaces.ContikiLED se.sics.cooja.contikimote.interfaces.ContikiLog se.sics.cooja.contikimote.interfaces.ContikiCFS se.sics.cooja.interfaces.Mote2MoteRelations +se.sics.cooja.contikimote.ContikiMoteType.MOTE_INTERFACES = se.sics.cooja.interfaces.Position se.sics.cooja.interfaces.Battery se.sics.cooja.contikimote.interfaces.ContikiVib se.sics.cooja.contikimote.interfaces.ContikiMoteID se.sics.cooja.contikimote.interfaces.ContikiRS232 se.sics.cooja.contikimote.interfaces.ContikiBeeper se.sics.cooja.contikimote.interfaces.ContikiIPAddress se.sics.cooja.contikimote.interfaces.ContikiRadio se.sics.cooja.contikimote.interfaces.ContikiButton se.sics.cooja.contikimote.interfaces.ContikiPIR se.sics.cooja.contikimote.interfaces.ContikiClock se.sics.cooja.contikimote.interfaces.ContikiLED se.sics.cooja.contikimote.interfaces.ContikiCFS se.sics.cooja.interfaces.Mote2MoteRelations se.sics.cooja.contikimote.ContikiMoteType.C_SOURCES = se.sics.cooja.GUI.MOTETYPES = se.sics.cooja.motes.DisturberMoteType se.sics.cooja.contikimote.ContikiMoteType se.sics.cooja.GUI.PLUGINS = se.sics.cooja.plugins.VisState se.sics.cooja.plugins.VisBattery se.sics.cooja.plugins.VisTraffic se.sics.cooja.plugins.LogListener se.sics.cooja.plugins.MoteInformation se.sics.cooja.plugins.MoteInterfaceViewer se.sics.cooja.plugins.VariableWatcher se.sics.cooja.plugins.EventListener se.sics.cooja.plugins.RadioLogger se.sics.cooja.plugins.ScriptRunner diff --git a/tools/cooja/java/se/sics/cooja/contikimote/ContikiMoteType.java b/tools/cooja/java/se/sics/cooja/contikimote/ContikiMoteType.java index 3198954d7..e03d41253 100644 --- a/tools/cooja/java/se/sics/cooja/contikimote/ContikiMoteType.java +++ b/tools/cooja/java/se/sics/cooja/contikimote/ContikiMoteType.java @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: ContikiMoteType.java,v 1.34 2009/03/12 18:25:45 nifi Exp $ + * $Id: ContikiMoteType.java,v 1.35 2009/03/21 15:41:42 fros4943 Exp $ */ package se.sics.cooja.contikimote; @@ -1309,14 +1309,18 @@ public class ContikiMoteType implements MoteType { } else if (name.equals("commstack")) { commStack = CommunicationStack.parse(element.getText()); } else if (name.equals("moteinterface")) { - Class extends MoteInterface> moteInterfaceClass = - simulation.getGUI().tryLoadClass( - this, MoteInterface.class, element.getText().trim()); - - if (moteInterfaceClass == null) { - logger.warn("Can't find mote interface class: " + element.getText()); + if (element.getText().trim().equals("se.sics.cooja.contikimote.interfaces.ContikiLog")) { + /* Backwards compatibility: ContikiLog was removed */ } else { - moteInterfacesClasses.add(moteInterfaceClass); + Class extends MoteInterface> moteInterfaceClass = + simulation.getGUI().tryLoadClass( + this, MoteInterface.class, element.getText().trim()); + + if (moteInterfaceClass == null) { + logger.warn("Can't find mote interface class: " + element.getText()); + } else { + moteInterfacesClasses.add(moteInterfaceClass); + } } } else if ( name.equals("contikibasedir") || diff --git a/tools/cooja/java/se/sics/cooja/contikimote/interfaces/ContikiLog.java b/tools/cooja/java/se/sics/cooja/contikimote/interfaces/ContikiLog.java deleted file mode 100644 index 47f3fc50c..000000000 --- a/tools/cooja/java/se/sics/cooja/contikimote/interfaces/ContikiLog.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (c) 2008, 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: ContikiLog.java,v 1.8 2009/02/25 14:46:24 fros4943 Exp $ - */ - -package se.sics.cooja.contikimote.interfaces; - -import java.awt.*; -import java.util.*; -import javax.swing.*; -import org.apache.log4j.Logger; -import org.jdom.Element; - -import se.sics.cooja.*; -import se.sics.cooja.contikimote.ContikiMoteInterface; -import se.sics.cooja.interfaces.Log; -import se.sics.cooja.interfaces.PolledAfterActiveTicks; - -/** - * Log mote interface. Captures both log_message(,) and printf(..). - * - * Contiki variables: - *
- * - * Core interface: - *
- *
- * This observable notifies at new mote log output.
- *
- * @author Fredrik Osterlind
- */
-public class ContikiLog extends Log implements ContikiMoteInterface, PolledAfterActiveTicks {
- private static Logger logger = Logger.getLogger(ContikiLog.class);
- private Mote mote = null;
- private SectionMoteMemory moteMem = null;
-
- private String lastLogMessage = null;
-
- /**
- * Creates an interface to mote's logging output.
- *
- * @param mote Log's mote.
- * @see Mote
- * @see se.sics.cooja.MoteInterfaceHandler
- */
- public ContikiLog(Mote mote) {
- this.mote = mote;
- this.moteMem = (SectionMoteMemory) mote.getMemory();
- }
-
- public static String[] getCoreInterfaceDependencies() {
- return new String[] { "simlog_interface" };
- }
-
- public void doActionsAfterTick() {
- if (moteMem.getByteValueOf("simLoggedFlag") == 1) {
- int totalLength = moteMem.getIntValueOf("simLoggedLength");
- byte[] bytes = moteMem.getByteArray("simLoggedData", totalLength);
- char[] chars = new char[bytes.length];
- for (int i=0; i < chars.length; i++) {
- chars[i] = (char) bytes[i];
- }
-
- moteMem.setByteValueOf("simLoggedFlag", (byte) 0);
- moteMem.setIntValueOf("simLoggedLength", 0);
-
- String messages[] = String.valueOf(chars).split("\n");
- for (String message: messages) {
- lastLogMessage = message;
-
- this.setChanged();
- this.notifyObservers(mote);
- }
- }
- }
-
- public String getLastLogMessage() {
- return lastLogMessage;
- }
-
- public JPanel getInterfaceVisualizer() {
- JPanel panel = new JPanel();
- panel.setLayout(new BorderLayout());
- final JTextArea logTextPane = new JTextArea();
- logTextPane.setOpaque(false);
- logTextPane.setEditable(false);
-
- if (lastLogMessage == null) {
- logTextPane.setText("");
- } else {
- logTextPane.append(lastLogMessage + "\n");
- }
-
- Observer observer;
- this.addObserver(observer = new Observer() {
- public void update(Observable obs, Object obj) {
- logTextPane.append(lastLogMessage + "\n");
- logTextPane.setCaretPosition(logTextPane.getDocument().getLength());
- }
- });
-
- // Saving observer reference for releaseInterfaceVisualizer
- panel.putClientProperty("intf_obs", observer);
-
- JScrollPane scrollPane = new JScrollPane(logTextPane);
- scrollPane.setPreferredSize(new Dimension(100,100));
- panel.add(BorderLayout.NORTH, new JLabel("Last log messages:"));
- panel.add(BorderLayout.CENTER, scrollPane);
- return panel;
- }
-
- public void releaseInterfaceVisualizer(JPanel panel) {
- Observer observer = (Observer) panel.getClientProperty("intf_obs");
- if (observer == null) {
- logger.fatal("Error when releasing panel, observer is null");
- return;
- }
-
- this.deleteObserver(observer);
- }
-
- public double energyConsumption() {
- // Does not require energy
- return 0.0;
- }
-
- public Collection
@@ -70,19 +62,15 @@ import se.sics.cooja.interfaces.PolledAfterActiveTicks;
*
* @see #getSerialMessages()
*
- * @author Fredrik Österlind
+ * @author Fredrik Osterlind
*/
-@ClassDescription("Serial port (RS232)")
-public class ContikiRS232 extends MoteInterface implements ContikiMoteInterface, PolledAfterActiveTicks {
+@ClassDescription("Serial port")
+public class ContikiRS232 extends SerialUI implements ContikiMoteInterface, PolledAfterActiveTicks {
private static Logger logger = Logger.getLogger(ContikiRS232.class);
private Mote mote = null;
private SectionMoteMemory moteMem = null;
- private String lastSerialMessage = null;
-
- private JTextArea logTextPane = null;
-
/**
* Approximate energy consumption of every sent character over RS232 (mQ).
*/
@@ -99,161 +87,70 @@ public class ContikiRS232 extends MoteInterface implements ContikiMoteInterface,
* @see se.sics.cooja.MoteInterfaceHandler
*/
public ContikiRS232(Mote mote) {
- // Read class configurations of this mote type
- ENERGY_CONSUMPTION_PER_CHAR_mQ = mote.getType().getConfig()
- .getDoubleValue(ContikiRS232.class, "CONSUMPTION_PER_CHAR_mQ");
+ ENERGY_CONSUMPTION_PER_CHAR_mQ =
+ mote.getType().getConfig().getDoubleValue(ContikiRS232.class, "CONSUMPTION_PER_CHAR_mQ");
this.mote = mote;
this.moteMem = (SectionMoteMemory) mote.getMemory();
}
public static String[] getCoreInterfaceDependencies() {
- return new String[]{"rs232_interface"};
+ return new String[]{"rs232_interface", "simlog_interface" };
}
public void doActionsAfterTick() {
- if (moteMem.getByteValueOf("simSerialSendingFlag") == 1) {
- int totalLength = moteMem.getIntValueOf("simSerialSendingLength");
- byte[] bytes = moteMem.getByteArray("simSerialSendingData", totalLength);
- char[] chars = new char[bytes.length];
- for (int i = 0; i < chars.length; i++) {
- chars[i] = (char) bytes[i];
+ if (moteMem.getByteValueOf("simLoggedFlag") == 1) {
+ int len = moteMem.getIntValueOf("simLoggedLength");
+ byte[] bytes = moteMem.getByteArray("simLoggedData", len);
+
+ myEnergyConsumption = ENERGY_CONSUMPTION_PER_CHAR_mQ * len;
+
+ moteMem.setByteValueOf("simLoggedFlag", (byte) 0);
+ moteMem.setIntValueOf("simLoggedLength", 0);
+
+ for (byte b: bytes) {
+ dataReceived(b);
}
-
- myEnergyConsumption = ENERGY_CONSUMPTION_PER_CHAR_mQ * totalLength;
-
- String message = String.valueOf(chars);
- lastSerialMessage = message;
-
- moteMem.setByteValueOf("simSerialSendingFlag", (byte) 0);
- moteMem.setIntValueOf("simSerialSendingLength", 0);
-
- this.setChanged();
- this.notifyObservers(mote);
} else {
myEnergyConsumption = 0.0;
}
}
- /**
- * Returns all serial messages sent by mote the last tick that anything was
- * sent.
- *
- * @return Last serial messages sent by mote.
- */
- public String getSerialMessages() {
- return lastSerialMessage;
- }
-
- /**
- * Send a serial message to mote.
- *
- * @param message
- * Message that mote should receive
- */
- public void sendSerialMessage(String message) {
-
- if (logTextPane != null) {
- logTextPane.append("> " + message + "\n");
- }
-
- // Flag for incoming data
+ public void writeString(String message) {
moteMem.setByteValueOf("simSerialReceivingFlag", (byte) 1);
byte[] dataToAppend = message.getBytes();
- // Increase receiving size
+ /* Append to existing buffer */
int oldSize = moteMem.getIntValueOf("simSerialReceivingLength");
- moteMem.setIntValueOf("simSerialReceivingLength", oldSize
- + dataToAppend.length);
- int newSize = moteMem.getIntValueOf("simSerialReceivingLength");
+ int newSize = oldSize + dataToAppend.length;
+ moteMem.setIntValueOf("simSerialReceivingLength", newSize);
- // Write buffer characters
byte[] oldData = moteMem.getByteArray("simSerialReceivingData", oldSize);
byte[] newData = new byte[newSize];
- for (int i = 0; i < oldData.length; i++) {
- newData[i] = oldData[i];
- }
-
- for (int i = 0; i < message.length(); i++) {
- newData[i + oldSize] = dataToAppend[i];
- }
+ System.arraycopy(oldData, 0, newData, 0, oldData.length);
+ System.arraycopy(dataToAppend, 0, newData, oldSize, dataToAppend.length);
moteMem.setByteArray("simSerialReceivingData", newData);
mote.setState(Mote.State.ACTIVE);
-
- }
-
- public JPanel getInterfaceVisualizer() {
- JPanel panel = new JPanel();
- panel.setLayout(new BorderLayout());
-
- if (logTextPane == null) {
- logTextPane = new JTextArea();
- }
-
- // Send RS232 data visualizer
- JPanel sendPane = new JPanel();
- final JTextField sendTextField = new JTextField(15);
- JButton sendButton = new JButton("Send data");
- sendButton.addActionListener(new ActionListener() {
- public void actionPerformed(ActionEvent e) {
- sendSerialMessage(sendTextField.getText());
- }
- });
- sendPane.add(BorderLayout.WEST, sendTextField);
- sendPane.add(BorderLayout.EAST, sendButton);
-
- // Receive RS232 data visualizer
- logTextPane.setOpaque(false);
- logTextPane.setEditable(false);
-
- if (lastSerialMessage == null) {
- logTextPane.setText("");
- } else {
- logTextPane.append(lastSerialMessage);
- }
-
- Observer observer;
- this.addObserver(observer = new Observer() {
- public void update(Observable obs, Object obj) {
- logTextPane.append("< " + lastSerialMessage + "\n");
- logTextPane.setCaretPosition(logTextPane.getDocument().getLength());
- }
- });
-
- // Saving observer reference for releaseInterfaceVisualizer
- panel.putClientProperty("intf_obs", observer);
-
- JScrollPane scrollPane = new JScrollPane(logTextPane);
- scrollPane.setPreferredSize(new Dimension(100, 100));
- panel.add(BorderLayout.NORTH, new JLabel("Last serial data:"));
- panel.add(BorderLayout.CENTER, scrollPane);
- panel.add(BorderLayout.SOUTH, sendPane);
- return panel;
- }
-
- public void releaseInterfaceVisualizer(JPanel panel) {
- Observer observer = (Observer) panel.getClientProperty("intf_obs");
- if (observer == null) {
- logger.fatal("Error when releasing panel, observer is null");
- return;
- }
-
- this.deleteObserver(observer);
}
public double energyConsumption() {
return myEnergyConsumption;
}
- public Collection