diff --git a/tools/cooja/java/se/sics/cooja/interfaces/ApplicationLED.java b/tools/cooja/java/se/sics/cooja/interfaces/ApplicationLED.java new file mode 100644 index 000000000..4ecbc7eff --- /dev/null +++ b/tools/cooja/java/se/sics/cooja/interfaces/ApplicationLED.java @@ -0,0 +1,152 @@ +package se.sics.cooja.interfaces; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics; +import java.util.Collection; +import java.util.Observable; +import java.util.Observer; + +import javax.swing.JPanel; + +import org.apache.log4j.Logger; +import org.jdom.Element; + +import se.sics.cooja.*; +import se.sics.cooja.contikimote.interfaces.ContikiLED; + +public class ApplicationLED extends LED { + private static Logger logger = Logger.getLogger(ContikiLED.class); + + private Mote mote = null; + private byte currentLedValue = 0; + + public static final byte LEDS_GREEN = 1; + public static final byte LEDS_YELLOW = 2; + public static final byte LEDS_RED = 4; + + private static final Color DARK_GREEN = new Color(0, 50, 0); + private static final Color DARK_YELLOW = new Color(50, 50, 0); + private static final Color DARK_RED = new Color(50, 0, 0); + private static final Color GREEN = new Color(0, 255, 0); + private static final Color YELLOW = new Color(255, 255, 0); + private static final Color RED = new Color(255, 0, 0); + + public ApplicationLED(Mote mote) { + this.mote = mote; + } + + public static String[] getCoreInterfaceDependencies() { + return new String[]{"leds_interface"}; + } + + public boolean isAnyOn() { + return currentLedValue > 0; + } + + public boolean isGreenOn() { + return (currentLedValue & LEDS_GREEN) > 0; + } + + public boolean isYellowOn() { + return (currentLedValue & LEDS_YELLOW) > 0; + } + + public boolean isRedOn() { + return (currentLedValue & LEDS_RED) > 0; + } + + public void setLED(int led) { + boolean ledChanged; + ledChanged = led != currentLedValue; + + currentLedValue = (byte) led; + if (ledChanged) { + this.setChanged(); + this.notifyObservers(mote); + } + } + + 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(YELLOW); + g.fillOval(x, y, d, d); + g.setColor(Color.BLACK); + g.drawOval(x, y, d, d); + } else { + g.setColor(DARK_YELLOW); + 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 double energyConsumption() { + return 0; + } + + public Collection getConfigXML() { + return null; + } + + @Override + public void setConfigXML(Collection configXML, boolean visAvailable) { + // TODO Auto-generated method stub + } + } \ No newline at end of file diff --git a/tools/cooja/java/se/sics/cooja/motes/AbstractApplicationMoteType.java b/tools/cooja/java/se/sics/cooja/motes/AbstractApplicationMoteType.java index 8a0168ccc..50654d7e8 100644 --- a/tools/cooja/java/se/sics/cooja/motes/AbstractApplicationMoteType.java +++ b/tools/cooja/java/se/sics/cooja/motes/AbstractApplicationMoteType.java @@ -24,7 +24,7 @@ * (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: AbstractApplicationMoteType.java,v 1.5 2009/11/25 20:48:22 fros4943 Exp $ + * $Id: AbstractApplicationMoteType.java,v 1.6 2010/01/24 22:24:36 joxe Exp $ */ package se.sics.cooja.motes; @@ -42,6 +42,7 @@ import org.jdom.Element; import se.sics.cooja.*; import se.sics.cooja.MoteType.MoteTypeCreationException; +import se.sics.cooja.interfaces.ApplicationLED; import se.sics.cooja.interfaces.ApplicationRadio; import se.sics.cooja.interfaces.MoteID; import se.sics.cooja.interfaces.Position; @@ -56,7 +57,7 @@ public abstract class AbstractApplicationMoteType implements MoteType { private String description = null; private final Class[] moteInterfaceClasses = - new Class[] { SimpleMoteID.class, Position.class, ApplicationRadio.class }; + new Class[] { SimpleMoteID.class, Position.class, ApplicationRadio.class, ApplicationLED.class}; public AbstractApplicationMoteType() { super();