Я использую 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 ) не помогает.Спасибо!