Bagikan melalui


Mengambil Bidang Data Sensor

Penting

Gunakan API Sensor UWP sebagai gantinya.

API Sensor berbasis COM tidak digunakan lagi dan tidak boleh digunakan dalam aplikasi baru. Tidak ada fitur atau peningkatan tambahan yang direncanakan, dan dukungan akan dibatasi.

Topik ini menjelaskan cara mengambil data dari sensor, secara sinkron dan asinkron.

Mengambil Data Secara Sinkron

Anda dapat mengambil data sensor secara sinkron dengan memanggil ISensor::GetData.

Contoh kode berikut mengambil laporan data sensor, lalu mengambil tiga nilai bidang data individual. Sensor sampel menyediakan data kustom tentang waktu lokal saat ini dalam bidang data jam, menit, dan kedua. Variabel bernama pSensor berisi penunjuk ke ISensor yang mewakili sensor yang memasok data.

if(SUCCEEDED(hr))
{
    // Get the data report.
    hr = pSensor->GetData(&pReport);
}
  
if(SUCCEEDED(hr))
{
    PROPVARIANT var = {};

    hr = pReport->GetSensorValue(SAMPLE_SENSOR_DATA_TYPE_HOUR, &var);

    if(SUCCEEDED(hr))
    {
        if(var.vt == VT_UI4)
        {
            // Get the hour value.
            ulHour = var.ulVal;                
        }
    }

    PropVariantClear(&var);

    hr = pReport->GetSensorValue(SAMPLE_SENSOR_DATA_TYPE_MINUTE, &var);

    if(SUCCEEDED(hr))
    {
        if(var.vt == VT_UI4)
        {
            // Get the hour value.
            ulMinute = var.ulVal;
        }
    }

    PropVariantClear(&var);

    hr = pReport->GetSensorValue(SAMPLE_SENSOR_DATA_TYPE_SECOND, &var);

    if(SUCCEEDED(hr))
    {
        if(var.vt == VT_UI4)
        {
            // Get the hour value.
            ulSecond = var.ulVal;
        }
    }

    PropVariantClear(&var);        

    if(SUCCEEDED(hr))
    {
        // Print the local time to the console window.
        wprintf_s(L"\nCurrent local time is: \n");
        wprintf_s(L"%02d:%02d:%02d (synchronous)\n\n", ulHour, ulMinute, ulSecond);
    }

Mengambil Data Secara Asinkron

Anda dapat menerima data sensor secara asinkron dengan mendaftar untuk menerima event ISensorEvents::OnDataUpdated. Untuk memahami cara menerima panggilan balik peristiwa sensor, lihat Menggunakan Peristiwa API Sensor.

Contoh kode berikut menunjukkan implementasi ISensorEvents::OnDataUpdated yang mengambil nilai data dari laporan data yang disediakan oleh peristiwa. Sensor sampel menyediakan data kustom tentang waktu lokal saat ini dalam bidang data jam, menit, dan kedua.

STDMETHODIMP OnDataUpdated(
        ISensor *pSensor,
        ISensorDataReport *pNewData)
{
    HRESULT hr = S_OK;

    if(NULL == pNewData ||
       NULL == pSensor)
    {
        return E_INVALIDARG;
    }

    ULONG ulHour = 0;
    ULONG ulMinute = 0;
    ULONG ulSecond = 0;

    PROPVARIANT var = {};

    hr = pNewData->GetSensorValue(SAMPLE_SENSOR_DATA_TYPE_HOUR, &var);

    if(SUCCEEDED(hr))
    {
        if(var.vt == VT_UI4)
        {
            // Get the hour value.
            ulHour = var.ulVal;                
        }
    }

    PropVariantClear(&var);

    if(SUCCEEDED(hr))
    {
        hr = pNewData->GetSensorValue(SAMPLE_SENSOR_DATA_TYPE_MINUTE, &var);
    }

    if(SUCCEEDED(hr))
    {
        if(var.vt == VT_UI4)
        {
            // Get the hour value.
            ulMinute = var.ulVal;
        }
    }

    PropVariantClear(&var);

    if(SUCCEEDED(hr))
    {
        hr = pNewData->GetSensorValue(SAMPLE_SENSOR_DATA_TYPE_SECOND, &var);
    }

    if(SUCCEEDED(hr))
    {
        if(var.vt == VT_UI4)
        {
            // Get the hour value.
            ulSecond = var.ulVal;
        }
    }

    PropVariantClear(&var);

    if(SUCCEEDED(hr))
    {
        // Print
        wprintf_s(L"Current local time is: \n");
        wprintf_s(L"%02d:%02d:%02d (asynchronous)\n", ulHour, ulMinute, ulSecond);
    }

    return hr;
}