removing contiki log interface, instead only using the serial port interface

This commit is contained in:
fros4943 2009-03-21 15:41:42 +00:00
parent 480c023578
commit c205280f30
5 changed files with 51 additions and 320 deletions

View File

@ -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

View File

@ -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") ||

View File

@ -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:
* <ul>
* <li>char simLoggedFlag
* (1=mote has new outgoing log messages, else no new)
* <li>int simLoggedLength
* (length of new log message)
* <li>byte[] simLoggedData (data of new log messages)
* </ul>
* <p>
*
* Core interface:
* <ul>
* <li>simlog_interface
* </ul>
* <p>
*
* 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<Element> getConfigXML() {
return null;
}
public void setConfigXML(Collection<Element> configXML, boolean visAvailable) {
}
}

View File

@ -26,28 +26,20 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: ContikiRS232.java,v 1.5 2008/10/28 12:55:20 fros4943 Exp $
* $Id: ContikiRS232.java,v 1.6 2009/03/21 15:41:42 fros4943 Exp $
*/
package se.sics.cooja.contikimote.interfaces;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.*;
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.dialogs.SerialUI;
import se.sics.cooja.interfaces.PolledAfterActiveTicks;
/**
* Serial port mote interface.
* Only supports printable characters.
* Note that by default the serial interface is not equal to the log interface:
* printf(...) are not forwarded to this interface.
* Contiki mote serial port and log interfaces.
* Not fully implemented yet: does not support writeArray and writeByte
*
* Contiki variables:
* <ul>
@ -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<Element> getConfigXML() {
return null;
public Mote getMote() {
return mote;
}
public void setConfigXML(Collection<Element> configXML, boolean visAvailable) {
public void writeArray(byte[] s) {
logger.fatal("NOT IMPLEMENTED");
}
public void writeByte(byte b) {
logger.fatal("NOT IMPLEMENTED");
}
}

View File

@ -26,17 +26,17 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: PolledAfterActiveTicks.java,v 1.2 2009/03/09 14:08:54 fros4943 Exp $
* $Id: PolledAfterActiveTicks.java,v 1.3 2009/03/21 15:41:42 fros4943 Exp $
*/
package se.sics.cooja.interfaces;
import se.sics.cooja.contikimote.interfaces.ContikiLog;
import se.sics.cooja.contikimote.interfaces.ContikiRS232;
/**
* A mote interface polled after a mote tick ONLY IF the mote is awake.
*
* @see ContikiLog
* @see ContikiRS232
*
* @author Fredrik Osterlind
*/