После соединения с устройством через ваш адаптер пользователи могут хотеть просмотреть или изменить значения свойств устройства. Например, пользователь может настроить значение Brightness
свойство или получает текущее значение Temperature
свойство. (Для получения информации о том, как задать свойства, которые вы хотите отсоединить пользователям, видеть Свойства устройства Создания.)
Чтобы получить уведомление от механизма, когда пользователь захочет просмотреть или изменить свойство, сопоставьте объект listener со свойством. Тулбокс задает два типа классов прослушивателя: прослушиватели get, которые отвечают на get
команды и прослушиватели set, которые отвечают на set
команды.
Чтобы оказать поддержку для получения и установки значений свойств, выполните эту процедуру:
Задайте класс прослушивателя соответствующего типа. Тулбокс задает два абстрактных класса, один для получают прослушиватели и один для прослушивателей набора, из которых вы выводите свой класс.
Реализуйте виртуальную функцию, требуемую классом.
Сопоставьте экземпляр своего класса прослушивателя со свойством.
Следующие разделы описывают, как настроить, получают прослушиватели и устанавливают прослушиватели и в вашем адаптере.
Получить уведомление от механизма, когда пользователь запрашивает текущее значение свойства с помощью get
команда:
Задайте получить класс прослушивателя, выведя его из IPropCustomGetFcn
абстрактный класс — видит Определение Получить Класса Прослушивателя.
Реализуйте getValue()
виртуальная функция в вашем классе прослушивателя — видит Создание getValue () Функция для Вашего Класса.
Сопоставьте экземпляр своего класса прослушивателя со свойством — смотрите, что Соединение Получает Прослушиватели со Свойствами.
Создайте получить класс прослушивателя, выведя его из абстрактного класса IPropCustomGetFcn
, как показано в следующем примере.
В этом примере конструктор принимает указатель на IAdaptor
объект. Поскольку тулбокс устанавливает прослушиватели на базисе на экземпляр, передавание этого указателя может быть полезным, но это не требование.
IPropCustomGetFcn
класс задает одну виртуальную функцию: getValue()
функция членства. В этой функции вы задаете, как ваш адаптер отвечает, когда пользователь запрашивает текущее значение свойства. Для получения дополнительной информации о getValue()
функционируйте, смотрите Создание getValue () Функция для Вашего Класса.
#include "mwadaptorimaq.h" #include "MyDeviceImaq.h" // For this example class MyDevicePropGetListener : public IPropCustomGetFcn { public: // Constructor/Destructor MyDevicePropGetListener(MyDeviceAdaptor* parent): _parent(parent) {} virtual ~MyDevicePropGetListener() {}; virtual void getValue(imaqkit::IPropInfo* propertyInfo, void* value); private: // Declare handle to parent as member data. MyDeviceAdaptor* _parent; };
Когда пользователь запрашивает текущее значение свойства, механизм вызывает getValue()
функция получить класса прослушивателя сопоставлена со свойством.
Ваш getValue()
функция должна принять два параметра:
void getValue(IPropInfo* propertyInfo, void* value)
propertyInfo
указатель на IPropInfo
объект. IPropInfo
класс является интерфейсом, который позволяет вам получить информацию о свойстве. Например, использование IPropInfo
функции можно получить имя свойства, его тип хранения и его значение по умолчанию. Эта информация полезна, если у вас есть типовой класс прослушивателя, который обрабатывает несколько свойств.
value
указатель на местоположение в памяти, где ваш адаптер хранит требуемое значение свойства. — Механизм передает это значение как void*
. Ваш getValue()
функция должна бросить значение к соответствующему типу данных C++. Следующая таблица говорит который тип данных C++ бросить к для всех типов свойства, поддержанных набором адаптера.
imaqkit:: PropertyTypes | Тип данных C++ |
---|---|
|
|
|
|
|
|
|
|
|
|
Для нескалярных типов данных, векторы символов, двойные массивы и целочисленные массивы, ваш класс прослушивателя должен выделить достаточную память для текущего значения свойства с помощью new[]
оператор. Механизм удаляет эту память, вызывая delete[]
. Пример с помощью свойства вектора символов:
char** returnStr = reinterpret_cast<char**>(value); *returnStr = imaqkit::imaqmalloc(sizeof(char) * (stringLength)); strcpy(*returnStr, currentPropertyValueString);
Предложенный Алгоритм для getValue () Функция. Проект getValue()
функция меняется в зависимости от потребностей вашего устройства и средств, предлагаемых его SDK. Например, вы могли создать, каждый получает класс прослушивателя, который обрабатывает запросы значения для всех свойств в конкретном контейнере свойства (общий или специфичный для устройства). В этом случае, getValue()
функция включает оператор switch со случаями, которые обрабатывают каждое отдельное свойство.
В качестве альтернативы задайте отдельное, получают класс прослушивателя для каждого свойства или каждого типа хранения свойства. Затем механизм вызывает определенный прослушиватель для заданного свойства.
Также можно задать, получают классы прослушивателя, которые соответствуют способу, которым SDK устройства организует настройку свойства. Например, если SDK обеспечивает одну функцию, чтобы сконфигурировать все свойства устройства, можно задать получить класс прослушивателя для этих свойств.
Пример. Этот пример показывает реализацию getValue()
функция для целочисленных типов:
void MyDevicePropGetListener::getValue(IPropInfo* propertyInfo, void* value) { // Get property name from the IPropInfo object. const char* propname = propertyInfo->getPropertyName(); // Get the value using whatever facility your device's SDK provides. *reinterpret_cast<const int*>(value) = sdk_function_get(); // For debug purposes only. imaqkit::adaptorWarn("In listener. Property name is %s\n",propname); }
Чтобы настроить прослушиватель для свойства, вы сопоставляете объект прослушивателя со свойством в контейнере свойства. Следующий пример показывает, как добавить, получают прослушиватели для всех специфичных для устройства свойств в контейнере свойства адаптера. Средства записи адаптера обычно настраивают прослушиватели свойства в своем конструкторе класса адаптера — смотрите Реализацию Вашего Конструктора класса Адаптера.
Получите указатель на соответствующий контейнерный объект свойства.
IEngine
объект имеет две функции членства, которые возвращают указатели на контейнеры свойства (IPropContainer
объекты. Пример вызывает IEngine
класс getAdaptorPropContainer()
функция членства, чтобы получить специфичный для устройства контейнер свойства:
imaqkit::IPropContainer* adaptorPropContainer = getEngine()->getAdaptorPropContainer();
Добавьте получить прослушиватель свойства в контейнере, с помощью IPropContainer
объект setCustomGetFcn()
функция. В качестве аргументов задайте имя свойства и указатель на объект прослушивателя.
Примечание
Поскольку тулбокс удаляет каждый экземпляр объекта прослушивателя, когда пользователь удаляет объект ввода видео, сопоставьте новый экземпляр объекта прослушивателя с каждым свойством.
Следующий пример выполняет итерации через все свойства в контейнере свойства адаптера, сопоставляя получить объект прослушивателя с каждым.
void MyDeviceAdaptor::MyDeviceAdaptor() { // get a handle to the property container IPropContainer* propContainer = getEngine()->getAdaptorPropContainer(); // Determine the number of properties in the container. int numDeviceProps = propContainer->getNumberProps(); // Retrieve the names of all the properties in the container const char **devicePropNames = new const char*[numDeviceProps]; propContainer->getPropNames(devicePropNames); // Create a variable to point to a property get listener object. MyDevicePropGetListener* getListener; // For each property in the container... for (int i = 0; i < numDeviceProps; i++){ // Create a get listener object... getListener = new MyDevicePropGetListener(this); // and associate it with a specific property. propContainer->setCustomGetFcn(devicePropNames[i], getListener); } // clean up the array of property names. delete [] devicePropNames; }
Получить уведомление от механизма, когда пользователь изменяет значение свойства с помощью set
команда:
Задайте класс прослушивателя набора, выведя его из IPropPostSetListener
абстрактный класс — видит Определение Класса Прослушивателя Набора.
Реализуйте notify()
виртуальная функция в вашем классе прослушивателя набора — видит Создание уведомления () Функция для Вашего Класса.
Сопоставьте экземпляр своего класса прослушивателя набора со свойством — смотрите Прослушиватели Набора Соединения со Свойствами.
Создайте класс прослушивателя набора, выведя его из абстрактного класса IPropPostSetListener
, как показано в следующем примере. (Имя класса включает слово Post
потому что тулбокс уведомляет прослушиватели после того, как он обновит значение свойства, сохраненное в контейнере.)
В этом примере конструктор принимает указатель на IAdaptor
объект. Поскольку тулбокс устанавливает прослушиватели на базисе на экземпляр, передавание этого указателя может быть полезным, но это не требование.
IPropPostSetListener
класс задает одну виртуальную функцию: notify()
функция членства. В этой функции вы задаете, как ваш адаптер отвечает, когда пользователь изменяет значение свойства. Для получения дополнительной информации смотрите Создание уведомления () Функция для Вашего Класса.
#include "mwadaptorimaq.h" #include "MyDeviceImaq.h" // For this example class MyDevicePropSetListener : public IPropPostSetListener { public: // Constructor/Destructor MyDevicePropSetListener(MyDeviceAdaptor* parent): _parent(parent) {} virtual ~MyDevicePropSetListener() {}; virtual void notify(imaqkit::IEnginePropInfo* propertyInfo, void* newValue); private: // Declare handle to parent as member data MyDeviceAdaptor* _parent; // Property Information object. imaqkit::IPropInfo* _propInfo; // The new value for integer properties. int _lastIntValue; // The new value for double properties. double _lastDoubleValue; // The new value for character vector properties. char* _lastStrValue; };
Когда пользователь вызывает set
команда, чтобы изменить значение свойства, механизм вызывает notify()
функция класса прослушивателя набора сопоставлена со свойством.
Класс прослушивателя набора notify()
функция должна принять два параметра:
void notify(IPropInfo* propertyInfo, void* newValue)
propertyInfo
указатель на IPropInfo
объект — IPropInfo
класс является интерфейсом, который позволяет вам получить информацию о свойстве. Например, использование IPropInfo
функции можно получить имя свойства, его тип хранения и его значение по умолчанию.
newValue
указатель на новое значение свойства — Этот механизм передает это значение как void*
. Ваш notify()
функция должна бросить значение к соответствующему типу данных C++. Следующая таблица говорит который тип данных C++ бросить к для всех типов свойства, поддержанных набором адаптера.
imaqkit:: PropertyTypes | Тип данных C++ |
---|---|
|
|
|
|
|
|
|
|
|
|
Предложенный Алгоритм для уведомляет () Функцию. Проект notify()
функция меняется в зависимости от потребностей вашего устройства и средств, предлагаемых его SDK. Например, можно создать класс прослушивателя набора того, который обрабатывает все изменения значения для всех свойств в конкретном контейнере свойства (общий или специфичный для устройства). В этом случае, notify()
функция включает оператор switch со случаями, которые обрабатывают каждое отдельное свойство.
В качестве альтернативы вы могли задать отдельный класс прослушивателя набора для каждого свойства или каждого типа хранения свойства. Затем механизм вызывает определенный прослушиватель для заданного свойства.
Также можно задать классы прослушивателя набора, которые соответствуют способу, которым SDK организует настройку свойства. Например, если SDK обеспечивает одну функцию, чтобы сконфигурировать все свойства устройства, можно задать класс прослушивателя набора для этих свойств.
Пример. Этот пример показывает реализацию notify()
функция для целочисленных типов:
void MyDevicePropSetListener::notify(IPropInfo* propertyInfo, void* newValue) { // Get property name from the IPropInfo object. const char* propname = propertyInfo->getPropertyName(); // Cast newValue to the proper type newVal = *reinterpret_cast<const int*>(newValue); // ***************************************************** // Insert calls to device SDK to apply value to hardware. // ***************************************************** // For debug purposes only. imaqkit::adaptorWarn("In listener. Property name is %s\n",propname); }
Чтобы настроить прослушиватель для свойства, вы сопоставляете объект прослушивателя со свойством в контейнере свойства. Следующий пример показывает, как добавить прослушиватели набора для всех специфичных для устройства свойств в контейнере свойства адаптера. Средства записи адаптера обычно настраивают прослушиватели свойства в своем конструкторе класса адаптера — смотрите Реализацию Вашего Конструктора класса Адаптера.
Получите указатель на соответствующий контейнерный объект свойства.
IEngine
объект имеет две функции членства, которые возвращают указатели на контейнеры свойства (IPropContainer
объекты. Пример вызывает IEngine
класс getAdaptorPropContainer()
функция членства, чтобы получить специфичный для устройства контейнер свойства:
imaqkit::IPropContainer* adaptorPropContainer = getEngine()->getAdaptorPropContainer();
Добавьте прослушиватель набора свойства в контейнере, с помощью IPropContainer
addListener()
объекта функция. В качестве аргументов задайте имя свойства и указатель на объект прослушивателя.
Примечание
Поскольку тулбокс удаляет каждый экземпляр объекта прослушивателя, когда пользователь удаляет объект ввода видео, сопоставьте новый экземпляр объекта прослушивателя с каждым свойством.
Следующий пример выполняет итерации через все свойства в контейнере свойства адаптера, сопоставляя объект прослушивателя набора с каждым свойством:
void MyDeviceAdaptor::MyDeviceAdaptor() { // get a handle to the property container IPropContainer* propContainer = getEngine()->getAdaptorPropContainer(); // Determine the number of properties in the container. int numDeviceProps = propContainer->getNumberProps(); // Retrieve the names of all the properties in the container const char **devicePropNames = new const char*[numDeviceProps]; propContainer->getPropNames(devicePropNames); // Create a variable to point to a property listener object. MyDevicePropSetListener* setListener; // For each property in the container... for (int i = 0; i < numDeviceProps; i++){ // Create a set listener object... setListener = new MyDevicePropSetListener(this); // and associate it with a specific property. propContainer->addListener(devicePropNames[i], setListener); } // clean up the array of property names. delete [] devicePropNames; }