Bug fix: only map beginning of path to source files + minor code cleanup

This commit is contained in:
Niclas Finne 2011-12-06 01:58:01 +01:00
parent 0a428c9489
commit e291eb43f4

View file

@ -25,8 +25,6 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * 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 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE. * SUCH DAMAGE.
*
* $Id: MspCodeWatcher.java,v 1.24 2010/08/26 14:10:43 nifi Exp $
*/ */
package se.sics.cooja.mspmote.plugins; package se.sics.cooja.mspmote.plugins;
@ -68,24 +66,25 @@ import org.jdom.Element;
import se.sics.cooja.ClassDescription; import se.sics.cooja.ClassDescription;
import se.sics.cooja.GUI; import se.sics.cooja.GUI;
import se.sics.cooja.GUI.RunnableInEDT;
import se.sics.cooja.Mote; import se.sics.cooja.Mote;
import se.sics.cooja.MotePlugin; import se.sics.cooja.MotePlugin;
import se.sics.cooja.PluginType; import se.sics.cooja.PluginType;
import se.sics.cooja.Simulation; import se.sics.cooja.Simulation;
import se.sics.cooja.VisPlugin; import se.sics.cooja.VisPlugin;
import se.sics.cooja.GUI.RunnableInEDT;
import se.sics.cooja.mspmote.MspMote; import se.sics.cooja.mspmote.MspMote;
import se.sics.cooja.mspmote.MspMoteType; import se.sics.cooja.mspmote.MspMoteType;
import se.sics.cooja.util.StringUtils; import se.sics.cooja.util.StringUtils;
import se.sics.mspsim.core.EmulationException; import se.sics.mspsim.core.EmulationException;
import se.sics.mspsim.core.MSP430; import se.sics.mspsim.core.MSP430;
import se.sics.mspsim.ui.DebugUI; import se.sics.mspsim.ui.DebugUI;
import se.sics.mspsim.util.ELFDebug;
import se.sics.mspsim.util.DebugInfo; import se.sics.mspsim.util.DebugInfo;
import se.sics.mspsim.util.ELFDebug;
@ClassDescription("Msp Code Watcher") @ClassDescription("Msp Code Watcher")
@PluginType(PluginType.MOTE_PLUGIN) @PluginType(PluginType.MOTE_PLUGIN)
public class MspCodeWatcher extends VisPlugin implements MotePlugin { public class MspCodeWatcher extends VisPlugin implements MotePlugin {
private static final long serialVersionUID = -8463196456352243367L;
private static Logger logger = Logger.getLogger(MspCodeWatcher.class); private static Logger logger = Logger.getLogger(MspCodeWatcher.class);
private Simulation simulation; private Simulation simulation;
private Observer simObserver; private Observer simObserver;
@ -131,6 +130,7 @@ public class MspCodeWatcher extends VisPlugin implements MotePlugin {
} }
}); });
fileComboBox.setRenderer(new BasicComboBoxRenderer() { fileComboBox.setRenderer(new BasicComboBoxRenderer() {
private static final long serialVersionUID = -2135703608960229528L;
public Component getListCellRendererComponent(JList list, Object value, public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) { int index, boolean isSelected, boolean cellHasFocus) {
if (isSelected) { if (isSelected) {
@ -165,13 +165,9 @@ public class MspCodeWatcher extends VisPlugin implements MotePlugin {
browseBox.add(mapButton); browseBox.add(mapButton);
browseBox.add(Box.createHorizontalStrut(10)); browseBox.add(Box.createHorizontalStrut(10));
mapAction.putValue(Action.NAME, "Map");
/* Execution control panel (south) */ /* Execution control panel (south) */
JPanel controlPanel = new JPanel(); JPanel controlPanel = new JPanel();
JButton button = new JButton(stepAction); JButton button = new JButton(stepAction);
stepAction.putValue(Action.NAME, "Step instruction");
controlPanel.add(button); controlPanel.add(button);
@ -272,7 +268,7 @@ public class MspCodeWatcher extends VisPlugin implements MotePlugin {
currentFileAction.setEnabled(true); currentFileAction.setEnabled(true);
currentFileAction.putValue(Action.NAME, currentCodeFile.getName() + ":" + currentLineNumber); currentFileAction.putValue(Action.NAME, currentCodeFile.getName() + ":" + currentLineNumber);
currentFileAction.putValue(Action.SHORT_DESCRIPTION, currentCodeFile.getAbsolutePath() + ":" + currentLineNumber); currentFileAction.putValue(Action.SHORT_DESCRIPTION, currentCodeFile.getAbsolutePath() + ":" + currentLineNumber);
fileComboBox.setSelectedIndex(0); fileComboBox.setSelectedItem(currentCodeFile.getName());
displaySourceFile(currentCodeFile, currentLineNumber); displaySourceFile(currentCodeFile, currentLineNumber);
} }
@ -294,24 +290,23 @@ public class MspCodeWatcher extends VisPlugin implements MotePlugin {
return; return;
} }
String path = String path = new File(debugInfo.getPath(), debugInfo.getFile()).getPath();
new File(debugInfo.getPath(), debugInfo.getFile()).getPath().replace('\\', '/');
if (path == null) { if (path == null) {
return; return;
} }
path = path.replace('\\', '/');
/* Debug info to source file map */ /* Debug info to source file map */
if (debugInfoMap != null && debugInfoMap.length == 2) { if (debugInfoMap != null && debugInfoMap.length == 2) {
if (path.startsWith(debugInfoMap[0])) { if (path.startsWith(debugInfoMap[0])) {
path = path.replace(debugInfoMap[0], debugInfoMap[1]); path = debugInfoMap[1] + path.substring(debugInfoMap[0].length());
} }
} }
/* Nasty Cygwin-Windows fix */ /* Nasty Cygwin-Windows fix */
if (path.contains("/cygdrive/")) { if (path.length() > 10 && path.startsWith("/cygdrive/")) {
int index = path.indexOf("/cygdrive/"); char driveCharacter = path.charAt(10);
char driveCharacter = path.charAt(index+10); path = driveCharacter + ":/" + path.substring(11);
path = path.replace("/cygdrive/" + driveCharacter + "/", driveCharacter + ":/");
} }
currentCodeFile = new File(path).getCanonicalFile(); currentCodeFile = new File(path).getCanonicalFile();
@ -327,16 +322,16 @@ public class MspCodeWatcher extends VisPlugin implements MotePlugin {
final String[] debugFiles; final String[] debugFiles;
try { try {
ELFDebug debug = ((MspMoteType)mspMote.getType()).getELF().getDebug(); ELFDebug debug = ((MspMoteType)mspMote.getType()).getELF().getDebug();
if (debug == null) { debugFiles = debug != null ? debug.getSourceFiles() : null;
if (debugFiles == null) {
logger.fatal("Error: No debug information is available"); logger.fatal("Error: No debug information is available");
return; return;
} }
debugFiles = debug.getSourceFiles();
} catch (IOException e1) { } catch (IOException e1) {
logger.fatal("Error: " + e1.getMessage(), e1); logger.fatal("Error: " + e1.getMessage(), e1);
return; return;
} }
debugInfoMap = new RunnableInEDT<String[]>() { String[] map = new RunnableInEDT<String[]>() {
public String[] work() { public String[] work() {
/* Select which source file to use */ /* Select which source file to use */
int counter = 0, n; int counter = 0, n;
@ -345,12 +340,12 @@ public class MspCodeWatcher extends VisPlugin implements MotePlugin {
n = JOptionPane.showOptionDialog(GUI.getTopParentContainer(), n = JOptionPane.showOptionDialog(GUI.getTopParentContainer(),
"Choose which source file to manually locate.\n\n" + "Choose which source file to manually locate.\n\n" +
"Some source files may not exist, as debug info is also inherited from the toolchain.\n" + "Some source files may not exist, as debug info is also inherited from the toolchain.\n" +
"\"Next\" selects the next source file in the debug info.\n\n" + "\"Next File\" proceeds to the next source file in the debug info.\n\n" +
(counter+1) + "/" + debugFiles.length + ": " + debugFiles[counter], debugFiles[counter] + " (" + (counter+1) + '/' + debugFiles.length + ')',
"Select source file to locate", JOptionPane.YES_NO_CANCEL_OPTION, "Select source file to locate", JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, null, JOptionPane.QUESTION_MESSAGE, null,
new String[] { "Next", "Locate", "Cancel"}, "Next"); new String[] { "Next File", "Locate File", "Cancel"}, "Next File");
if (n == JOptionPane.CANCEL_OPTION) { if (n == JOptionPane.CANCEL_OPTION || n == JOptionPane.CLOSED_OPTION) {
return null; return null;
} }
if (n == JOptionPane.NO_OPTION) { if (n == JOptionPane.NO_OPTION) {
@ -369,6 +364,7 @@ public class MspCodeWatcher extends VisPlugin implements MotePlugin {
return "Source file " + filename; return "Source file " + filename;
} }
}); });
fc.setCurrentDirectory(new File(GUI.getExternalToolsSetting("PATH_CONTIKI", ".")));
int returnVal = fc.showOpenDialog(GUI.getTopParentContainer()); int returnVal = fc.showOpenDialog(GUI.getTopParentContainer());
if (returnVal == JFileChooser.APPROVE_OPTION) { if (returnVal == JFileChooser.APPROVE_OPTION) {
correspondingFile = fc.getSelectedFile(); correspondingFile = fc.getSelectedFile();
@ -442,18 +438,22 @@ public class MspCodeWatcher extends VisPlugin implements MotePlugin {
} }
} }
}.invokeAndWait(); }.invokeAndWait();
updateFileComboBox();
if (map != null) {
debugInfoMap = map;
updateFileComboBox();
}
} }
private static File[] getSourceFiles(MspMote mote, String[] map) { private static File[] getSourceFiles(MspMote mote, String[] map) {
final String[] sourceFiles; final String[] sourceFiles;
try { try {
ELFDebug debug = ((MspMoteType)mote.getType()).getELF().getDebug(); ELFDebug debug = ((MspMoteType)mote.getType()).getELF().getDebug();
if (debug == null) { sourceFiles = debug != null ? debug.getSourceFiles() : null;
if (sourceFiles == null) {
logger.fatal("Error: No debug information is available"); logger.fatal("Error: No debug information is available");
return new File[0]; return new File[0];
} }
sourceFiles = debug.getSourceFiles();
} catch (IOException e1) { } catch (IOException e1) {
logger.fatal("Error: " + e1.getMessage(), e1); logger.fatal("Error: " + e1.getMessage(), e1);
return null; return null;
@ -474,15 +474,14 @@ public class MspCodeWatcher extends VisPlugin implements MotePlugin {
sourceFile = sourceFile.replace('\\', '/'); sourceFile = sourceFile.replace('\\', '/');
if (map != null && map.length == 2) { if (map != null && map.length == 2) {
if (sourceFile.startsWith(map[0])) { if (sourceFile.startsWith(map[0])) {
sourceFile = sourceFile.replace(map[0], map[1]); sourceFile = map[1] + sourceFile.substring(map[0].length());
} }
} }
/* Nasty Cygwin-Windows fix */ /* Nasty Cygwin-Windows fix */
if (sourceFile.contains("/cygdrive/")) { if (sourceFile.length() > 10 && sourceFile.contains("/cygdrive/")) {
int index = sourceFile.indexOf("/cygdrive/"); char driveCharacter = sourceFile.charAt(10);
char driveCharacter = sourceFile.charAt(index+10); sourceFile = driveCharacter + ":/" + sourceFile.substring(11);
sourceFile = sourceFile.replace("/cygdrive/" + driveCharacter + "/", driveCharacter + ":/");
} }
File file = new File(sourceFile); File file = new File(sourceFile);
@ -569,9 +568,6 @@ public class MspCodeWatcher extends VisPlugin implements MotePlugin {
} catch (MalformedURLException e) { } catch (MalformedURLException e) {
logger.warn("Failure to read source code: " + e); logger.warn("Failure to read source code: " + e);
return null; return null;
} catch (IOException e) {
logger.warn("Failure to read source code: " + e);
return null;
} }
} }
@ -606,6 +602,8 @@ public class MspCodeWatcher extends VisPlugin implements MotePlugin {
} }
private AbstractAction currentFileAction = new AbstractAction() { private AbstractAction currentFileAction = new AbstractAction() {
private static final long serialVersionUID = -3218306989816724883L;
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
if (currentCodeFile == null) { if (currentCodeFile == null) {
return; return;
@ -614,13 +612,17 @@ public class MspCodeWatcher extends VisPlugin implements MotePlugin {
} }
}; };
private AbstractAction mapAction = new AbstractAction() { private AbstractAction mapAction = new AbstractAction("Map") {
private static final long serialVersionUID = -3929432830596292495L;
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
tryMapDebugInfo(); tryMapDebugInfo();
} }
}; };
private AbstractAction stepAction = new AbstractAction() { private AbstractAction stepAction = new AbstractAction("Step instruction") {
private static final long serialVersionUID = 3520750710757816575L;
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
try { try {
mspMote.getCPU().stepInstructions(1); mspMote.getCPU().stepInstructions(1);