added avrora-micaz node emulation
This commit is contained in:
parent
bc7c90bb9f
commit
8be8d92923
54
tools/cooja/apps/avrora/build.xml
Normal file
54
tools/cooja/apps/avrora/build.xml
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
|
||||||
|
<project name="Avrora COOJA support" default="jar" basedir=".">
|
||||||
|
<property name="src" location="src"/>
|
||||||
|
<property name="build" location="build"/>
|
||||||
|
<property name="lib" location="lib"/>
|
||||||
|
<property name="javadoc" location="javadoc"/>
|
||||||
|
<property name="cooja" location="../.."/>
|
||||||
|
|
||||||
|
<property name="cooja_jar" value="${cooja}/dist/cooja.jar"/>
|
||||||
|
<property name="avrora_jar" value="${lib}/avrora.jar"/>
|
||||||
|
<property name="cooja_avrora_jar" value="${lib}/cooja_avrora.jar"/>
|
||||||
|
|
||||||
|
<target name="init">
|
||||||
|
<tstamp/>
|
||||||
|
<mkdir dir="${build}"/>
|
||||||
|
<mkdir dir="${lib}"/>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="clean">
|
||||||
|
<delete dir="${build}"/>
|
||||||
|
<delete dir="${lib}"/>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="compile" depends="init">
|
||||||
|
<javac srcdir="${src}" destdir="${build}" debug="on">
|
||||||
|
<classpath>
|
||||||
|
<pathelement location="${avrora_jar}"/>
|
||||||
|
<pathelement location="${cooja_jar}"/>
|
||||||
|
</classpath>
|
||||||
|
</javac>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="javadoc" depends="compile">
|
||||||
|
<delete dir="${javadoc}" quiet="true"/>
|
||||||
|
<mkdir dir="${javadoc}/"/>
|
||||||
|
<javadoc destdir="${javadoc}">
|
||||||
|
<fileset dir="${src}/" includes="**/*.java"/>
|
||||||
|
<classpath>
|
||||||
|
<pathelement location="${avrora_jar}"/>
|
||||||
|
<pathelement location="${cooja_jar}"/>
|
||||||
|
</classpath>
|
||||||
|
</javadoc>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="jar" depends="init, compile">
|
||||||
|
<jar destfile="${cooja_avrora_jar}" basedir="${build}">
|
||||||
|
<manifest>
|
||||||
|
<attribute name="Class-Path" value="."/>
|
||||||
|
</manifest>
|
||||||
|
</jar>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
</project>
|
2
tools/cooja/apps/avrora/cooja.config
Normal file
2
tools/cooja/apps/avrora/cooja.config
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
se.sics.cooja.GUI.MOTETYPES = + se.sics.cooja.avrmote.MicaZMoteType
|
||||||
|
se.sics.cooja.GUI.JARFILES = + cooja_avrora.jar avrora.jar
|
BIN
tools/cooja/apps/avrora/lib/avrora.jar
Normal file
BIN
tools/cooja/apps/avrora/lib/avrora.jar
Normal file
Binary file not shown.
312
tools/cooja/apps/avrora/src/se/sics/cooja/avrmote/MicaZMote.java
Executable file
312
tools/cooja/apps/avrora/src/se/sics/cooja/avrmote/MicaZMote.java
Executable file
|
@ -0,0 +1,312 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2007, 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: MicaZMote.java,v 1.1 2009/02/22 16:45:01 joxe Exp $
|
||||||
|
*/
|
||||||
|
|
||||||
|
package se.sics.cooja.avrmote;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintStream;
|
||||||
|
import java.net.URL;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Observable;
|
||||||
|
import java.util.Observer;
|
||||||
|
import java.util.Random;
|
||||||
|
import java.util.Vector;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.jdom.Element;
|
||||||
|
import se.sics.cooja.GUI;
|
||||||
|
import se.sics.cooja.Mote;
|
||||||
|
import se.sics.cooja.MoteInterface;
|
||||||
|
import se.sics.cooja.MoteInterfaceHandler;
|
||||||
|
import se.sics.cooja.MoteMemory;
|
||||||
|
import se.sics.cooja.MoteType;
|
||||||
|
import se.sics.cooja.Simulation;
|
||||||
|
import se.sics.cooja.avrmote.interfaces.MicaZLED;
|
||||||
|
import se.sics.cooja.interfaces.Position;
|
||||||
|
import avrora.sim.*;
|
||||||
|
import avrora.sim.platform.*;
|
||||||
|
import avrora.sim.mcu.*;
|
||||||
|
import avrora.core.*;
|
||||||
|
import avrora.sim.radio.*;
|
||||||
|
import avrora.sim.util.SimUtil;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Joakim Eriksson
|
||||||
|
*/
|
||||||
|
public class MicaZMote implements Mote {
|
||||||
|
private static Logger logger = Logger.getLogger(MicaZMote.class);
|
||||||
|
|
||||||
|
/* 8 MHz according to Contiki config */
|
||||||
|
public static long NR_CYCLES_PER_MSEC = 8000;
|
||||||
|
|
||||||
|
/* Cycle counter */
|
||||||
|
public long cycleCounter = 0;
|
||||||
|
public long cycleDrift = 0;
|
||||||
|
|
||||||
|
private Simulation mySimulation = null;
|
||||||
|
private Microcontroller myCpu = null;
|
||||||
|
private MicaZ micaZ = null;
|
||||||
|
private LoadableProgram program = null;
|
||||||
|
private Interpreter interpreter = null;
|
||||||
|
|
||||||
|
private MicaZMoteType myMoteType = null;
|
||||||
|
|
||||||
|
/* Stack monitoring variables */
|
||||||
|
private boolean stopNextInstruction = false;
|
||||||
|
|
||||||
|
private MoteInterfaceHandler myMoteInterfaceHandler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abort current tick immediately.
|
||||||
|
* May for example be called by a breakpoint handler.
|
||||||
|
*/
|
||||||
|
public void stopNextInstruction() {
|
||||||
|
stopNextInstruction = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MicaZMote() {
|
||||||
|
mySimulation = null;
|
||||||
|
myCpu = null;
|
||||||
|
myMoteInterfaceHandler = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MicaZMote(Simulation simulation, MicaZMoteType type) {
|
||||||
|
mySimulation = simulation;
|
||||||
|
myMoteType = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void initMote() {
|
||||||
|
if (myMoteType != null) {
|
||||||
|
initEmulator(myMoteType.getELFFile());
|
||||||
|
myMoteInterfaceHandler = createMoteInterfaceHandler();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean initEmulator(String fileELF) {
|
||||||
|
try {
|
||||||
|
prepareMote(fileELF);
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.fatal("Error when creating MicaZ mote:", e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public Simulation getSimulation() {
|
||||||
|
return mySimulation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSimulation(Simulation simulation) {
|
||||||
|
mySimulation = simulation;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepares CPU, memory and ELF module.
|
||||||
|
*
|
||||||
|
* @param fileELF ELF file
|
||||||
|
* @param cpu MSP430 cpu
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
protected void prepareMote(String file) throws Exception {
|
||||||
|
program = new LoadableProgram(file);
|
||||||
|
program.load();
|
||||||
|
PlatformFactory factory = new MicaZ.Factory();
|
||||||
|
micaZ = (MicaZ) factory.newPlatform(1, program.getProgram());
|
||||||
|
myCpu = micaZ.getMicrocontroller();
|
||||||
|
Simulator sim = myCpu.getSimulator();
|
||||||
|
interpreter = sim.getInterpreter();
|
||||||
|
// State state = interpreter.getState();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setState(State newState) {
|
||||||
|
logger.warn("MicaZ motes can't change state");
|
||||||
|
}
|
||||||
|
|
||||||
|
public State getState() {
|
||||||
|
return Mote.State.ACTIVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* called when moteID is updated */
|
||||||
|
public void idUpdated(int newID) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public MoteType getType() {
|
||||||
|
return myMoteType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setType(MoteType type) {
|
||||||
|
//myMoteType = (MspMoteType) type;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addStateObserver(Observer newObserver) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deleteStateObserver(Observer newObserver) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public MoteInterfaceHandler getInterfaces() {
|
||||||
|
return myMoteInterfaceHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInterfaces(MoteInterfaceHandler moteInterfaceHandler) {
|
||||||
|
myMoteInterfaceHandler = moteInterfaceHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* return false when done - e.g. true means more work to do before finished with this tick */
|
||||||
|
|
||||||
|
private boolean firstTick = true;
|
||||||
|
private long cyclesExecuted = 0;
|
||||||
|
public boolean tick(long simTime) {
|
||||||
|
if (stopNextInstruction) {
|
||||||
|
stopNextInstruction = false;
|
||||||
|
throw new RuntimeException("MSPSim requested simulation stop");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Nodes may be added in an ongoing simulation:
|
||||||
|
* Update cycle drift to current simulation time */
|
||||||
|
if (firstTick) {
|
||||||
|
firstTick = false;
|
||||||
|
cycleDrift += (-NR_CYCLES_PER_MSEC*simTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
long maxSimTimeCycles = NR_CYCLES_PER_MSEC * (simTime + 1) + cycleDrift;
|
||||||
|
|
||||||
|
if (maxSimTimeCycles <= cycleCounter) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Leave control to emulated CPU
|
||||||
|
cycleCounter += 1;
|
||||||
|
|
||||||
|
if (cyclesExecuted > cycleCounter) {
|
||||||
|
/* CPU already ticked too far - just wait it out */
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// myMoteInterfaceHandler.doActiveActionsBeforeTick();
|
||||||
|
|
||||||
|
cyclesExecuted += interpreter.step();
|
||||||
|
|
||||||
|
//cpu.step(cycleCounter);
|
||||||
|
|
||||||
|
/* Check if radio has pending incoming bytes */
|
||||||
|
// if (myRadio != null && myRadio.hasPendingBytes()) {
|
||||||
|
// myRadio.tryDeliverNextByte(cpu.cycles);
|
||||||
|
// }
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean setConfigXML(Simulation simulation, Collection<Element> configXML, boolean visAvailable) {
|
||||||
|
for (Element element: configXML) {
|
||||||
|
String name = element.getName();
|
||||||
|
|
||||||
|
if (name.equals("motetype_identifier")) {
|
||||||
|
|
||||||
|
setSimulation(simulation);
|
||||||
|
myMoteType = (MicaZMoteType) simulation.getMoteType(element.getText());
|
||||||
|
getType().setIdentifier(element.getText());
|
||||||
|
|
||||||
|
try {
|
||||||
|
prepareMote(myMoteType.getELFFile());
|
||||||
|
} catch (Exception e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
myMoteInterfaceHandler = createMoteInterfaceHandler();
|
||||||
|
|
||||||
|
} else if (name.equals("interface_config")) {
|
||||||
|
Class<? extends MoteInterface> moteInterfaceClass = simulation.getGUI().tryLoadClass(
|
||||||
|
this, MoteInterface.class, element.getText().trim());
|
||||||
|
|
||||||
|
if (moteInterfaceClass == null) {
|
||||||
|
logger.fatal("Could not load mote interface class: " + element.getText().trim());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
MoteInterface moteInterface = getInterfaces().getInterfaceOfType(moteInterfaceClass);
|
||||||
|
moteInterface.setConfigXML(element.getChildren(), visAvailable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private MoteInterfaceHandler createMoteInterfaceHandler() {
|
||||||
|
System.out.println("Creating mote interface handler....");
|
||||||
|
MoteInterfaceHandler moteInterfaceHandler = new MoteInterfaceHandler();
|
||||||
|
|
||||||
|
// Add position interface
|
||||||
|
Position motePosition = new Position(this);
|
||||||
|
Random random = new Random(); /* Do not use main random generator for positioning */
|
||||||
|
motePosition.setCoordinates(random.nextDouble()*100, random.nextDouble()*100, random.nextDouble()*100);
|
||||||
|
moteInterfaceHandler.addInterface(motePosition);
|
||||||
|
|
||||||
|
// Add LED interface
|
||||||
|
MicaZLED moteLED = new MicaZLED(micaZ);
|
||||||
|
moteInterfaceHandler.addInterface(moteLED);
|
||||||
|
|
||||||
|
return moteInterfaceHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Collection<Element> getConfigXML() {
|
||||||
|
Vector<Element> config = new Vector<Element>();
|
||||||
|
|
||||||
|
Element element;
|
||||||
|
|
||||||
|
// Mote type identifier
|
||||||
|
element = new Element("motetype_identifier");
|
||||||
|
element.setText(getType().getIdentifier());
|
||||||
|
config.add(element);
|
||||||
|
|
||||||
|
// Mote interfaces
|
||||||
|
for (MoteInterface moteInterface: getInterfaces().getInterfaces()) {
|
||||||
|
element = new Element("interface_config");
|
||||||
|
element.setText(moteInterface.getClass().getName());
|
||||||
|
|
||||||
|
Collection<Element> interfaceXML = moteInterface.getConfigXML();
|
||||||
|
if (interfaceXML != null) {
|
||||||
|
element.addContent(interfaceXML);
|
||||||
|
config.add(element);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MoteMemory getMemory() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setMemory(MoteMemory memory) {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
1135
tools/cooja/apps/avrora/src/se/sics/cooja/avrmote/MicaZMoteType.java
Normal file
1135
tools/cooja/apps/avrora/src/se/sics/cooja/avrmote/MicaZMoteType.java
Normal file
File diff suppressed because it is too large
Load diff
195
tools/cooja/apps/avrora/src/se/sics/cooja/avrmote/interfaces/MicaZLED.java
Executable file
195
tools/cooja/apps/avrora/src/se/sics/cooja/avrmote/interfaces/MicaZLED.java
Executable file
|
@ -0,0 +1,195 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2007, 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: MicaZLED.java,v 1.1 2009/02/22 16:45:01 joxe Exp $
|
||||||
|
*/
|
||||||
|
|
||||||
|
package se.sics.cooja.avrmote.interfaces;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.util.*;
|
||||||
|
import javax.swing.*;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.jdom.Element;
|
||||||
|
|
||||||
|
import avrora.sim.FiniteStateMachine;
|
||||||
|
import avrora.sim.platform.MicaZ;
|
||||||
|
import se.sics.cooja.*;
|
||||||
|
import se.sics.cooja.interfaces.LED;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Joakim Eriksson
|
||||||
|
*/
|
||||||
|
@ClassDescription("MicaZ LED")
|
||||||
|
public class MicaZLED extends LED {
|
||||||
|
private static Logger logger = Logger.getLogger(MicaZLED.class);
|
||||||
|
|
||||||
|
private boolean blueOn = false;
|
||||||
|
private boolean greenOn = false;
|
||||||
|
private boolean redOn = false;
|
||||||
|
|
||||||
|
private static final Color DARK_BLUE = new Color(0, 0, 100);
|
||||||
|
private static final Color DARK_GREEN = new Color(0, 100, 0);
|
||||||
|
private static final Color DARK_RED = new Color(100, 0, 0);
|
||||||
|
private static final Color BLUE = new Color(0, 0, 255);
|
||||||
|
private static final Color GREEN = new Color(0, 255, 0);
|
||||||
|
private static final Color RED = new Color(255, 0, 0);
|
||||||
|
|
||||||
|
public MicaZLED(MicaZ micaZ) {
|
||||||
|
avrora.sim.platform.LED.LEDGroup leds =
|
||||||
|
(avrora.sim.platform.LED.LEDGroup) micaZ.getDevice("leds");
|
||||||
|
leds.leds[0].getFSM().insertProbe(new FiniteStateMachine.Probe() {
|
||||||
|
public void fireAfterTransition(int old, int newstate) {
|
||||||
|
redOn = newstate > 0;
|
||||||
|
setChanged();
|
||||||
|
notifyObservers();
|
||||||
|
}
|
||||||
|
public void fireBeforeTransition(int arg0, int arg1) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
leds.leds[1].getFSM().insertProbe(new FiniteStateMachine.Probe() {
|
||||||
|
public void fireAfterTransition(int old, int newstate) {
|
||||||
|
blueOn = newstate > 0;
|
||||||
|
setChanged();
|
||||||
|
notifyObservers();
|
||||||
|
}
|
||||||
|
public void fireBeforeTransition(int arg0, int arg1) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
leds.leds[2].getFSM().insertProbe(new FiniteStateMachine.Probe() {
|
||||||
|
public void fireAfterTransition(int old, int newstate) {
|
||||||
|
greenOn = newstate > 0;
|
||||||
|
setChanged();
|
||||||
|
notifyObservers();
|
||||||
|
}
|
||||||
|
public void fireBeforeTransition(int arg0, int arg1) {
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isAnyOn() {
|
||||||
|
return blueOn || greenOn || redOn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isGreenOn() {
|
||||||
|
return greenOn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isYellowOn() {
|
||||||
|
return blueOn; /* Returning blue */
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isRedOn() {
|
||||||
|
return redOn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double energyConsumption() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public JPanel getInterfaceVisualizer() {
|
||||||
|
final JPanel panel = new JPanel() {
|
||||||
|
public void paintComponent(Graphics g) {
|
||||||
|
super.paintComponent(g);
|
||||||
|
|
||||||
|
int x = 20;
|
||||||
|
int y = 25;
|
||||||
|
int d = 25;
|
||||||
|
|
||||||
|
if (isGreenOn()) {
|
||||||
|
g.setColor(GREEN);
|
||||||
|
g.fillOval(x, y, d, d);
|
||||||
|
g.setColor(Color.BLACK);
|
||||||
|
g.drawOval(x, y, d, d);
|
||||||
|
} else {
|
||||||
|
g.setColor(DARK_GREEN);
|
||||||
|
g.fillOval(x + 5, y + 5, d-10, d-10);
|
||||||
|
}
|
||||||
|
|
||||||
|
x += 40;
|
||||||
|
|
||||||
|
if (isRedOn()) {
|
||||||
|
g.setColor(RED);
|
||||||
|
g.fillOval(x, y, d, d);
|
||||||
|
g.setColor(Color.BLACK);
|
||||||
|
g.drawOval(x, y, d, d);
|
||||||
|
} else {
|
||||||
|
g.setColor(DARK_RED);
|
||||||
|
g.fillOval(x + 5, y + 5, d-10, d-10);
|
||||||
|
}
|
||||||
|
|
||||||
|
x += 40;
|
||||||
|
|
||||||
|
if (isYellowOn()) {
|
||||||
|
g.setColor(BLUE);
|
||||||
|
g.fillOval(x, y, d, d);
|
||||||
|
g.setColor(Color.BLACK);
|
||||||
|
g.drawOval(x, y, d, d);
|
||||||
|
} else {
|
||||||
|
g.setColor(DARK_BLUE);
|
||||||
|
g.fillOval(x + 5, y + 5, d-10, d-10);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Observer observer;
|
||||||
|
this.addObserver(observer = new Observer() {
|
||||||
|
public void update(Observable obs, Object obj) {
|
||||||
|
panel.repaint();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Saving observer reference for releaseInterfaceVisualizer
|
||||||
|
panel.putClientProperty("intf_obs", observer);
|
||||||
|
|
||||||
|
panel.setMinimumSize(new Dimension(140, 60));
|
||||||
|
panel.setPreferredSize(new Dimension(140, 60));
|
||||||
|
|
||||||
|
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 Collection<Element> getConfigXML() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConfigXML(Collection<Element> configXML, boolean visAvailable) {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@ CONTIKI_STANDARD_PROCESSES = sensors_process;etimer_process
|
||||||
CONTIKI_MAIN_TEMPLATE_FILENAME = contiki_template.c
|
CONTIKI_MAIN_TEMPLATE_FILENAME = contiki_template.c
|
||||||
CORECOMM_TEMPLATE_FILENAME = corecomm_template.java
|
CORECOMM_TEMPLATE_FILENAME = corecomm_template.java
|
||||||
PATH_JAVAC = javac
|
PATH_JAVAC = javac
|
||||||
DEFAULT_PROJECTDIRS = ../apps/mrm;../apps/mspsim
|
DEFAULT_PROJECTDIRS = ../apps/mrm;../apps/mspsim;../apps/avrora
|
||||||
|
|
||||||
PARSE_WITH_COMMAND = true
|
PARSE_WITH_COMMAND = true
|
||||||
PARSE_COMMAND=nm -C $(LIBFILE)
|
PARSE_COMMAND=nm -C $(LIBFILE)
|
||||||
|
|
Loading…
Reference in a new issue