SunSPOT(http://jp.sun.com/products/software/sunspot/)
SunSPOTの端末で取得したXYZ軸方向の加速度をBaseStationに転送し,ホストPC上でグラフ化します.
グラフ化にはJFreeChartを使用しました.
JFreeChart(http://www.jfree.org/jfreechart/)
[端末側SunSPOT AccelationOnSunSpot.java]
import com.sun.spot.sensorboard.EDemoBoard; import com.sun.spot.io.j2me.radiogram.*; import com.sun.spot.sensorboard.peripheral.IAccelerometer3D; import com.sun.spot.util.Utils; import javax.microedition.io.*; import javax.microedition.midlet.MIDlet; import javax.microedition.midlet.MIDletStateChangeException; public class AccelationOnSunSpot extends MIDlet { private static final int HOST_PORT = 67; protected void startApp() throws MIDletStateChangeException { RadiogramConnection rCon = null; Datagram dg = null; IAccelerometer3D accelerometer = EDemoBoard.getInstance().getAccelerometer(); try { rCon = (RadiogramConnection) Connector.open("radiogram://broadcast:" + HOST_PORT); dg = rCon.newDatagram(50); // only sending 12 bytes of data } catch (Exception e) { System.err.println("Caught " + e + " in connection initialization."); System.exit(1); } double x,y,z; while (true) { try { x = accelerometer.getAccelX(); y = accelerometer.getAccelY(); z = accelerometer.getAccelZ(); dg.reset(); dg.writeDouble(x); dg.writeDouble(y); dg.writeDouble(z); rCon.send(dg); Utils.sleep(100); } catch (Exception e) { System.err.println("Caught " + e + " while collecting/sending sensor sample."); } } } protected void pauseApp() { // This will never be called by the Squawk VM } protected void destroyApp(boolean arg0) throws MIDletStateChangeException { // Only called if startApp throws any exception other than MIDletStateChangeException } }
[ホスト側BaseStation AccelationOnDesktop.java]
import com.sun.spot.io.j2me.radiogram.*; import javax.microedition.io.*; import javax.swing.JFrame; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.DateAxis; import org.jfree.chart.axis.DateTickMarkPosition; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.labels.StandardXYToolTipGenerator; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.StandardXYItemRenderer; import org.jfree.chart.renderer.xy.XYItemRenderer; import org.jfree.chart.title.LegendTitle; import org.jfree.data.time.Millisecond; import org.jfree.data.time.TimeSeries; import org.jfree.data.time.TimeSeriesCollection; import java.awt.Font; public class AccelationOnDesktop extends JFrame implements Runnable{ private static final int HOST_PORT = 67; private Thread th; private TimeSeries XSeries; private TimeSeries YSeries; private TimeSeries ZSeries; public AccelationOnDesktop(){ initChart(); th = new Thread(this); th.start(); } public void initChart(){ //create DataSeries object XSeries = new TimeSeries("X", Millisecond.class); YSeries = new TimeSeries("Y", Millisecond.class); ZSeries = new TimeSeries("Z", Millisecond.class); TimeSeriesCollection dataset = new TimeSeriesCollection(); dataset.addSeries(XSeries); dataset.addSeries(YSeries); dataset.addSeries(ZSeries); DateAxis domainAxis = new DateAxis("Time"); domainAxis.setTickMarkPosition(DateTickMarkPosition.MIDDLE); ValueAxis rangeAxis = new NumberAxis("Acceleration"); XYItemRenderer renderer = new StandardXYItemRenderer(); renderer.setToolTipGenerator(StandardXYToolTipGenerator.getTimeSeriesInstance()); XYPlot plot = new XYPlot(dataset,domainAxis,rangeAxis,renderer); plot.getRenderer().setToolTipGenerator(StandardXYToolTipGenerator.getTimeSeriesInstance()); JFreeChart chart = new JFreeChart("XYZ Acceleration", JFreeChart.DEFAULT_TITLE_FONT, plot, true); LegendTitle legend = chart.getLegend(); legend.setItemFont(new Font("Ariel", Font.BOLD, 20)); ChartPanel cPanel = new ChartPanel (chart); this.add(cPanel); } public void run() { RadiogramConnection rCon = null; Datagram dg = null; double x,y,z; try { rCon = (RadiogramConnection) Connector.open("radiogram://:" + HOST_PORT); dg = rCon.newDatagram(rCon.getMaximumLength()); } catch (Exception e) { System.err.println("setUp caught " + e.getMessage()); } while (true) { try { rCon.receive(dg); x = dg.readDouble(); y = dg.readDouble(); z = dg.readDouble(); XSeries.add(new Millisecond(), x); YSeries.add(new Millisecond(), y); ZSeries.add(new Millisecond(), z); } catch (Exception e) { System.err.println("Caught " + e + " while reading sensor samples."); } } } public static void main(String[] args) throws Exception { AccelationOnDesktop aod = new AccelationOnDesktop(); aod.setSize(600,300); aod.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); aod.setVisible(true); } }
実行結果
