diff --git a/Makefile b/Makefile index 427ffe50..caf6ab37 100644 --- a/Makefile +++ b/Makefile @@ -62,6 +62,7 @@ Z1FIRMWARE = firmware/z1/blink.z1 WISMOTEFIRMWARE = firmware/wismote/blink.wismote TYNDALLFIRMWARE = firmware/tyndall/blink.tyndall EXP5438FIRMWARE = firmware/exp5438/testcase-bits.exp5438 +LCD122DIPFIRMWARE = firmware/lcd122dip/testcase-lcd.lcd122dip else ESBFIRMWARE = ${FIRMWAREFILE} SKYFIRMWARE = ${FIRMWAREFILE} @@ -69,6 +70,7 @@ Z1FIRMWARE = ${FIRMWAREFILE} WISMOTEFIRMWARE = ${FIRMWAREFILE} TYNDALLFIRMWARE = ${FIRMWAREFILE} EXP5438FIRMWARE = ${FIRMWAREFILE} +LCD122DIPFIRMWARE = ${FIRMWAREFILE} endif ifdef MAPFILE @@ -81,7 +83,7 @@ TIMERTEST := tests/timertest.firmware SCRIPTS := ${addprefix scripts/,autorun.sc duty.sc} BINARY := README.txt license.txt CHANGE_LOG.txt images/*.jpg images/*.png firmware/*/*.firmware ${SCRIPTS} -PACKAGES := se/sics/mspsim ${addprefix se/sics/mspsim/,core chip cli config debug platform ${addprefix platform/,esb sky jcreate sentillausb z1 tyndall ti wismote} plugin profiler emulink net ui util extutil/highlight extutil/jfreechart} +PACKAGES := se/sics/mspsim ${addprefix se/sics/mspsim/,core chip cli config debug platform ${addprefix platform/,esb sky jcreate sentillausb z1 tyndall ti wismote lcd122dip} plugin profiler emulink net ui util extutil/highlight extutil/jfreechart} SOURCES := ${wildcard *.java $(addsuffix /*.java,$(PACKAGES))} @@ -110,6 +112,9 @@ $(JARFILE): $(OBJECTS) $(JAR) cfm $(JARFILE) JarManifest.txt images/*.jpg -C $(BUILD) . -@$(RM) JarManifest.txt +%.lcd122dip: jar + java -jar $(JARFILE) -platform=lcd122dip $@ $(ARGS) + %.esb: jar java -jar $(JARFILE) -platform=esb $@ $(ARGS) @@ -145,16 +150,22 @@ runskyprof: compile runtelos: compile $(JAVA) $(JAVAARGS) se.sics.mspsim.platform.sky.TelosNode $(SKYFIRMWARE) $(MAPARGS) $(ARGS) + runz1: compile $(JAVA) $(JAVAARGS) se.sics.mspsim.platform.z1.Z1Node $(Z1FIRMWARE) $(MAPARGS) $(ARGS) + runtyndall: compile $(JAVA) $(JAVAARGS) se.sics.mspsim.platform.tyndall.TyndallNode $(TYNDALLFIRMWARE) $(MAPARGS) $(ARGS) + runwismote: compile $(JAVA) $(JAVAARGS) se.sics.mspsim.platform.wismote.WismoteNode $(WISMOTEFIRMWARE) $(MAPARGS) $(ARGS) runexp5438: compile $(JAVA) $(JAVAARGS) se.sics.mspsim.platform.ti.Exp5438Node $(EXP5438FIRMWARE) $(MAPARGS) $(ARGS) +runlcd122dip: compile + $(JAVA) $(JAVAARGS) se.sics.mspsim.platform.lcd122dip.LCD122DIPNode $(LCD122DIPFIRMWARE) $(MAPARGS) $(ARGS) + test: cputest cputest: $(CPUTEST) diff --git a/firmware/lcd122dip/testcase-lcd.lcd122dip b/firmware/lcd122dip/testcase-lcd.lcd122dip new file mode 100755 index 00000000..2acb9c39 Binary files /dev/null and b/firmware/lcd122dip/testcase-lcd.lcd122dip differ diff --git a/images/msp430f149-lcd122dip.jpg b/images/msp430f149-lcd122dip.jpg new file mode 100644 index 00000000..2b3be06f Binary files /dev/null and b/images/msp430f149-lcd122dip.jpg differ diff --git a/se/sics/mspsim/chip/EA122DIP.java b/se/sics/mspsim/chip/EA122DIP.java new file mode 100644 index 00000000..d08b1b41 --- /dev/null +++ b/se/sics/mspsim/chip/EA122DIP.java @@ -0,0 +1,174 @@ +/** + * Copyright (c) 2014, 3B Scientific GmbH. + * 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. + * + * ----------------------------------------------------------------- + * + * Author: Björn Rennfanz + * + */ + +package se.sics.mspsim.chip; + +import java.awt.Graphics; +import java.awt.Rectangle; +import java.util.ArrayList; + +import se.sics.mspsim.core.Chip; +import se.sics.mspsim.core.IOPort; +import se.sics.mspsim.core.MSP430Core; + +public class EA122DIP extends Chip implements PT6520Listener +{ + // Controllers + private PT6520 pt6520Left; + private PT6520 pt6520Right; + + // Listeners + private ArrayList displayListeners = new ArrayList(); + + /** + * Construct a EA122DIP emulated display + */ + public EA122DIP(MSP430Core cpu, Rectangle position) + { + super("EA122DIP", cpu); + + // Create controller for left side + pt6520Left = new PT6520("PT6520Left", cpu, new Rectangle(position.x, position.y, position.width / 2, position.height)); + pt6520Left.addListener(this); + + // Create controller for right side + pt6520Right = new PT6520("PT6520Right", cpu, new Rectangle(position.x + (position.width / 2), position.y, position.width / 2, position.height)); + pt6520Right.addListener(this); + } + + public void addListener(EA122DIPListener newListener) + { + // Add to collection + displayListeners.add(newListener); + } + + public void removeListener(EA122DIPListener oldListener) + { + // Remove from collection + displayListeners.remove(oldListener); + } + + /** + * Notify about display change + */ + private void notifyListener() + { + // Iterate through all listeners + for (EA122DIPListener listener : displayListeners) + { + // Notify for display change + listener.displayChanged(); + } + } + + /** + * Set data port + */ + public void setDataPort(IOPort port) + { + // Setup controller ports + pt6520Left.setDataPort(port); + pt6520Right.setDataPort(port); + } + + /** + * Set read and write pin + */ + public void setReadWritePin(IOPort port, int pin) + { + // Setup controller ports + pt6520Left.setReadWritePin(port, pin); + pt6520Right.setReadWritePin(port, pin); + } + + /** + * Set command pin + */ + public void setCommandPin(IOPort port, int pin) + { + // Setup controller ports + pt6520Left.setCommandPin(port, pin); + pt6520Right.setCommandPin(port, pin); + } + + /** + * Set controller one enable pin + */ + public void setEnableLeftPin(IOPort port, int pin) + { + // Setup controller ports + pt6520Left.setEnablePin(port, pin); + } + + /** + * Set controller two enable pin + */ + public void setEnableRightPin(IOPort port, int pin) + { + // Setup controller ports + pt6520Right.setEnablePin(port, pin); + } + + @Override + public int getConfiguration(int parameter) + { + // TODO Auto-generated method stub + return 0; + } + + @Override + public int getModeMax() + { + // TODO Auto-generated method stub + return 0; + } + + @Override + public void displayChanged() + { + // Notify display has changed + notifyListener(); + } + + /** + * Draws buffer image to given graphics + */ + public void drawDisplay(Graphics g) + { + // Get display from controllers + pt6520Left.drawDisplay(g); + pt6520Right.drawDisplay(g); + } +} diff --git a/se/sics/mspsim/chip/EA122DIPListener.java b/se/sics/mspsim/chip/EA122DIPListener.java new file mode 100644 index 00000000..e737bd2a --- /dev/null +++ b/se/sics/mspsim/chip/EA122DIPListener.java @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2014, 3B Scientific GmbH. + * 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. + * + * ----------------------------------------------------------------- + * + * Author: Björn Rennfanz + * + */ + +package se.sics.mspsim.chip; + +public interface EA122DIPListener +{ + /** + * Notify listener that display has changed + */ + public void displayChanged(); +} diff --git a/se/sics/mspsim/chip/LatchButton.java b/se/sics/mspsim/chip/LatchButton.java new file mode 100644 index 00000000..35e1934f --- /dev/null +++ b/se/sics/mspsim/chip/LatchButton.java @@ -0,0 +1,142 @@ +/** + * Copyright (c) 2014, 3B Scientific GmbH. + * 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. + * + * ----------------------------------------------------------------- + * + * Author: Björn Rennfanz + * + */ + +package se.sics.mspsim.chip; + +import se.sics.mspsim.core.EmulationLogger.WarningType; +import se.sics.mspsim.core.IOPort; +import se.sics.mspsim.core.MSP430Core; +import se.sics.mspsim.core.PortListener; +import se.sics.mspsim.core.TimeEvent; + +public class LatchButton extends Button implements PortListener +{ + // The Operation modes of the beeper + public static final int MODE_LATCH_OFF = 0; + public static final int MODE_LATCH_ON = 1; + private static final int MODE_MAX = MODE_LATCH_ON; + + // Private members + private boolean latchEnabled; + private IOPort latchPort; + private int latchPin; + + private boolean pressReleaseSchedule; + private Button that = this; + private MSP430Core cpu; + + private TimeEvent pressRelease = new TimeEvent(0, "LatchButton Release Event") + { + // Event handler to release button + public void execute(long t) + { + // Call super class + that.setPressed(false); + + // Reset event flag + pressReleaseSchedule = false; + } + }; + + public LatchButton(String id, MSP430Core cpu, IOPort buttonPort, int buttonPin, IOPort latchPort, int latchEnablePin, boolean polarity) + { + // Call super class constructor + super(id, cpu, buttonPort, buttonPin, polarity); + setMode(MODE_LATCH_OFF); + + // Save members + this.latchPin = latchEnablePin; + this.latchPort = latchPort; + this.cpu = cpu; + + // Attach event listener + this.latchPort.addPortListener(this); + + // Release event + pressReleaseSchedule = false; + } + + @Override + public int getModeMax() + { + return MODE_MAX; + } + + /** + * {@inheritDoc} + */ + @Override + public void portWrite(IOPort source, int data) + { + // Check if source matches latch port + if (source == latchPort) + { + // Latch is active low + if ((data & (1 << latchPin)) == 0) + { + // Latch enableds + latchEnabled = true; + + // Set mode to latch enabled + setMode(MODE_LATCH_ON); + } + else + { + // Latch disabled + latchEnabled = false; + + // Set mode to latch enabled + setMode(MODE_LATCH_OFF); + } + } + } + + /** + * {@inheritDoc} + */ + @Override + public void setPressed(boolean isPressed) + { + if ((latchEnabled) && (isPressed) && (!pressReleaseSchedule)) + { + // Call super class + super.setPressed(true); + + // Set flags and schedule release event + cpu.scheduleTimeEventMillis(pressRelease, 200.0); + pressReleaseSchedule = true; + } + } +} diff --git a/se/sics/mspsim/chip/PT6520.java b/se/sics/mspsim/chip/PT6520.java new file mode 100644 index 00000000..661dd90e --- /dev/null +++ b/se/sics/mspsim/chip/PT6520.java @@ -0,0 +1,386 @@ +/** + * Copyright (c) 2014, 3B Scientific GmbH. + * 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. + * + * ----------------------------------------------------------------- + * + * Author: Björn Rennfanz + * + */ + +package se.sics.mspsim.chip; + +import java.awt.Graphics; +import java.awt.Rectangle; +import java.awt.image.BufferedImage; +import java.util.ArrayList; + +import se.sics.mspsim.core.Chip; +import se.sics.mspsim.core.IOPort; +import se.sics.mspsim.core.MSP430Core; +import se.sics.mspsim.core.PortListener; + +public class PT6520 extends Chip implements PortListener +{ + // Private constants + private static final int DISPLAY_WIDTH = 61; + private static final int DISPLAY_HEIGHT = 32; + + private static final int DISPLAY_LINES_PER_PAGE = 8; + private static final int DISPLAY_PAGES = DISPLAY_HEIGHT / DISPLAY_LINES_PER_PAGE; + private static final int DISPLAY_MAX_COLUMN = 79; + + private static final int DISPLAY_NORMAL_STATUS = 0x00; + private static final int DISPLAY_BIT7 = 7; + + private static final int DISPLAY_CMD_SETPAGE = 0xB8; + private static final int DISPLAY_CMD_SETPAGE_MASK = 0xFC; + + private static final int DISPLAY_CMD_STARTLINE = 0xC0; + private static final int DISPLAY_CMD_STARTLINE_MASK = 0xE0; + + private static final int DISPLAY_CMD_ON = 0xAF; + private static final int DISPLAY_CMD_OFF = 0xAE; + + private static final int DISPLAY_RGB_OFF = 0x40ff40; + private static final int DISPLAY_RGB_ON = 0x000000; + + // Display buffers + private int[][] displayMemory; + private boolean displayMemorySet; + + private BufferedImage displayImage; + private Rectangle displayPosition; + + // Listener + private ArrayList displayListeners = new ArrayList(); + + // Logic + private int selectedPage; + private int selectedColumn; + private int selectedStartLine; + + // Data + private IOPort dataPort; + private int data; + + // Enable pin + private IOPort enablePort; + private int enablePin; + + // Command pin + private IOPort commandPort; + private int commandPin; + private boolean commandEnable; + + // Read or write pin + private IOPort readWritePort; + private int readWritePin; + private boolean readEnable; + + + /** + * Construct a PT6520 emulated display + */ + public PT6520(String id, MSP430Core cpu, Rectangle position) + { + super(id, cpu); + + // Initialize display memory and image + displayMemory = new int[DISPLAY_PAGES][DISPLAY_MAX_COLUMN + 1]; + displayImage = new BufferedImage(DISPLAY_WIDTH, DISPLAY_HEIGHT, BufferedImage.TYPE_INT_RGB); + refreshDisplay(); + + // Remember position + displayPosition = position; + } + + public void addListener(PT6520Listener newListener) + { + // Add to collection + displayListeners.add(newListener); + } + + public void removeListener(PT6520Listener oldListener) + { + // Remove from collection + displayListeners.remove(oldListener); + } + + /** + * Notify about display change + */ + private void notifyListener() + { + // Iterate through all listeners + for (PT6520Listener listener : displayListeners) + { + // Notify for display change + listener.displayChanged(); + } + } + + @Override + public int getConfiguration(int parameter) + { + return 0; + } + + @Override + public int getModeMax() + { + return 0; + } + + /** + * Set data port of display controller + */ + public void setDataPort(IOPort port) + { + // Save reference + this.dataPort = port; + + // Setup listener + this.dataPort.addPortListener(this); + } + + /** + * Set enable pin of display controller + */ + public void setEnablePin(IOPort port, int pin) + { + // Save reference + this.enablePort = port; + this.enablePin = pin; + + // Setup listener + this.enablePort.addPortListener(this); + + } + + /** + * Set command pin of display controller + */ + public void setCommandPin(IOPort port, int pin) + { + // Save reference + this.commandPort = port; + this.commandPin = pin; + + // Setup listener + this.commandPort.addPortListener(this); + + } + + /** + * Set read/write pin of display controller + */ + public void setReadWritePin(IOPort port, int pin) + { + // Save reference + this.readWritePort = port; + this.readWritePin = pin; + + // Setup listener + this.readWritePort.addPortListener(this); + + } + + @Override + public void portWrite(IOPort source, int data) + { + // Check if data was set + if (source == dataPort) + { + // Save data + this.data = data; + } + + // Check if command was set + if (source == commandPort) + { + // Save command enable flag + commandEnable = ((data & (1 << commandPin)) == 0); + } + + // Check if read or write was set + if (source == readWritePort) + { + // Save read / write flag + readEnable = ((data & (1 << readWritePin)) != 0); + } + + // Check if enable is set + if (source == enablePort) + { + // Check if enable pin is set + if ((data & (1 << enablePin)) != 0) + { + // Check if we in command mode + if (commandEnable) + { + // Check read status + if (readEnable) + { + // Write normal status to pin + setPortData(dataPort, DISPLAY_NORMAL_STATUS); + } + else + { + // Check for display commands + if ((this.data & (1 << DISPLAY_BIT7)) != 0) + { + if (this.data == DISPLAY_CMD_ON) + { + // Log display power on + log("Display power on command."); + } + else + { + if (this.data == DISPLAY_CMD_OFF) + { + // Log display power on + log("Display power off command."); + } + else + { + if ((this.data & DISPLAY_CMD_STARTLINE_MASK) == DISPLAY_CMD_STARTLINE) + { + // Save selected start line + selectedStartLine = (this.data & ~DISPLAY_CMD_STARTLINE_MASK); + } + else + { + if ((this.data & DISPLAY_CMD_SETPAGE_MASK) == DISPLAY_CMD_SETPAGE) + { + // Save selected page + selectedPage = (this.data & ~DISPLAY_CMD_SETPAGE_MASK); + } + else + { + // Log not supported command + log("Not supported command 0x" + Integer.toHexString(data)); + } + } + } + } + } + else + { + // Save selected column + selectedColumn = (this.data & 0x7F); + } + } + } + else + { + // Check read status + if (readEnable) + { + // Write data to port + setPortData(dataPort, displayMemory[selectedPage][selectedColumn]); + } + else + { + // Save data to display memory and refresh + displayMemory[selectedPage][selectedColumn] = this.data; + displayMemorySet = true; + } + } + } + else + { + // Check if display data was set + if (displayMemorySet) + { + // Refresh display + refreshDisplay(); + + // Set display data set flag + displayMemorySet = false; + + // Increment column counter. + selectedColumn = Math.min(selectedColumn + 1, DISPLAY_MAX_COLUMN); + } + } + } + } + + /** + * Set bitmask to given IOPort + */ + private void setPortData(IOPort port, int data) + { + // Set each bit on given port + for (int pin = 0; pin < 8; pin++) + { + // Set pin status from bitmask + port.setPinState(pin, ((data & (1 << pin)) != 0) ? IOPort.PinState.HI : IOPort.PinState.LOW); + } + } + + /** + * Refresh buffer bitmap from memory + */ + private void refreshDisplay() + { + // Redraw display memory + for (int page = 0; page < DISPLAY_PAGES; page++) + { + for (int x = 0; x < DISPLAY_WIDTH; x++) + { + for (int y = 0; y < DISPLAY_LINES_PER_PAGE; y++) + { + int currentLine = (y + (page * DISPLAY_LINES_PER_PAGE)); + if (currentLine < selectedStartLine) + { + // Draw blank display + displayImage.setRGB(x, currentLine, DISPLAY_RGB_OFF); + } + else + { + // Draw content of memory + displayImage.setRGB(x, currentLine, (((displayMemory[page][x] & (1 << y)) != 0) ? DISPLAY_RGB_ON : DISPLAY_RGB_OFF)); + } + } + } + } + + // Notify listeners + notifyListener(); + } + + /** + * Draws buffer image to given graphics + */ + public void drawDisplay(Graphics g) + { + // Draw to graphics with scaling + g.drawImage(displayImage, displayPosition.x + displayPosition.width, displayPosition.y + displayPosition.height, displayPosition.x, displayPosition.y, 0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT, null); + } +} diff --git a/se/sics/mspsim/chip/PT6520Listener.java b/se/sics/mspsim/chip/PT6520Listener.java new file mode 100644 index 00000000..a45a6c51 --- /dev/null +++ b/se/sics/mspsim/chip/PT6520Listener.java @@ -0,0 +1,44 @@ +/** + * Copyright (c) 2014, 3B Scientific GmbH. + * 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. + * + * ----------------------------------------------------------------- + * + * Author: Björn Rennfanz + * + */ + +package se.sics.mspsim.chip; + +public interface PT6520Listener +{ + /** + * Notify listener that display has changed + */ + public void displayChanged(); +} diff --git a/se/sics/mspsim/platform/lcd122dip/LCD122DIPGui.java b/se/sics/mspsim/platform/lcd122dip/LCD122DIPGui.java new file mode 100644 index 00000000..4fda58f2 --- /dev/null +++ b/se/sics/mspsim/platform/lcd122dip/LCD122DIPGui.java @@ -0,0 +1,89 @@ +/** + * Copyright (c) 2014, 3B Scientific GmbH. + * 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. + * + * ----------------------------------------------------------------- + * + * Author: Björn Rennfanz + * + */ + +package se.sics.mspsim.platform.lcd122dip; + +import java.awt.Color; +import java.awt.Graphics; + +import se.sics.mspsim.platform.AbstractNodeGUI; + +public class LCD122DIPGui extends AbstractNodeGUI { + + // Private final statics + private static final long serialVersionUID = 2884239980128494468L; + + // Private members + private final LCD122DIPNode node; + + /** + * Construct an NETlog GUI + */ + public LCD122DIPGui(LCD122DIPNode node) + { + super("EA122DIP", "images/msp430f149-lcd122dip.jpg"); + this.node = node; + } + + /** + * {@inheritDoc} + */ + @Override + protected void startGUI() + { + } + + /** + * {@inheritDoc} + */ + @Override + protected void stopGUI() + { + } + + @Override + protected void paintComponent(Graphics g) + { + // Get draw color + Color old = g.getColor(); + super.paintComponent(g); + + // Draw LCD content + node.getLcd().drawDisplay(g); + + // Restore draw color + g.setColor(old); + } +} diff --git a/se/sics/mspsim/platform/lcd122dip/LCD122DIPNode.java b/se/sics/mspsim/platform/lcd122dip/LCD122DIPNode.java new file mode 100644 index 00000000..e121d948 --- /dev/null +++ b/se/sics/mspsim/platform/lcd122dip/LCD122DIPNode.java @@ -0,0 +1,169 @@ +/** + * Copyright (c) 2014, 3B Scientific GmbH. + * 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. + * + * ----------------------------------------------------------------- + * + * Author: Björn Rennfanz + * + */ + +package se.sics.mspsim.platform.lcd122dip; + +import java.awt.Rectangle; +import java.io.IOException; + +import se.sics.mspsim.chip.EA122DIP; +import se.sics.mspsim.chip.EA122DIPListener; +import se.sics.mspsim.config.MSP430f149Config; +import se.sics.mspsim.core.IOPort; +import se.sics.mspsim.core.MSP430; +import se.sics.mspsim.core.USART; +import se.sics.mspsim.extutil.jfreechart.DataChart; +import se.sics.mspsim.extutil.jfreechart.DataSourceSampler; +import se.sics.mspsim.platform.GenericNode; +import se.sics.mspsim.ui.SerialMon; +import se.sics.mspsim.util.ArgumentManager; + +public class LCD122DIPNode extends GenericNode implements EA122DIPListener +{ + // Port 1 + private static final int DISPLAY_E0_PIN = 7; + private static final int DISPLAY_E1_PIN = 5; + + // Port 6 + private static final int DISPLAY_RW_PIN = 4; + private static final int DISPLAY_CMD_PIN = 6; + + // Private hardware members + private EA122DIP ea122dip; + + // Private cpu members + private IOPort port1; + private IOPort port2; + private IOPort port6; + + // AWT gui + private LCD122DIPGui gui; + + // Public getters + public EA122DIP getLcd() + { + return ea122dip; + } + + public LCD122DIPNode() + { + super("LCD122DIP", new MSP430f149Config()); + + } + + public void setupNodePorts() + { + // Setup ports + port1 = cpu.getIOUnit(IOPort.class, "P1"); + port2 = cpu.getIOUnit(IOPort.class, "P2"); + port6 = cpu.getIOUnit(IOPort.class, "P6"); + + // Setup display + ea122dip = new EA122DIP(cpu, new Rectangle(125, 140, 950, 230)); + ea122dip.addListener(this); + + // Setup display ports + ea122dip.setDataPort(port2); + ea122dip.setCommandPin(port6, DISPLAY_CMD_PIN); + ea122dip.setReadWritePin(port6, DISPLAY_RW_PIN); + ea122dip.setEnableLeftPin(port1, DISPLAY_E1_PIN); + ea122dip.setEnableRightPin(port1, DISPLAY_E0_PIN); + } + + @Override + public void setupNode() + { + setupNodePorts(); + + if (stats != null) { + stats.addMonitor(this); + stats.addMonitor(cpu); + } + + // Check if gui is enabled + if (!config.getPropertyAsBoolean("nogui", true)) + { + setupGUI(); + + // Add some windows for listening to serial output + USART usart = cpu.getIOUnit(USART.class, "USART1"); + if (usart != null) + { + SerialMon serial = new SerialMon(usart, "USART1 Port Output"); + registry.registerComponent("serialgui", serial); + } + + if (stats != null) + { + // A HACK for some "graphs"!!! + DataChart dataChart = new DataChart(registry, "Duty Cycle", "Duty Cycle"); + registry.registerComponent("dutychart", dataChart); + + DataSourceSampler dss = dataChart.setupChipFrame(cpu); + dataChart.addDataSource(dss, "CPU", stats.getDataSource(cpu.getID(), MSP430.MODE_ACTIVE)); + } + } + } + + public void setupGUI() + { + if (gui == null) + { + gui = new LCD122DIPGui(this); + registry.registerComponent("nodegui", gui); + } + } + + public static void main(String[] args) throws IOException + { + LCD122DIPNode node = new LCD122DIPNode(); + ArgumentManager config = new ArgumentManager(); + config.handleArguments(args); + node.setupArgs(config); + } + + @Override + public void displayChanged() + { + // Repaint in maximum of 20ms + gui.repaint(20); + } + + @Override + public int getModeMax() + { + return 0; + } +}