본문 바로가기

TechLog

WP 가속도계 다루기

윈도우 폰에서 가속도계를 프로그래밍하려면 Accelerometer 클래스를 사용해야 한다. 이 클래스를 사용하려면 Microsoft.Devices.Sensors 어셈블리를 참조하고, using 지시자로 Microsoft.Devices.Sensors 네임스페이스를 정의해야 한다. 그런 다음 WMAppManifest.xml 파일에 다음 태그를 포함시켜야 한다. (프로젝트를 생성하면 기본적으로 포함되어 있다)

 

<Capability Name="ID_CAP_SENSORS" />

 

그리고 Accelerometer 클래스의 인스턴스를 생성한 후, 이 객체의 ReadingChanging 이벤트를 핸들링한 다음, Start 메서드를 호출하면 된다.

 

Accelerometer accelerometer = new Accelerometer();
public MainPage()
{
    InitializeComponent();
    accelerometer.ReadingChanged += 
        new EventHandler<AccelerometerReadingEventArgs>(accelerometer_ReadingChanged);
    try
    {
        accelerometer.Start();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

void accelerometer_ReadingChanged(object sender, AccelerometerReadingEventArgs e)
{
    System.Diagnostics.Debug.WriteLine(
        string.Format("X:{0} Y:{1} Z:{2}", e.X, e.Y, e.Z));
}

 

위와 같은 방식으로 사용할 수 있다. MSDN에서는 간혹 Accelerometer의 Start 메서드가 예외를 일으킬 수 있기 때문에 예외 처리를 사용하라고 권장하고 있다. Accelerometer 클래스의 사용이 끝나면 Stop 메서드를 호출하여 가속도계의 데이터를 수신하지 않도록 해야 한다. 그 외에 State 프로퍼티를 사용하면 가속도계가 현재 사용 가능한지, 어떤 상태인지 등을 알 수 있다.

이벤트 핸들러에는 인자로 AccelerometerReadingEventArgs 타입 객체가 전달된다. 이 객체에는 벡터값을 나타내는 double 타입의 X, Y, Z 프로퍼티와 데이터를 수신한 시점을 나타내는 DateTimeOffset 타입의 TimeStamp 프로퍼티가 있다.

Accelerometer 객체의 멤버는 내부적으로 작업자 스레드를 사용한다. 만약 이벤트 핸들러에서 catch를 통해 예외가 핸들링될 경우, 예외 처리 코드에서 UI에 관련된 객체에 접근하고자 할 때에는 앞에서 설명했던 것과 같이 메인 UI 스레드에서 처리해야 한다는 점에 유의하자.