/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package madsdf.shimmer.gui; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; import info.monitorenter.gui.chart.Chart2D; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; import java.util.prefs.Preferences; import javax.swing.SpinnerNumberModel; import madsdf.shimmer.event.Globals; import madsdf.shimmer.glview.ShimmerAngleConverter; import madsdf.shimmer.glview.ShimmerCanvas; import madsdf.shimmer.gui.ChartsDrawer.Data; /** * * @author julien */ public class ShimmerDataPanel extends javax.swing.JPanel { private static final Logger log = Logger.getLogger(ShimmerDataPanel.class.getName()); private final int DEFAULT_MOVEMENT_LENGTH = 75; private BluetoothDeviceCom connectedDevice; private final EventBus eventBus; private final String btid; private SpinnerNumberModel lenSpinnerModel; // The class drawing the chart private ChartsDrawer chartsDrawer; // Controller for OpenGL display private ShimmerAngleConverter angleConverter; private ShimmerCanvas shimmerCanvas; private Object sampleListener; public ShimmerDataPanel(String btid) { initComponents(); shimmerCanvas = (ShimmerCanvas)panGL; eventBus = Globals.getBusForShimmer(btid); angleConverter = new ShimmerAngleConverter(eventBus, txtLog); lenSpinnerModel = (SpinnerNumberModel) lenSpinner.getModel(); lenSpinnerModel.setValue(DEFAULT_MOVEMENT_LENGTH); // Eventbus registration eventBus.register(shimmerCanvas); eventBus.register(angleConverter); txtLog.setEditable(false); labBtId.setText(btid); this.btid = btid; new Thread(){ @Override public void run() { connect(); } }.start(); setCalibratedChart(cbCalibrated.isSelected()); } public void shutdown() { connectedDevice.stop(); shimmerCanvas.stop(); } private void connect() { try { log.info("Connecting to shimmer " + btid + "..."); final String btServiceID = "btspp://00066646" + btid + ":1;authenticate=false;encrypt=false;master=false"; connectedDevice = new BluetoothDeviceCom(eventBus, btid); connectedDevice.connect(btServiceID); if (!connectedDevice.isCalibrated()) { log.info("No calibration available"); cbCalibrated.setSelected(false); setCalibratedChart(false); cbCalibrated.setEnabled(false); } else { log.info("Calibration available"); cbCalibrated.setEnabled(true); } log.info("Connected to shimmer"); } catch (IOException ex) { log.log(Level.SEVERE, "Couldn't connect to : " + btid + " : " + ex.getMessage()); } } private void setCalibratedChart(boolean calibrated) { // Replace sample listener if (sampleListener != null) { eventBus.unregister(sampleListener); } chartsDrawer = new ChartsDrawer((Chart2D) panAccel, (Chart2D) panGyro); if (calibrated) { sampleListener = new Object() { @Subscribe public void onSample(AccelGyro.CalibratedSample sample) { chartsDrawer.addSample(sample); } }; } else { sampleListener = new Object() { @Subscribe public void onSample(AccelGyro.UncalibratedSample sample) { chartsDrawer.addSample(sample); } }; } eventBus.register(sampleListener); } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { jPanel2 = new javax.swing.JPanel(); panAccel = new Chart2D(); panGyro = new Chart2D(); panGL = ShimmerCanvas.createCanvas(this); panLog = new javax.swing.JScrollPane(); txtLog = new javax.swing.JTextArea(); jPanel1 = new javax.swing.JPanel(); btnSave = new javax.swing.JButton(); cbCalibrated = new javax.swing.JCheckBox(); labBtId = new javax.swing.JLabel(); jLabel1 = new javax.swing.JLabel(); lenSpinner = new javax.swing.JSpinner(); jPanel2.setLayout(new java.awt.GridLayout(2, 2, 5, 5)); panAccel.setName("panAccel"); // NOI18N javax.swing.GroupLayout panAccelLayout = new javax.swing.GroupLayout(panAccel); panAccel.setLayout(panAccelLayout); panAccelLayout.setHorizontalGroup( panAccelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 245, Short.MAX_VALUE) ); panAccelLayout.setVerticalGroup( panAccelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 207, Short.MAX_VALUE) ); jPanel2.add(panAccel); panGyro.setName("panAccel"); // NOI18N javax.swing.GroupLayout panGyroLayout = new javax.swing.GroupLayout(panGyro); panGyro.setLayout(panGyroLayout); panGyroLayout.setHorizontalGroup( panGyroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 245, Short.MAX_VALUE) ); panGyroLayout.setVerticalGroup( panGyroLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 207, Short.MAX_VALUE) ); jPanel2.add(panGyro); javax.swing.GroupLayout panGLLayout = new javax.swing.GroupLayout(panGL); panGL.setLayout(panGLLayout); panGLLayout.setHorizontalGroup( panGLLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 245, Short.MAX_VALUE) ); panGLLayout.setVerticalGroup( panGLLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGap(0, 207, Short.MAX_VALUE) ); jPanel2.add(panGL); txtLog.setColumns(20); txtLog.setFont(new java.awt.Font("Monospaced", 0, 12)); // NOI18N txtLog.setRows(5); panLog.setViewportView(txtLog); jPanel2.add(panLog); btnSave.setText("Save"); btnSave.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btnSaveActionPerformed(evt); } }); cbCalibrated.setText("Calibrated"); cbCalibrated.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { cbCalibratedActionPerformed(evt); } }); labBtId.setText("jLabel1"); jLabel1.setText("Movement length"); lenSpinner.setModel(new javax.swing.SpinnerNumberModel()); javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1); jPanel1.setLayout(jPanel1Layout); jPanel1Layout.setHorizontalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap() .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(lenSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, 69, javax.swing.GroupLayout.PREFERRED_SIZE) .addGap(0, 0, Short.MAX_VALUE)) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel1Layout.createSequentialGroup() .addComponent(btnSave) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(labBtId) .addGap(96, 96, 96) .addComponent(cbCalibrated))) .addContainerGap()) ); jPanel1Layout.setVerticalGroup( jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(jPanel1Layout.createSequentialGroup() .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1) .addComponent(lenSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGap(18, 18, 18) .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(btnSave) .addComponent(cbCalibrated) .addComponent(labBtId)) .addContainerGap()) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addGap(21, 21, 21) .addComponent(jPanel2, javax.swing.GroupLayout.DEFAULT_SIZE, 419, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addContainerGap()) ); }// </editor-fold>//GEN-END:initComponents private void btnSaveActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnSaveActionPerformed final int length = (Integer)lenSpinnerModel.getValue(); java.awt.EventQueue.invokeLater(new Runnable() { public void run() { FileWriter output = null; final Data data = chartsDrawer.getRecentData(); new CaptureEditFrame("movements", btid, data.accel, data.gyro, length).setVisible(true); } }); }//GEN-LAST:event_btnSaveActionPerformed private void cbCalibratedActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbCalibratedActionPerformed setCalibratedChart(cbCalibrated.isSelected()); }//GEN-LAST:event_cbCalibratedActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btnSave; private javax.swing.JCheckBox cbCalibrated; private javax.swing.JLabel jLabel1; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JLabel labBtId; private javax.swing.JSpinner lenSpinner; private javax.swing.JPanel panAccel; private javax.swing.JPanel panGL; private javax.swing.JPanel panGyro; private javax.swing.JScrollPane panLog; private javax.swing.JTextArea txtLog; // End of variables declaration//GEN-END:variables }