From: <jo...@us...> - 2008-10-12 20:49:59
|
Revision: 363 http://mspsim.svn.sourceforge.net/mspsim/?rev=363&view=rev Author: joxe Date: 2008-10-12 20:49:52 +0000 (Sun, 12 Oct 2008) Log Message: ----------- fixed buffering of serial input in the GUI Modified Paths: -------------- mspsim/CHANGE_LOG.txt mspsim/se/sics/mspsim/ui/SerialMon.java Modified: mspsim/CHANGE_LOG.txt =================================================================== --- mspsim/CHANGE_LOG.txt 2008-10-12 16:16:45 UTC (rev 362) +++ mspsim/CHANGE_LOG.txt 2008-10-12 20:49:52 UTC (rev 363) @@ -11,6 +11,7 @@ - added SFD capture interrupt support for CC2420 - improved correctness of timer when reconfiguring CPU clock speed (MCLK) - improved interrupt handling in MSP430 core +- added CLI command printcalls that prints all function calls 0.93 Modified: mspsim/se/sics/mspsim/ui/SerialMon.java =================================================================== --- mspsim/se/sics/mspsim/ui/SerialMon.java 2008-10-12 16:16:45 UTC (rev 362) +++ mspsim/se/sics/mspsim/ui/SerialMon.java 2008-10-12 20:49:52 UTC (rev 363) @@ -42,8 +42,12 @@ package se.sics.mspsim.ui; import java.awt.BorderLayout; import java.awt.Color; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; +import java.util.ArrayList; + import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JScrollPane; @@ -63,9 +67,36 @@ private JLabel statusLabel; private String text = "*** Serial mon for MSPsim ***\n"; + private final static int BUFFER_SIZE = 20; + private byte[] buffer = new byte[BUFFER_SIZE]; + private int wPos = 0; + private int rPos = 0; + private int bsize = 0; + + private ActionListener bufferTimer = new ActionListener() { + public void actionPerformed(ActionEvent evt) { + if (bsize > 0) { + if (usart.isReceiveFlagCleared()) { + usart.byteReceived(buffer[rPos]); + rPos = (rPos + 1) % BUFFER_SIZE; + if (bsize == 20) { + statusLabel.setText(keyBuffer.toString()); + } + bsize--; + } + } else { + timer.stop(); + } + } + }; + + private javax.swing.Timer timer = new javax.swing.Timer(100, bufferTimer); private int lines = 1; private boolean isUpdatePending = false; private StringBuilder keyBuffer = new StringBuilder(); + + + public SerialMon(USART usart, String name) { this.name = name; @@ -136,21 +167,19 @@ public void keyTyped(KeyEvent key) { char c = key.getKeyChar(); - if(!usart.isReceiveFlagCleared()) { - try { - // Wait for at most 2 seconds before giving up - for (int i = 0, n = 20; !usart.isReceiveFlagCleared() && i < n; i++) { - Thread.sleep(100); - } - } catch (InterruptedException e) { - // Ignore + // Send it to the usart if possible! + if (usart.isReceiveFlagCleared() && bsize == 0) { + usart.byteReceived(c & 0xff); + } else if (bsize < BUFFER_SIZE){ + buffer[wPos] = (byte) (c & 0xff); + wPos = (wPos + 1) % BUFFER_SIZE; + bsize++; + if (!timer.isRunning()) { + timer.start(); } } - // Send it to the usart if possible! - if (usart.isReceiveFlagCleared()) { - usart.byteReceived(c & 0xff); - + if (bsize < BUFFER_SIZE) { // Visualize the input if (c == '\n') { statusLabel.setText(PREFIX); @@ -162,6 +191,7 @@ } } else { statusLabel.getToolkit().beep(); + statusLabel.setText("*** input buffer full ***"); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |