removing contiki log interface, instead only using the serial port interface
This commit is contained in:
parent
480c023578
commit
c205280f30
|
@ -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
|
||||
|
|
|
@ -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") ||
|
||||
|
|
|
@ -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) {
|
||||
}
|
||||
|
||||
}
|
|
@ -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");
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue