加速度のプロット

前回のは単に数値を表示するだけで全く使えなかった。
今回はXY平面上に「動」「静」「角」の文字をプロットするようにしてみた。

MotionChar.java

携帯を閉じたとき(pauseApp)に、スレッドを止めるようにした。
stop()とかのメソッドがあるかと思ったが、nullを代入してGCに回収させる作法なようだ。

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MotionChar extends MIDlet{
  MotionCanvas canvas;
  Thread thread;
  public MotionChar(){
    canvas = new MotionCanvas();
    Display.getDisplay(this).setCurrent(canvas);
  }
  public void startApp(){
    thread = new Thread(canvas);
    thread.start();
  }
  public void pauseApp(){
    thread = null;
  }
  public void destroyApp(boolean b){}
}

MotionCanvas.java

携帯を閉じたとき(hideNotify)に、センサーを止めるようにした。
動作開始時に高さ方向がTOPあわせになってる。VCENTERが効いてない?

import javax.microedition.lcdui.*;
import com.j_phone.system.*;
public class MotionCanvas extends Canvas implements Runnable {
  MotionDetectiveSensor mds;
  PostureInfo pi;
  public void run() {
    try{
      mds = MotionDetectiveSensor.getDefaultMotionDetectiveSensor();
      mds.startSensor(mds.POSTURE_INFO,mds.CYCLE_20);
      while(true){
        int i;
        for(i=0;i==0;i=mds.getStackCount()) Thread.sleep(200);
        pi = mds.getPostureInfoStack(i);
        repaint();
      }
    }catch(Exception e){}
  }
  public void paint(Graphics g) {
    int ap=g.HCENTER|g.VCENTER,w=getWidth()/2,h=getHeight()/2,a=8,b=20;
    g.setColor(255,255,255);
    g.fillRect(0,0,w*2,h*2);
    g.setColor(0,0,0);
    g.drawLine(w,0,w,h*2);
    g.drawLine(0,h,w*2,h);
    if(pi==null) return;
    int n=pi.getCount();
    int[] dx=pi.getDynamicAccelerationX(0,n),dy=pi.getDynamicAccelerationY(0,n),
          sx=pi.getStaticAccelerationX(0,n),sy=pi.getStaticAccelerationY(0,n),
          ax=pi.getRoll(0,n),ay=pi.getPitch(0,n);
    for(int i=0;i<n;i++){
      g.setColor(0,255-(n-i)*b,0);
      g.drawString("静",sx[i]/a+w,-sy[i]/a+h,ap);
      g.setColor(255-(n-i)*b,0,0);
      g.drawString("動",dx[i]/a+w,-dy[i]/a+h,ap);
      g.setColor(0,0,255-(n-i)*b);
      g.drawString("角",ax[i]+w,-ay[i]+h,ap);
    }
  }
  public void hideNotify(){
    mds.stopSensor();
  }
}

動かしてみた様子メモ

静加速度は動かすのを止めても携帯が傾いたままだと原点に戻らない。角度の値にほぼ対応した動きをする。
少なくとも回転方向の加速度ではない模様。
静加速度、角度ともに動きは遅めで、携帯を水平に戻した瞬間に原点に戻るわけではなく、原点に向かって動いているのが見える。
一方動加速度は普段からバタバタしていて、携帯を振ると瞬間的に振れるがすぐに原点に戻る。
動加速度は携帯の角度を傾けても反応する。このときの戻る動きは振って動かしたときよりも遅い動き。