87 lines
2.8 KiB
C++

//======================================================================================================
// Copyright 2023, NaturalPoint Inc.
//======================================================================================================
/**
* This is an example glove device provided to demonstrate how a plugin device can be set up as a glove device
* in Motive. This class derives from GloveDeviceBase class which contains basic setups required by gloves.
*/
#pragma once
#include <memory>
#include <list>
// OptiTrack Peripheral Device API
#include "dllcommon.h"
#include "GloveDeviceBase.h"
#include "GloveDataFormat.h"
#include "ExampleGloveAdapterSingleton.h"
namespace OptiTrackPluginDevices
{
namespace ExampleDevice{
class ExampleGloveDevice;
class ExampleGloveDeviceFactory;
void ExampleGlove_EnumerateDeviceFactories(AnalogSystem::IDeviceManager* pDeviceManager, std::list<std::unique_ptr<AnalogSystem::IDeviceFactory>>& dfs);
void ExampleGlove_Shutdown();
/**
* For creating a device in Motive, a factory class must be created first. This example class inherits from the
* parent glove device factory where common glove functionalities and configurations are set.
*/
class ExampleGloveDeviceFactory : public OptiTrackPluginDevices::GloveDeviceFactoryBase
{
public:
ExampleGloveDeviceFactory(std::string deviceName, sGloveDeviceBaseInfo deviceInfo) :
GloveDeviceFactoryBase(deviceName.c_str(), deviceInfo.gloveId), mDeviceInfo(deviceInfo)
{
}
/**
* Return device factory name
*/
virtual const char* Name() const override;
/**
* The following method gets called by Motive. It creates and returns a new instance of device and transfers ownership to Motive.
*/
std::unique_ptr<AnalogSystem::IDevice> Create() const override;
private:
sGloveDeviceBaseInfo mDeviceInfo;
};
/**
* ExampleGloveDevice inherits from GloveDeviceBase and demonstrates how a glove plugin device can be created.
* Each device gets their own collection thread where they populate the channel data. This class is inherited from the parent
* GloveDeviceBase class where the basic glove setup is shown.
*/
class ExampleGloveDevice : public OptiTrackPluginDevices::GloveDeviceBase
{
public:
ExampleGloveDevice(uint32_t serial, sGloveDeviceBaseInfo deviceInfo);
virtual ~ExampleGloveDevice() = default;
// IDevice implementation
virtual bool Configure();
virtual bool Deconfigure();
virtual bool StartCapture();
virtual bool StopCapture();
virtual void OnPropertyChanged(const char* propertyName);
private:
/**
* Collection thread for populating glove analog data channels
*/
static unsigned long __stdcall CollectionThread(LPVOID Context);
unsigned long DoCollectionThread() override;
void* mCollectionThread = nullptr;
};
}
}