@@ -146,6 +146,8 @@ public boolean test(Sketch sketch) {
146146
147147 private int numTools = 0 ;
148148
149+ public boolean avoidMultipleOperations = false ;
150+
149151 private final EditorToolbar toolbar ;
150152 // these menus are shared so that they needn't be rebuilt for all windows
151153 // each time a sketch is created, renamed, or moved.
@@ -198,7 +200,7 @@ public boolean test(Sketch sketch) {
198200 private Runnable stopHandler ;
199201 Runnable exportHandler ;
200202 private Runnable exportAppHandler ;
201-
203+ private Runnable timeoutUploadHandler ;
202204
203205 public Editor (Base ibase , File file , int [] storedLocation , int [] defaultLocation , Platform platform ) throws Exception {
204206 super ("Arduino" );
@@ -812,6 +814,9 @@ public void actionPerformed(ActionEvent e) {
812814 portMenu = new JMenu (tr ("Port" ));
813815 populatePortMenu ();
814816 toolsMenu .add (portMenu );
817+ item = new JMenuItem (tr ("Get Board Info" ));
818+ item .addActionListener (e -> handleBoardInfo ());
819+ toolsMenu .add (item );
815820 toolsMenu .addSeparator ();
816821
817822 base .rebuildProgrammerMenu ();
@@ -1661,6 +1666,7 @@ private void resetHandlers() {
16611666 stopHandler = new DefaultStopHandler ();
16621667 exportHandler = new DefaultExportHandler ();
16631668 exportAppHandler = new DefaultExportAppHandler ();
1669+ timeoutUploadHandler = new TimeoutUploadHandler ();
16641670 }
16651671
16661672
@@ -1992,6 +1998,7 @@ public void run() {
19921998
19931999 status .unprogress ();
19942000 toolbar .deactivateRun ();
2001+ avoidMultipleOperations = false ;
19952002 }
19962003 }
19972004
@@ -2380,6 +2387,7 @@ synchronized public void handleExport(final boolean usingProgrammer) {
23802387 console .clear ();
23812388 status .progress (tr ("Uploading to I/O Board..." ));
23822389
2390+ new Thread (timeoutUploadHandler ).start ();
23832391 new Thread (usingProgrammer ? exportAppHandler : exportHandler ).start ();
23842392 }
23852393
@@ -2419,6 +2427,7 @@ public void run() {
24192427 e .printStackTrace ();
24202428 } finally {
24212429 populatePortMenu ();
2430+ avoidMultipleOperations = false ;
24222431 }
24232432 status .unprogress ();
24242433 uploading = false ;
@@ -2446,13 +2455,14 @@ private void resumeOrCloseSerialMonitor() {
24462455 }
24472456 }
24482457 try {
2449- if (serialMonitor != null )
2450- serialMonitor .resume (boardPort );
2451- if (boardPort == null ) {
2452- serialMonitor .close ();
2453- handleSerial ();
2454- } else {
2458+ if (serialMonitor != null ) {
24552459 serialMonitor .resume (boardPort );
2460+ if (boardPort == null ) {
2461+ serialMonitor .close ();
2462+ handleSerial ();
2463+ } else {
2464+ serialMonitor .resume (boardPort );
2465+ }
24562466 }
24572467 } catch (Exception e ) {
24582468 statusError (e );
@@ -2513,6 +2523,7 @@ public void run() {
25132523 } catch (Exception e ) {
25142524 e .printStackTrace ();
25152525 } finally {
2526+ avoidMultipleOperations = false ;
25162527 populatePortMenu ();
25172528 }
25182529 status .unprogress ();
@@ -2527,6 +2538,20 @@ public void run() {
25272538 }
25282539 }
25292540
2541+ class TimeoutUploadHandler implements Runnable {
2542+
2543+ public void run () {
2544+ try {
2545+ //10 seconds, than reactivate upload functionality and let the programmer pid being killed
2546+ Thread .sleep (1000 * 10 );
2547+ if (uploading ) {
2548+ avoidMultipleOperations = false ;
2549+ }
2550+ } catch (InterruptedException e ) {
2551+ // noop
2552+ }
2553+ }
2554+ }
25302555
25312556 public void handleSerial () {
25322557 if (serialPlotter != null ) {
@@ -2571,7 +2596,7 @@ public void handleSerial() {
25712596
25722597 // If currently uploading, disable the monitor (it will be later
25732598 // enabled when done uploading)
2574- if (uploading ) {
2599+ if (uploading || avoidMultipleOperations ) {
25752600 try {
25762601 serialMonitor .suspend ();
25772602 } catch (Exception e ) {
@@ -2595,8 +2620,10 @@ public void handleSerial() {
25952620 }
25962621
25972622 try {
2598- serialMonitor .open ();
25992623 serialMonitor .setVisible (true );
2624+ if (!avoidMultipleOperations ) {
2625+ serialMonitor .open ();
2626+ }
26002627 success = true ;
26012628 } catch (ConnectException e ) {
26022629 statusError (tr ("Unable to connect: is the sketch using the bridge?" ));
@@ -2743,6 +2770,59 @@ private void handleBurnBootloader() {
27432770 }).start ();
27442771 }
27452772
2773+ private void handleBoardInfo () {
2774+ console .clear ();
2775+
2776+ String selectedPort = PreferencesData .get ("serial.port" );
2777+ List <BoardPort > ports = Base .getDiscoveryManager ().discovery ();
2778+
2779+ String label = "" ;
2780+ String vid = "" ;
2781+ String pid = "" ;
2782+ String iserial = "" ;
2783+ String protocol = "" ;
2784+ boolean found = false ;
2785+
2786+ for (BoardPort port : ports ) {
2787+ if (port .getAddress ().equals (selectedPort )) {
2788+ label = port .getBoardName ();
2789+ vid = port .getVID ();
2790+ pid = port .getPID ();
2791+ iserial = port .getISerial ();
2792+ protocol = port .getProtocol ();
2793+ found = true ;
2794+ break ;
2795+ }
2796+ }
2797+
2798+ if (!found ) {
2799+ statusNotice (tr ("Please select a port to obtain board info" ));
2800+ return ;
2801+ }
2802+
2803+ if (protocol .equals ("network" )) {
2804+ statusNotice (tr ("Network port, can't obtain info" ));
2805+ return ;
2806+ }
2807+
2808+ if (vid == null || vid .equals ("" ) || vid .equals ("0000" )) {
2809+ statusNotice (tr ("Native serial port, can't obtain info" ));
2810+ return ;
2811+ }
2812+
2813+ if (iserial == null || iserial .equals ("" )) {
2814+ iserial = tr ("Upload any sketch to obtain it" );
2815+ }
2816+
2817+ if (label == null ) {
2818+ label = tr ("Unknown board" );
2819+ }
2820+
2821+ String infos = I18n .format ("BN: {0}\n VID: {1}\n PID: {2}\n SN: {3}" , label , vid , pid , iserial );
2822+ JTextArea textArea = new JTextArea (infos );
2823+
2824+ JOptionPane .showMessageDialog (this , textArea , tr ("Board Info" ), JOptionPane .PLAIN_MESSAGE );
2825+ }
27462826
27472827 /**
27482828 * Handler for File → Page Setup.
0 commit comments