Skip to content

Commit a6b892e

Browse files
committed
boards and cpu type menus
1 parent e92ad6e commit a6b892e

File tree

3 files changed

+181
-23
lines changed

3 files changed

+181
-23
lines changed

app/src/processing/app/Base.java

Lines changed: 142 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1107,15 +1107,17 @@ public void onBoardOrPortChange() {
11071107
}
11081108

11091109

1110-
public void rebuildBoardsMenu(JMenu menu) {
1110+
public void rebuildBoardsMenu(JMenu boardsMenu, final JMenu cpuTypeMenu) {
11111111
String selPackage = Preferences.get("target_package");
11121112
String selPlatform = Preferences.get("target_platform");
11131113
String selBoard = Preferences.get("board");
1114-
1115-
menu.removeAll();
1114+
String selBoardContainer = Preferences.get("board_container");
1115+
1116+
boardsMenu.removeAll();
11161117
boolean first = true;
11171118

1118-
ButtonGroup group = new ButtonGroup();
1119+
ButtonGroup boardsButtonGroup = new ButtonGroup();
1120+
ButtonGroup cpuTypesButtonGroup = new ButtonGroup();
11191121

11201122
// Cycle through all packages
11211123
for (TargetPackage targetPackage : packages.values()) {
@@ -1128,43 +1130,162 @@ public void rebuildBoardsMenu(JMenu menu) {
11281130

11291131
// Add a title for each group of boards
11301132
if (!first)
1131-
menu.add(new JSeparator());
1132-
first = false;
1133+
boardsMenu.add(new JSeparator());
1134+
first = false;
11331135
JMenuItem separator = new JMenuItem(targetPlatform.getPreferences().get("name"));
11341136
separator.setEnabled(false);
1135-
menu.add(separator);
1137+
boardsMenu.add(separator);
11361138

11371139
// For every platform cycle through all boards
1138-
for (String board : targetPlatform.getOrderedBoards()) {
1140+
for (String boardID : targetPlatform.getOrderedBoards()) {
1141+
1142+
PreferencesMap boardAttributes = boards.get(boardID);
1143+
final String boardContainer = boardAttributes.get("container");
1144+
1145+
AbstractAction filterCPUTypeMenuAction = new AbstractAction() {
1146+
1147+
@Override
1148+
public void actionPerformed(ActionEvent e) {
1149+
Preferences.set("board_container", (String) getValue("board_container"));
1150+
1151+
cpuTypeMenu.setEnabled(true);
1152+
1153+
for (int i = 0; i < cpuTypeMenu.getItemCount(); i++) {
1154+
JMenuItem cpuTypeMenuItem = cpuTypeMenu.getItem(i);
1155+
boolean visible = boardContainer.equals(cpuTypeMenuItem.getAction().getValue("board_container"));
1156+
cpuTypeMenuItem.setVisible(visible);
1157+
}
1158+
1159+
JMenuItem selectSelectedOrFirstVisibleMenuItem = selectVisibleSelectedOrFirstMenuItem(cpuTypeMenu);
1160+
selectSelectedOrFirstVisibleMenuItem.doClick();
1161+
}
1162+
};
1163+
filterCPUTypeMenuAction.putValue("board_container", boardContainer);
11391164

1140-
// Setup a menu item for the current board
1141-
String boardName = boards.get(board).get("name");
11421165
@SuppressWarnings("serial")
1143-
AbstractAction action = new AbstractAction(boardName) {
1166+
final AbstractAction selectBoardAction = new AbstractAction(boardAttributes.get("cpu")) {
11441167
public void actionPerformed(ActionEvent actionevent) {
11451168
Preferences.set("target_package", (String) getValue("package"));
11461169
Preferences.set("target_platform", (String) getValue("platform"));
11471170
Preferences.set("board", (String) getValue("board"));
1148-
1171+
11491172
onBoardOrPortChange();
11501173
Sketch.buildSettingChanged();
11511174
rebuildImportMenu(Editor.importMenu);
11521175
rebuildExamplesMenu(Editor.examplesMenu);
11531176
}
11541177
};
1155-
action.putValue("package", packageName);
1156-
action.putValue("platform", platformName);
1157-
action.putValue("board", board);
1158-
JMenuItem item = new JRadioButtonMenuItem(action);
1159-
if (packageName.equals(selPackage) &&
1160-
platformName.equals(selPlatform) && board.equals(selBoard)) {
1161-
item.setSelected(true);
1178+
selectBoardAction.putValue("package", packageName);
1179+
selectBoardAction.putValue("platform", platformName);
1180+
selectBoardAction.putValue("board", boardID);
1181+
selectBoardAction.putValue("board_container", boardContainer);
1182+
1183+
if (boardContainer != null) {
1184+
findOrCreateBoardContainerMenu(boardsMenu, boardsButtonGroup, boardContainer, filterCPUTypeMenuAction);
1185+
1186+
JMenuItem item = new JRadioButtonMenuItem(selectBoardAction);
1187+
cpuTypesButtonGroup.add(item);
1188+
cpuTypeMenu.add(item);
1189+
} else {
1190+
AbstractAction selectBoardWithoutContainerAction = new AbstractAction(boardAttributes.get("name")) {
1191+
1192+
@Override
1193+
public void actionPerformed(ActionEvent e) {
1194+
cpuTypeMenu.setEnabled(false);
1195+
selectBoardAction.actionPerformed(e);
1196+
}
1197+
};
1198+
JMenuItem item = new JRadioButtonMenuItem(selectBoardWithoutContainerAction);
1199+
boardsButtonGroup.add(item);
1200+
boardsMenu.add(item);
11621201
}
1163-
group.add(item);
1164-
menu.add(item);
11651202
}
11661203
}
11671204
}
1205+
1206+
JMenuItem selectedBoardMenu;
1207+
if (selBoardContainer == null) {
1208+
selectedBoardMenu = selectFirstEnabledMenuItem(boardsMenu);
1209+
} else {
1210+
selectedBoardMenu = selectMenuItemByBoardContainer(boardsMenu, selBoardContainer);
1211+
}
1212+
selectedBoardMenu.doClick();
1213+
1214+
if (cpuTypeMenu.isEnabled()) {
1215+
JMenuItem selectedCPUTypeMenu;
1216+
if (selBoard == null) {
1217+
selectedCPUTypeMenu = selectFirstEnabledMenuItem(cpuTypeMenu);
1218+
} else {
1219+
selectedCPUTypeMenu = selectMenuItemByBoardPackagePlatform(cpuTypeMenu, selBoard, selPackage, selPlatform);
1220+
}
1221+
selectedCPUTypeMenu.doClick();
1222+
}
1223+
}
1224+
1225+
private static JMenuItem selectVisibleSelectedOrFirstMenuItem(JMenu menu) {
1226+
JMenuItem firstVisible = null;
1227+
for (int i = 0; i < menu.getItemCount(); i++) {
1228+
JMenuItem item = menu.getItem(i);
1229+
if (item != null && item.isVisible()) {
1230+
if (item.isSelected()) {
1231+
return item;
1232+
}
1233+
if (firstVisible == null) {
1234+
firstVisible = item;
1235+
}
1236+
}
1237+
}
1238+
1239+
if (firstVisible != null) {
1240+
return firstVisible;
1241+
}
1242+
1243+
throw new IllegalStateException("Menu has no enabled items");
1244+
}
1245+
1246+
private static JMenuItem selectFirstEnabledMenuItem(JMenu menu) {
1247+
for (int i = 0; i < menu.getItemCount(); i++) {
1248+
JMenuItem item = menu.getItem(i);
1249+
if (item != null && item.isEnabled()) {
1250+
return item;
1251+
}
1252+
}
1253+
throw new IllegalStateException("Menu has no enabled items");
1254+
}
1255+
1256+
private static JMenuItem selectMenuItemByBoardContainer(JMenu menu, String boardContainer) {
1257+
for (int i = 0; i < menu.getItemCount(); i++) {
1258+
JMenuItem item = menu.getItem(i);
1259+
if (item != null && item.getAction() != null && boardContainer.equals(item.getAction().getValue("board_container"))) {
1260+
return item;
1261+
}
1262+
}
1263+
return selectFirstEnabledMenuItem(menu);
1264+
}
1265+
1266+
private static JMenuItem selectMenuItemByBoardPackagePlatform(JMenu menu, String selBoard, String selPackage, String selPlatform) {
1267+
for (int i = 0; i < menu.getItemCount(); i++) {
1268+
JMenuItem item = menu.getItem(i);
1269+
if (item != null && item.getAction() != null && selBoard.equals(item.getAction().getValue("board"))
1270+
&& selPackage.equals(item.getAction().getValue("package")) && selPlatform.equals(item.getAction().getValue("platform"))) {
1271+
return item;
1272+
}
1273+
}
1274+
return selectFirstEnabledMenuItem(menu);
1275+
}
1276+
1277+
private JMenuItem findOrCreateBoardContainerMenu(JMenu boardsMenu, ButtonGroup boardsButtonGroup, String boardContainerName, AbstractAction boardMenuAction) {
1278+
for (int i = 0; i < boardsMenu.getItemCount(); i++ ) {
1279+
JMenuItem boardContainer = boardsMenu.getItem(i);
1280+
if (boardContainer != null && boardContainerName.equals(boardContainer.getText())) {
1281+
return boardContainer;
1282+
}
1283+
}
1284+
JMenuItem item = new JRadioButtonMenuItem(boardMenuAction);
1285+
item.setText(boardContainerName);
1286+
boardsButtonGroup.add(item);
1287+
boardsMenu.add(item);
1288+
return item;
11681289
}
11691290

11701291
public void rebuildProgrammerMenu(JMenu menu) {

app/src/processing/app/Editor.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ public class Editor extends JFrame implements RunnerListener {
9797
// actually used are determined by the preferences, which are shared)
9898
static JMenu boardsMenu;
9999
static JMenu serialMenu;
100+
static JMenu cpuTypeMenu;
100101

101102
static SerialMenuListener serialMenuListener;
102103
static SerialMonitor serialMonitor;
@@ -179,7 +180,8 @@ public void windowActivated(WindowEvent e) {
179180
fileMenu.insert(examplesMenu, 3);
180181
sketchMenu.insert(importMenu, 4);
181182
toolsMenu.insert(boardsMenu, numTools);
182-
toolsMenu.insert(serialMenu, numTools + 1);
183+
toolsMenu.insert(cpuTypeMenu, numTools + 1);
184+
toolsMenu.insert(serialMenu, numTools + 2);
183185
}
184186

185187
// added for 1.0.5
@@ -190,6 +192,7 @@ public void windowDeactivated(WindowEvent e) {
190192
fileMenu.remove(examplesMenu);
191193
sketchMenu.remove(importMenu);
192194
toolsMenu.remove(boardsMenu);
195+
toolsMenu.remove(cpuTypeMenu);
193196
toolsMenu.remove(serialMenu);
194197
}
195198
});
@@ -680,12 +683,14 @@ public void actionPerformed(ActionEvent e) {
680683

681684
if (boardsMenu == null) {
682685
boardsMenu = new JMenu(_("Board"));
683-
base.rebuildBoardsMenu(boardsMenu);
686+
cpuTypeMenu = new JMenu(_("CPUType"));
687+
base.rebuildBoardsMenu(boardsMenu, cpuTypeMenu);
684688
//Debug: rebuild imports
685689
importMenu.removeAll();
686690
base.rebuildImportMenu(importMenu);
687691
}
688692
menu.add(boardsMenu);
693+
menu.add(cpuTypeMenu);
689694

690695
if (serialMenuListener == null)
691696
serialMenuListener = new SerialMenuListener();

hardware/arduino/avr/boards.txt

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ diecimila.build.variant=standard
6868
##############################################################
6969

7070
nano328.name=Arduino Nano w/ ATmega328
71+
nano328.cpu=ATmega328
72+
nano328.container=Arduino Nano
7173

7274
nano328.upload.tool=avrdude
7375
nano328.upload.protocol=arduino
@@ -90,6 +92,8 @@ nano328.build.variant=eightanaloginputs
9092
##############################################################
9193

9294
nano.name=Arduino Nano w/ ATmega168
95+
nano.cpu=ATmega168
96+
nano.container=Arduino Nano
9397

9498
nano.upload.tool=avrdude
9599
nano.upload.protocol=arduino
@@ -112,6 +116,8 @@ nano.build.variant=eightanaloginputs
112116
##############################################################
113117

114118
mega2560.name=Arduino Mega 2560 or Mega ADK
119+
mega2560.cpu=2560 or ADK
120+
mega2560.container=Arduino Mega
115121

116122
mega2560.upload.tool=avrdude
117123
mega2560.upload.protocol=stk500v2
@@ -134,6 +140,8 @@ mega2560.build.variant=mega
134140
##############################################################
135141

136142
mega.name=Arduino Mega (ATmega1280)
143+
mega.cpu=ATmega1280
144+
mega.container=Arduino Mega
137145

138146
mega.upload.tool=avrdude
139147
mega.upload.protocol=arduino
@@ -183,6 +191,8 @@ leonardo.build.extra_flags=-DUSB_VID={build.vid} -DUSB_PID={build.pid}
183191
##############################################################
184192

185193
mini328.name=Arduino Mini w/ ATmega328
194+
mini328.cpu=ATmega328
195+
mini328.container=Arduino Mini
186196

187197
mini328.upload.tool=avrdude
188198
mini328.upload.protocol=arduino
@@ -205,6 +215,8 @@ mini328.build.variant=eightanaloginputs
205215
##############################################################
206216

207217
mini.name=Arduino Mini w/ ATmega168
218+
mini.cpu=ATmega168
219+
mini.container=Arduino Mini
208220

209221
mini.upload.tool=avrdude
210222
mini.upload.protocol=arduino
@@ -271,6 +283,8 @@ fio.build.variant=eightanaloginputs
271283
##############################################################
272284

273285
bt328.name=Arduino BT w/ ATmega328
286+
bt328.cpu=ATmega328
287+
bt328.container=Arduino BT
274288

275289
bt328.upload.tool=avrdude
276290
bt328.upload.protocol=arduino
@@ -294,6 +308,8 @@ bt328.build.variant=eightanaloginputs
294308
##############################################################
295309

296310
bt.name=Arduino BT w/ ATmega168
311+
bt.cpu=ATmega168
312+
bt.container=Arduino BT
297313

298314
bt.upload.tool=avrdude
299315
bt.upload.protocol=arduino
@@ -317,6 +333,8 @@ bt.build.variant=eightanaloginputs
317333
##############################################################
318334

319335
lilypad328.name=LilyPad Arduino w/ ATmega328
336+
lilypad328.cpu=ATmega328
337+
lilypad328.container=LilyPad Arduino
320338

321339
lilypad328.upload.tool=avrdude
322340
lilypad328.upload.protocol=arduino
@@ -339,6 +357,8 @@ lilypad328.build.variant=standard
339357
##############################################################
340358

341359
lilypad.name=LilyPad Arduino w/ ATmega168
360+
lilypad.cpu=ATmega168
361+
lilypad.container=LilyPad Arduino
342362

343363
lilypad.upload.tool=avrdude
344364
lilypad.upload.protocol=arduino
@@ -361,6 +381,8 @@ lilypad.build.variant=standard
361381
##############################################################
362382

363383
pro5v328.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328
384+
pro5v328.cpu=ATmega328 (5V, 16 MHz)
385+
pro5v328.container=Arduino Pro or Pro Mini
364386

365387
pro5v328.upload.tool=avrdude
366388
pro5v328.upload.protocol=arduino
@@ -383,6 +405,8 @@ pro5v328.build.variant=standard
383405
##############################################################
384406

385407
pro5v.name=Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168
408+
pro5v.cpu=ATmega168 (5V, 16 MHz)
409+
pro5v.container=Arduino Pro or Pro Mini
386410

387411
pro5v.upload.tool=avrdude
388412
pro5v.upload.protocol=arduino
@@ -405,6 +429,8 @@ pro5v.build.variant=standard
405429
##############################################################
406430

407431
pro328.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328
432+
pro328.cpu=ATmega328 (3.3V, 8 MHz)
433+
pro328.container=Arduino Pro or Pro Mini
408434

409435
pro328.upload.tool=avrdude
410436
pro328.upload.protocol=arduino
@@ -427,6 +453,8 @@ pro328.build.variant=standard
427453
##############################################################
428454

429455
pro.name=Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168
456+
pro.cpu=ATmega168 (3.3V, 8 MHz)
457+
pro.container=Arduino Pro or Pro Mini
430458

431459
pro.upload.tool=avrdude
432460
pro.upload.protocol=arduino
@@ -449,6 +477,8 @@ pro.build.variant=standard
449477
##############################################################
450478

451479
atmega168.name=Arduino NG or older w/ ATmega168
480+
atmega168.cpu=ATmega168
481+
atmega168.container=Arduino NG or older
452482

453483
atmega168.upload.tool=avrdude
454484
atmega168.upload.protocol=arduino
@@ -471,6 +501,8 @@ atmega168.build.variant=standard
471501
##############################################################
472502

473503
atmega8.name=Arduino NG or older w/ ATmega8
504+
atmega8.cpu=ATmega8
505+
atmega8.container=Arduino NG or older
474506

475507
atmega8.upload.tool=avrdude
476508
atmega8.upload.protocol=arduino

0 commit comments

Comments
 (0)