После соединения с устройством через ваш адаптер пользователи могут хотеть просмотреть или изменить значения свойств устройства. Например, пользователь может настроить значение свойства 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; }