From 303915baf7cdca85007bf97dd8f44339bea0f4ea Mon Sep 17 00:00:00 2001 From: nifi Date: Fri, 9 Jul 2010 23:17:40 +0000 Subject: [PATCH] Added support for platforms Sentilla JCreate and Sentilla Gateway USB git-svn-id: https://mspsim.svn.sourceforge.net/svnroot/mspsim/mspsim@727 23d1a52b-0c3c-0410-b72d-8f29ab48fe35 --- images/jcreate.jpg | Bin 0 -> 38755 bytes images/sentilla-usb.jpg | Bin 0 -> 39463 bytes se/sics/mspsim/Main.java | 23 ++- se/sics/mspsim/chip/MMA7260QT.java | 134 +++++++++++++ .../mspsim/platform/jcreate/JCreateGui.java | 113 +++++++++++ .../mspsim/platform/jcreate/JCreateNode.java | 187 ++++++++++++++++++ .../platform/sentillausb/SentillaUSBGui.java | 121 ++++++++++++ .../platform/sentillausb/SentillaUSBNode.java | 144 ++++++++++++++ 8 files changed, 716 insertions(+), 6 deletions(-) create mode 100644 images/jcreate.jpg create mode 100644 images/sentilla-usb.jpg create mode 100644 se/sics/mspsim/chip/MMA7260QT.java create mode 100644 se/sics/mspsim/platform/jcreate/JCreateGui.java create mode 100644 se/sics/mspsim/platform/jcreate/JCreateNode.java create mode 100644 se/sics/mspsim/platform/sentillausb/SentillaUSBGui.java create mode 100644 se/sics/mspsim/platform/sentillausb/SentillaUSBNode.java diff --git a/images/jcreate.jpg b/images/jcreate.jpg new file mode 100644 index 0000000000000000000000000000000000000000..181cb765a76f7f21ba040916701a1ff55bf3b5e9 GIT binary patch literal 38755 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 ifI~;Bf^MNEY$_;OW|C 4095 ? 4095 : v; + } + + public int getADCY() { + int v = getY(); + return v > 4095 ? 4095 : v; + } + + public int getADCZ() { + int v = getZ(); + return v > 4095 ? 4095 : v; + } + + public void setX(int x) { + this.x = x; + } + + public int getX() { + return x; + } + + public void setY(int y) { + this.y = y; + } + + public int getY() { + return y; + } + + public void setZ(int z) { + this.z = z; + } + + public int getZ() { + return z; + } + + public int getSensitivity() { + return gSelect; + } + + public String getSensitivityAsString() { + return GSELECT[gSelect] + "g (" + (int)(1200/GSELECT[gSelect]) + "mV/g)"; + } + + public void setSensitivity(int gSelect) { + this.gSelect = gSelect & 0x03; + } + + public void setMode(int mode) { + super.setMode(mode); + } + + @Override + public int getModeMax() { + return MODE_NAMES.length; + } + + public String info() { + return "Mode: " + getModeName(getMode()) + + " Sensitivity: " + getSensitivityAsString() + + " [x=" + getADCX() + ",y=" + getADCY() + ",z=" + getADCZ() + ']'; + } + +} diff --git a/se/sics/mspsim/platform/jcreate/JCreateGui.java b/se/sics/mspsim/platform/jcreate/JCreateGui.java new file mode 100644 index 0000000..4ab344a --- /dev/null +++ b/se/sics/mspsim/platform/jcreate/JCreateGui.java @@ -0,0 +1,113 @@ +/** + * Copyright (c) 2010, 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. + * + * This file is part of MSPSim. + * + * $Id$ + * + * ----------------------------------------------------------------- + * + * JCreateGui + * + * Author : Joakim Eriksson, Niclas Finne + * Created : 7 jul 2010 + * Updated : $Date$ + * $Revision$ + */ + +package se.sics.mspsim.platform.jcreate; +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.RenderingHints; + +import se.sics.mspsim.platform.AbstractNodeGUI; + +public class JCreateGui extends AbstractNodeGUI { + + private static final long serialVersionUID = -1377998375300964966L; + + private static final Color RED_TRANS = new Color(0xff, 0x40, 0x40, 0xa0); + private static final Color RED_O = new Color(0xff,0x40,0x40,0xff); + private static final Color RED_I = new Color(0xff,0x60,0x60,0xff); + private static final Color RED_CORE = new Color(0xff,0xa0,0xa0,0xff); + + private static final int LEDS_Y = 66; + private static final int LEDS_X[] = {29, 49, 67, 86, 103, 122, 142, 162}; + private static final Rectangle LEDS_CLIP = new Rectangle(LEDS_X[0], LEDS_Y, + LEDS_X[LEDS_X.length - 1] + 10 - LEDS_X[0], 10); + + private final JCreateNode node; + + public JCreateGui(JCreateNode node) { + super("JCreateGui", "images/jcreate.jpg"); + this.node = node; + } + + @Override + protected void startGUI() { + } + + @Override + protected void stopGUI() { + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + + Color old = g.getColor(); + // Display all active leds + ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + int leds = node.getLeds(); + for (int i = 0; i < 8; i++) { + if ((leds & (0x80 >> i)) != 0) { + paintLed(g, i); + } + } + g.setColor(old); + } + + protected void paintLed(Graphics g, int led) { + int x = LEDS_X[led]; + g.setColor(RED_TRANS); + g.fillOval(x, LEDS_Y, 10, 10); + g.setColor(RED_O); + g.fillOval(x + 2, LEDS_Y + 2, 6, 6); + g.setColor(RED_I); + g.fillOval(x + 3, LEDS_Y + 3, 4, 4); + g.setColor(RED_CORE); + g.fillRect(x + 3, LEDS_Y + 3, 2, 2); + } + + void updateLeds() { + repaint(LEDS_CLIP); + } + +} diff --git a/se/sics/mspsim/platform/jcreate/JCreateNode.java b/se/sics/mspsim/platform/jcreate/JCreateNode.java new file mode 100644 index 0000000..630d7ff --- /dev/null +++ b/se/sics/mspsim/platform/jcreate/JCreateNode.java @@ -0,0 +1,187 @@ +/** + * Copyright (c) 2010, 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. + * + * This file is part of MSPSim. + * + * $Id$ + * + * ----------------------------------------------------------------- + * + * JCreateNode + * + * Author : Joakim Eriksson, Niclas Finne + * Created : 7 jul 2010 + * Updated : $Date$ + * $Revision$ + */ + +package se.sics.mspsim.platform.jcreate; +import java.io.IOException; + +import se.sics.mspsim.chip.FileM25P80; +import se.sics.mspsim.chip.M25P80; +import se.sics.mspsim.chip.MMA7260QT; +import se.sics.mspsim.core.ADC12; +import se.sics.mspsim.core.ADCInput; +import se.sics.mspsim.core.IOPort; +import se.sics.mspsim.core.IOUnit; +import se.sics.mspsim.core.USART; +import se.sics.mspsim.platform.sky.CC2420Node; +import se.sics.mspsim.util.ArgumentManager; + +/** + * Emulation of Sentilla JCreate Mote + */ +public class JCreateNode extends CC2420Node { + + public static final int MODE_LEDS_OFF = 0; + public static final int MODE_MAX = 9; + + private MMA7260QT accelerometer; + private M25P80 flash; + + private JCreateGui gui; + private int leds; + + public JCreateNode() { + super("Sentilla JCreate"); + setMode(MODE_LEDS_OFF); + } + + public int getLeds() { + return leds; + } + + public MMA7260QT getAccelerometer() { + return accelerometer; + } + + public M25P80 getFlash() { + return flash; + } + + public void setFlash(M25P80 flash) { + this.flash = flash; + registry.registerComponent("xmem", flash); + } + + // USART Listener + @Override + public void dataReceived(USART source, int data) { + radio.dataReceived(source, data); + flash.dataReceived(source, data); + /* if nothing selected, just write back a random byte to this device */ + if (!radio.getChipSelect() && !flash.getChipSelect()) { + source.byteReceived(0); + } + } + + @Override + protected void flashWrite(IOPort source, int data) { + flash.portWrite(source, data); + } + + @Override + public void setupNodePorts() { + super.setupNodePorts(); + accelerometer = new MMA7260QT(cpu); + IOUnit io = cpu.getIOUnit("ADC12"); + if (io instanceof ADC12) { + ADC12 adc = (ADC12) io; + adc.setADCInput(4, new ADCInput() { + public int nextData() { + return accelerometer.getADCX(); + } + }); + adc.setADCInput(5, new ADCInput() { + public int nextData() { + return accelerometer.getADCY(); + } + }); + adc.setADCInput(6, new ADCInput() { + public int nextData() { + return accelerometer.getADCZ(); + } + }); + } + + if (flashFile != null) { + setFlash(new FileM25P80(cpu, flashFile)); + } + } + + public void setupGUI() { + if (gui == null) { + gui = new JCreateGui(this); + registry.registerComponent("nodegui", gui); + } + } + + @Override + public void portWrite(IOPort source, int data) { + super.portWrite(source, data); + + if (source == port5) { + if (leds != ~(data & 0xff)) { + leds = ~(data & 0xff); + + int newMode = 0; + for (int i = 0; i < 8; i++) { + if ((data & (1 << i)) != 0) { + newMode++; + } + } + setMode(newMode); + + if (gui != null) { + gui.updateLeds(); + } + } + } else if (source == port2) { + int out = source.getOut() & source.getDirection(); + if ((out & 0x08) == 0x08) { + accelerometer.setMode(MMA7260QT.MODE_ACTIVE); + } else { + accelerometer.setMode(MMA7260QT.MODE_SLEEP); + } + accelerometer.setSensitivity(out & 0x03); + } + } + + @Override + public int getModeMax() { + return MODE_MAX; + } + + public static void main(String[] args) throws IOException { + JCreateNode node = new JCreateNode(); + ArgumentManager config = new ArgumentManager(); + config.handleArguments(args); + node.setupArgs(config); + } + +} diff --git a/se/sics/mspsim/platform/sentillausb/SentillaUSBGui.java b/se/sics/mspsim/platform/sentillausb/SentillaUSBGui.java new file mode 100644 index 0000000..4151a4e --- /dev/null +++ b/se/sics/mspsim/platform/sentillausb/SentillaUSBGui.java @@ -0,0 +1,121 @@ +/** + * Copyright (c) 2010, 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. + * + * This file is part of MSPSim. + * + * $Id$ + * + * ----------------------------------------------------------------- + * + * SentillaUSBGui + * + * Author : Joakim Eriksson, Niclas Finne + * Created : 7 jul 2010 + * Updated : $Date$ + * $Revision$ + */ + +package se.sics.mspsim.platform.sentillausb; +import java.awt.Color; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.awt.RenderingHints; + +import se.sics.mspsim.platform.AbstractNodeGUI; + +public class SentillaUSBGui extends AbstractNodeGUI { + + private static final long serialVersionUID = -692114865639672141L; + + private static final Color[] RED = new Color[] { + new Color(0xff, 0x40, 0x40, 0xa0), + new Color(0xff,0x40,0x40,0xff), + new Color(0xff,0x60,0x60,0xff), + new Color(0xff,0xa0,0xa0,0xff) + }; + private static final Color[] GREEN = new Color[] { + new Color(0x40, 0xff, 0x40, 0xa0), + new Color(0x40,0xff,0x40,0xff), + new Color(0x60,0xff,0x60,0xff), + new Color(0xa0,0xff,0xa0,0xff) + }; + + private static final int LEDS_GREEN_X = 8; + private static final int LEDS_RED_X = 126; + private static final int LEDS_Y = 89; + + private static final Rectangle LEDS_CLIP = + new Rectangle(LEDS_GREEN_X, LEDS_Y, LEDS_RED_X + 10 - LEDS_GREEN_X, 13); + + private final SentillaUSBNode node; + + public SentillaUSBGui(SentillaUSBNode node) { + super("SentillaUSBGui", "images/sentilla-usb.jpg"); + this.node = node; + } + + @Override + protected void startGUI() { + } + + @Override + protected void stopGUI() { + } + + @Override + protected void paintComponent(Graphics g) { + super.paintComponent(g); + + Color old = g.getColor(); + ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + if (node.greenLed) { + paintLed(g, LEDS_GREEN_X, GREEN); + } + if (node.redLed) { + paintLed(g, LEDS_RED_X, RED); + } + g.setColor(old); + } + + protected void paintLed(Graphics g, int x, Color[] colors) { + g.setColor(colors[0]); + g.fillOval(x, LEDS_Y, 10, 13); + g.setColor(colors[1]); + g.fillOval(x + 2, LEDS_Y + 2, 6, 7); + g.setColor(colors[2]); + g.fillOval(x + 3, LEDS_Y + 3, 4, 5); + g.setColor(colors[3]); + g.fillRect(x + 3, LEDS_Y + 3, 2, 2); + } + + void updateLeds() { + repaint(LEDS_CLIP); + } + +} diff --git a/se/sics/mspsim/platform/sentillausb/SentillaUSBNode.java b/se/sics/mspsim/platform/sentillausb/SentillaUSBNode.java new file mode 100644 index 0000000..2dc5e81 --- /dev/null +++ b/se/sics/mspsim/platform/sentillausb/SentillaUSBNode.java @@ -0,0 +1,144 @@ +/** + * Copyright (c) 2010, 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. + * + * This file is part of MSPSim. + * + * $Id$ + * + * ----------------------------------------------------------------- + * + * JCreateNode + * + * Author : Joakim Eriksson, Niclas Finne + * Created : 7 jul 2010 + * Updated : $Date$ + * $Revision$ + */ + +package se.sics.mspsim.platform.sentillausb; +import java.io.IOException; + +import se.sics.mspsim.chip.FileM25P80; +import se.sics.mspsim.chip.M25P80; +import se.sics.mspsim.core.IOPort; +import se.sics.mspsim.core.USART; +import se.sics.mspsim.platform.sky.CC2420Node; +import se.sics.mspsim.util.ArgumentManager; + +/** + * Emulation of Sentilla Gateway USB Mote + */ +public class SentillaUSBNode extends CC2420Node { + + public static final int MODE_LEDS_OFF = 0; + public static final int MODE_LEDS_1 = 1; + public static final int MODE_LEDS_2 = 2; + public static final int MODE_MAX = MODE_LEDS_2; + + public static final int GREEN_LED = 0x20; + public static final int RED_LED = 0x10; + + private M25P80 flash; + private SentillaUSBGui gui; + + boolean redLed; + boolean greenLed; + + public SentillaUSBNode() { + super("Sentilla USB"); + setMode(MODE_LEDS_OFF); + } + + public M25P80 getFlash() { + return flash; + } + + public void setFlash(M25P80 flash) { + this.flash = flash; + registry.registerComponent("xmem", flash); + } + + // USART Listener + @Override + public void dataReceived(USART source, int data) { + radio.dataReceived(source, data); + flash.dataReceived(source, data); + /* if nothing selected, just write back a random byte to this device */ + if (!radio.getChipSelect() && !flash.getChipSelect()) { + source.byteReceived(0); + } + } + + @Override + protected void flashWrite(IOPort source, int data) { + flash.portWrite(source, data); + } + + @Override + public void setupNodePorts() { + super.setupNodePorts(); + if (flashFile != null) { + setFlash(new FileM25P80(cpu, flashFile)); + } + } + + public void setupGUI() { + if (gui == null) { + gui = new SentillaUSBGui(this); + registry.registerComponent("nodegui", gui); + } + } + + @Override + public void portWrite(IOPort source, int data) { + super.portWrite(source, data); + + if (source == port5) { + redLed = (data & RED_LED) == 0; + greenLed = (data & GREEN_LED) == 0; + int newMode = (redLed ? 1 : 0) + (greenLed ? 1 : 0); + setMode(newMode); + + if (gui != null) { + gui.updateLeds(); + } + } + } + + @Override + public int getModeMax() { + return MODE_MAX; + } + + public static void main(String[] args) throws IOException { + SentillaUSBNode node = new SentillaUSBNode(); + ArgumentManager config = new ArgumentManager(); + config.handleArguments(args); + node.setupArgs(config); + } + +}