Получение информации с нескольких датчиков с помощью Windows Sensor API - PullRequest
0 голосов
/ 23 января 2019

Я использую Windows Sensor API для получения информации от различных датчиков, включая акселерометр и гироскоп.(https://docs.microsoft.com/en-us/windows/desktop/sensorsapi/sensor-api-programming-guide)

Моя первоначальная реализация драйвера датчика для акселерометра сработала - я могу асинхронно получить значения для этого датчика.

Рабочий код инициализации для одного датчика (акселерометр) выглядит следующим образом:следующее:

void initialize1(AccelerometerCallBack callBack) {

    HRESULT hr = S_OK;
    CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

    ISensorManager* pSensorManager = NULL;
    ISensorCollection* pSensorColl = NULL;
    ISensor* accelerometer = NULL;

    hr = CoCreateInstance(CLSID_SensorManager,
        NULL, CLSCTX_INPROC_SERVER,
        IID_PPV_ARGS(&pSensorManager));

    if (SUCCEEDED(hr))
    {
        printf("Succeeded getting Sensor...\n");
        ULONG ulCount = 0;
        // Verify that the collection contains
        // at least one sensor.
        hr = pSensorColl->GetCount(&ulCount);
        if (SUCCEEDED(hr))
        {
            if (ulCount < 1)
            {
                wprintf_s(L"\nNo sensors of the requested category.\n");
                hr = E_UNEXPECTED;
            }
        }
    }
    else {
        printf("Failed to get Sensor...\n");
    }

    if (SUCCEEDED(hr))
    {
        // Get the first available sensor.
        hr = pSensorColl->GetAt(0, &accelerometer);

        BSTR name = 0;
        hr = accelerometer->GetFriendlyName(&name);
        wprintf(L"%s\n", name);
    }

    AccelerometerEvent* pEventClass = NULL;
    ISensorEvents* pMyEvents = NULL;
    if (SUCCEEDED(hr))
    {
        // Create an instance of the event class.
        pEventClass = new(std::nothrow) AccelerometerEvent();
        pEventClass->globalCallBack = callBack;
    }

    if (SUCCEEDED(hr))
    {
        // Retrieve the pointer to the callback interface.
        hr = pEventClass->QueryInterface(IID_PPV_ARGS(&pMyEvents));
    }

    if (SUCCEEDED(hr))
    {
        // Start receiving events.
        hr = accelerometer->SetEventSink(pMyEvents);
    }

    MSG msg;
    BOOL bRet;
    while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
    {
        if (bRet == -1)
        {
        // handle the error and possibly exit
        }
        else
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
}

Теперь я хотел одновременно получить гироскоп, поэтому я добавляю похожий код инициализации:

void initialize2(GyroscopeCallBack callBack);, который делает то же самое, что и выше.

Теперь мой слой C # запускает код, подобный следующему:

internal void Start()
{
    AccelerometerCallBack myCallBack1 = new AccelerometerCallBack(onAccelerometerDataChanged);
    initialize1(myCallBack1);

    GyroscopeCallBack myCallBack2 = new GyroscopeCallBack(onGyroscopeDataChanged);
    initialize2(myCallBack2);
}

Однако через обратный вызов поступает только информация об акселерометре, а не о гироскопе.

  • Я подтвердил, что мойУстройство имеет оба датчика правильного типа
  • Я подтвердил, что все мои функции обратного вызова и интерфейс C # к C ++ работают правильно

Как правильно выбрать «выборку»несколько датчиков (вместо одного), использующих API-интерфейс Windows Sensor?

На официальном веб-сайте нет примеров того, как это сделать, и толькоСообщение SO ( Предоставление нескольких датчиков на одном устройстве API-интерфейсу Windows Sensor ) не помогает.Спасибо!

1 Ответ

0 голосов
/ 25 января 2019

Это сработало!Решением было удалить насос сообщений и использовать опцию COINIT_MULTITHREADED для Coinitializine().Спасибо за помощь.

...