안드로이드를 공부하고 있는 학생입니다.
지금 센서쪽을 공부하고 있는데
소스 해석이 잘 안되서요
조금이나마 분석을 부탁드려요~
public void onSensorChanged(SensorEvent evt) {
try {
killOnError();
if (evt.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {// 가속도 센서
// 각 배열의 값은(m/s2)단위로 되어있으며, 좁촉힘(Contact Force)을 측정한다.
grav[0] = evt.values[0]; // X축에 적용되는 힘
grav[1] = evt.values[1]; // Y축에 적용되는 힘
grav[2] = evt.values[2]; // Z축에 적용되는 힘
augScreen.postInvalidate();
} else if (evt.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {//자기장 센서
// 모든 값은 micro-Tesla(uT)단위로 되어있으며, x,y,-z축 주변 자기장을 측정
mag[0] = evt.values[0];
mag[1] = evt.values[1];
mag[2] = evt.values[2];
augScreen.postInvalidate();
}
SensorManager.getRotationMatrix(RTmp, I, grav, mag);
SensorManager.remapCoordinateSystem(RTmp, SensorManager.AXIS_X, SensorManager.AXIS_MINUS_Z, R);
tempR.set(R[0], R[1], R[2], R[3], R[4], R[5], R[6], R[7], R[8]);
finalR.toIdentity();
finalR.prod(m4);
finalR.prod(m1);
finalR.prod(tempR);
finalR.prod(m3);
finalR.prod(m2);
finalR.invert();
histR[rHistIdx].set(finalR);
rHistIdx++;
if (rHistIdx >= histR.length)
rHistIdx = 0;
smoothR.set(0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f, 0f);
for (int i = 0; i < histR.length; i++) {
smoothR.add(histR[i]);
}
smoothR.mult(1 / (float) histR.length);
synchronized (ctx.rotationM) {
ctx.rotationM.set(smoothR);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
안드로이드 센서는 가속도센서 방향센서 근접센서 등등.(기억이 다 안남..) 이 있습니다
센서객체는 센서 서비스에 listener를 등록한후 event가 일어나면 센서동작을 하는것이고요.
위에 소스는 각 센서들의 규칙을 소스로 구현해 놓은 것이라..이부분의 소스 보다는 각각의 센서들이 어떻게 어디에서 필요하고 어디에서 왜 동작하는지 큰 흐름의 소스를 분석하시는게 도움이 되리라 생각합니다.
예를 든다면 근접센서가 왜 필요할까? 물체가 가까이 가면 lock이 왜 되어야 하나?
자문해보면 incall시에 사람 머리가 핸드폰에 닿기 때문에 다른 키를 잠그기 위해 근접센서가 필요하겠구나.
그리고 PhoneApp쪽 보면 근접센서구현된 부분이 나옵니다. 이런식으로 작은 코드에 집착하시기 보다 큰흐름을 분석하시는게 좋겠습니다.
개인적인 생각입니다.