enable reconfigurable mote interfaces

some minor trying to fix a bug that occasionally hangs cooja when reconfiguring a mote type
This commit is contained in:
Fredrik Osterlind 2013-08-15 11:49:31 +02:00
parent 92655159c8
commit e5fe37336e
2 changed files with 97 additions and 59 deletions

View file

@ -256,6 +256,12 @@ public abstract class AbstractCompileDialog extends JDialog {
topPanel.add(sourcePanel); topPanel.add(sourcePanel);
Action cancelAction = new AbstractAction("Cancel") {
public void actionPerformed(ActionEvent e) {
AbstractCompileDialog.this.dispose();
}
};
Action compileAction = new AbstractAction("Compile") { Action compileAction = new AbstractAction("Compile") {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
@ -345,6 +351,41 @@ public abstract class AbstractCompileDialog extends JDialog {
} }
}); });
descriptionField.requestFocus();
descriptionField.select(0, descriptionField.getText().length());
/* Add listener only after restoring old config */
contikiField.getDocument().addDocumentListener(contikiFieldListener);
/* Final touches: respect window size, focus on description etc */
Rectangle maxSize = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
if (maxSize != null &&
(getSize().getWidth() > maxSize.getWidth() || getSize().getHeight() > maxSize.getHeight())) {
Dimension newSize = new Dimension();
newSize.height = Math.min((int) maxSize.getHeight(), (int) getSize().getHeight());
newSize.width = Math.min((int) maxSize.getWidth(), (int) getSize().getWidth());
/*logger.info("Resizing dialog: " + myDialog.getSize() + " -> " + newSize);*/
setSize(newSize);
}
/* Recompile at Ctrl+R */
InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_R, KeyEvent.CTRL_DOWN_MASK, false), "recompile");
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0, false), "dispose");
getRootPane().getActionMap().put("recompile", compileAction);
getRootPane().getActionMap().put("dispose", cancelAction);
pack();
setLocationRelativeTo(parent);
new Thread() {
public void run() {
tryRestoreMoteType();
};
}.start();
}
private void tryRestoreMoteType() {
/* Restore old configuration if mote type is already configured */ /* Restore old configuration if mote type is already configured */
boolean restoredDialogState = false; boolean restoredDialogState = false;
if (moteType != null) { if (moteType != null) {
@ -390,39 +431,14 @@ public abstract class AbstractCompileDialog extends JDialog {
/* Restore compile commands */ /* Restore compile commands */
if (moteType.getCompileCommands() != null) { if (moteType.getCompileCommands() != null) {
setCompileCommands(moteType.getCompileCommands()); setCompileCommands(moteType.getCompileCommands());
setDialogState(DialogState.AWAITING_COMPILATION); setDialogState(DialogState.AWAITING_COMPILATION);
restoredDialogState = true; restoredDialogState = true;
} }
} }
if (!restoredDialogState) { if (!restoredDialogState) {
setDialogState(DialogState.NO_SELECTION); setDialogState(DialogState.NO_SELECTION);
} }
descriptionField.requestFocus();
descriptionField.select(0, descriptionField.getText().length());
/* Add listener only after restoring old config */
contikiField.getDocument().addDocumentListener(contikiFieldListener);
/* Final touches: respect window size, focus on description etc */
Rectangle maxSize = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
if (maxSize != null &&
(getSize().getWidth() > maxSize.getWidth() || getSize().getHeight() > maxSize.getHeight())) {
Dimension newSize = new Dimension();
newSize.height = Math.min((int) maxSize.getHeight(), (int) getSize().getHeight());
newSize.width = Math.min((int) maxSize.getWidth(), (int) getSize().getWidth());
/*logger.info("Resizing dialog: " + myDialog.getSize() + " -> " + newSize);*/
setSize(newSize);
}
/* Recompile at Ctrl+R */
InputMap inputMap = getRootPane().getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_R, KeyEvent.CTRL_DOWN_MASK, false), "recompile");
getRootPane().getActionMap().put("recompile", compileAction);
pack();
setLocationRelativeTo(parent);
} }
/** /**
@ -472,11 +488,15 @@ public abstract class AbstractCompileDialog extends JDialog {
throw new Exception("No compile commands specified"); throw new Exception("No compile commands specified");
} }
SwingUtilities.invokeLater(new Runnable() { if (SwingUtilities.isEventDispatchThread()) {
public void run() { setDialogState(DialogState.IS_COMPILING);
setDialogState(DialogState.IS_COMPILING); } else {
} SwingUtilities.invokeAndWait(new Runnable() {
}); public void run() {
setDialogState(DialogState.IS_COMPILING);
}
});
}
createNewCompilationTab(taskOutput); createNewCompilationTab(taskOutput);
/* Add abort compilation menu item */ /* Add abort compilation menu item */
@ -542,6 +562,7 @@ public abstract class AbstractCompileDialog extends JDialog {
); );
} catch (Exception ex) { } catch (Exception ex) {
logger.fatal("Exception when compiling: " + ex.getMessage()); logger.fatal("Exception when compiling: " + ex.getMessage());
taskOutput.addMessage(ex.getMessage(), MessageList.ERROR);
ex.printStackTrace(); ex.printStackTrace();
compilationFailureAction.actionPerformed(null); compilationFailureAction.actionPerformed(null);
} }
@ -698,8 +719,6 @@ public abstract class AbstractCompileDialog extends JDialog {
} }
private Action defaultAction = new AbstractAction("Use default") { private Action defaultAction = new AbstractAction("Use default") {
private static final long serialVersionUID = 2874355910493988933L;
public void actionPerformed(ActionEvent e) { public void actionPerformed(ActionEvent e) {
/* Unselect all */ /* Unselect all */
for (Component c : moteIntfBox.getComponents()) { for (Component c : moteIntfBox.getComponents()) {

View file

@ -36,6 +36,7 @@ import java.awt.Container;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
import java.awt.event.ActionListener; import java.awt.event.ActionListener;
import java.io.File; import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList; import java.util.ArrayList;
import javax.swing.BorderFactory; import javax.swing.BorderFactory;
@ -103,28 +104,7 @@ public class ContikiMoteCompileDialog extends AbstractCompileDialog {
addAdvancedTab(tabbedPane); addAdvancedTab(tabbedPane);
} }
public boolean canLoadFirmware(File file) { private void updateForSource(File source) {
/* Disallow loading firmwares without compilation */
/*
if (file.getName().endsWith(ContikiMoteType.librarySuffix)) {
return true;
}
*/
return false;
}
public String getDefaultCompileCommands(File source) {
if (moteType == null) {
/* Not ready to compile yet */
return "";
}
if (source == null || !source.exists()) {
/* Not ready to compile yet */
return "";
}
if (moteType.getIdentifier() == null) { if (moteType.getIdentifier() == null) {
/* Generate mote type identifier */ /* Generate mote type identifier */
moteType.setIdentifier( moteType.setIdentifier(
@ -152,7 +132,7 @@ public class ContikiMoteCompileDialog extends AbstractCompileDialog {
if (((ContikiMoteType)moteType).javaClassName == null) { if (((ContikiMoteType)moteType).javaClassName == null) {
logger.fatal("Could not allocate a core communicator."); logger.fatal("Could not allocate a core communicator.");
return ""; return;
} }
/* Prepare compiler environment */ /* Prepare compiler environment */
@ -167,8 +147,8 @@ public class ContikiMoteCompileDialog extends AbstractCompileDialog {
((ContikiMoteType)moteType).javaClassName ((ContikiMoteType)moteType).javaClassName
); );
CompileContiki.redefineCOOJASources( CompileContiki.redefineCOOJASources(
moteType, moteType,
env env
); );
String[] envOneDimension = new String[env.length]; String[] envOneDimension = new String[env.length];
@ -184,6 +164,45 @@ public class ContikiMoteCompileDialog extends AbstractCompileDialog {
e.printStackTrace(); e.printStackTrace();
env = null; env = null;
} }
}
public boolean canLoadFirmware(File file) {
/* Disallow loading firmwares without compilation */
/*
if (file.getName().endsWith(ContikiMoteType.librarySuffix)) {
return true;
}
*/
return false;
}
public String getDefaultCompileCommands(final File source) {
if (moteType == null) {
/* Not ready to compile yet */
return "";
}
if (source == null || !source.exists()) {
/* Not ready to compile yet */
return "";
}
if (SwingUtilities.isEventDispatchThread()) {
updateForSource(source);
} else {
try {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
updateForSource(source);
}
});
} catch (InvocationTargetException e) {
logger.fatal("Error when updating for source " + source + ": " + e.getMessage(), e);
} catch (InterruptedException e) {
logger.fatal("Error when updating for source " + source + ": " + e.getMessage(), e);
}
}
String defines = ""; String defines = "";
if (((ContikiMoteType) moteType).getNetworkStack().getHeaderFile() != null) { if (((ContikiMoteType) moteType).getNetworkStack().getHeaderFile() != null) {