Реализация добирается и поддержка набора специфичных для устройства свойств

После соединения с устройством через ваш адаптер пользователи могут хотеть просмотреть или изменить значения свойств устройства. Например, пользователь может настроить значение свойства Brightness или получить текущее значение свойства Temperature. (Для получения информации о том, как задать свойства, которые вы хотите представить пользователям, видеть Свойства устройства Создания.)

Чтобы получить уведомление от механизма, когда пользователь захочет просмотреть или изменить свойство, сопоставьте объект listener со свойством. Тулбокс задает два типа классов прослушивателя: прослушиватели get, которые отвечают на команды get и прослушиватели set, которые отвечают на команды set.

Чтобы оказать поддержку для получения и установки значений свойств, выполните эту процедуру:

  1. Задайте класс прослушивателя соответствующего типа. Тулбокс задает два абстрактных класса, один для получают прослушиватели и один для прослушивателей набора, от которых вы выводите свой класс.

  2. Реализуйте виртуальную функцию, требуемую классом.

  3. Сопоставьте экземпляр своего класса прослушивателя со свойством.

Следующие разделы описывают, как настроить, получают прослушиватели и устанавливают прослушиватели и в вашем адаптере.

Подготовка получает прослушиватели в вашем адаптере

Чтобы получить уведомление от механизма, когда пользователь запрашивает текущее значение свойства с помощью команды get:

  1. Задайте получить класс прослушивателя, выведение его из абстрактного класса IPropCustomGetFcn — видит Определение Получить Класса Прослушивателя.

  2. Реализуйте виртуальную функцию getValue() в своем классе прослушивателя — смотрите Создание getValue () Функция для Вашего Класса.

  3. Сопоставьте экземпляр своего класса прослушивателя со свойством — смотрите, что Соединение Получает Прослушиватели со Свойствами.

Определение получить класс прослушивателя

Создайте получить класс прослушивателя, выведя его из абстрактного класса 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() получить класса прослушивателя, сопоставленного со свойством.

Ваша функция getValue() должна принять два параметра:

void getValue(IPropInfo* propertyInfo, void* value)
  • propertyInfo является указателем на объект IPropInfo. — Класс IPropInfo является интерфейсом, который позволяет вам получить информацию о свойстве. Например, использование IPropInfo функционирует, можно получить имя свойства, его тип хранения и его значение по умолчанию. Эта информация полезна, если у вас есть типичный класс прослушивателя, который обрабатывает несколько свойств.

  • value является указателем на местоположение в памяти, где ваш адаптер хранит требуемое значение свойства. — Механизм передает это значение как void*. Ваша функция getValue() должна бросить значение к соответствующему типу данных C++. Следующая таблица говорит который тип данных C++ бросить к для всех типов свойства, поддержанных набором адаптера.

    imaqkit:: PropertyTypes

    Тип данных C++

    CHARACTER_VECTOR

    char**

    DOUBLE

    double*

    INT

    int*

    DOUBLE_ARRAY

    imaqkit::PropertyTypes::NDoubles*

    INT_ARRAY

    imaqkit::PropertyTypes::NInts*

    Для нескалярных типов данных, векторы символов, двойные массивы и целочисленные массивы, ваш класс прослушивателя должен выделить достаточную память для текущего значения свойства с помощью оператора 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);
}

Соединение получает прослушиватели со свойствами

Чтобы настроить прослушиватель для свойства, вы сопоставляете объект прослушивателя со свойством в контейнере свойства. Следующий пример показывает, как добавить, получают прослушиватели для всех специфичных для устройства свойств в контейнере свойства адаптера. Средства записи адаптера обычно настраивают прослушиватели свойства в своем конструкторе класса адаптера — смотрите Реализацию Вашего Конструктора класса Адаптера.

  1. Получите указатель на соответствующий контейнерный объект свойства.

    Объект IEngine имеет две функции членства, которые возвращают указатели на контейнеры свойства (объекты IPropContainer). Пример вызывает класс IEngine функция членства getAdaptorPropContainer(), чтобы получить специфичный для устройства контейнер свойства:

    imaqkit::IPropContainer* adaptorPropContainer =
                             getEngine()->getAdaptorPropContainer();
    
  2. Добавьте получить прослушиватель свойства в контейнере, с помощью объекта 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:

  1. Задайте класс прослушивателя набора, выведение его из абстрактного класса IPropPostSetListener — видит Определение Класса Прослушивателя Набора.

  2. Реализуйте виртуальную функцию notify() в своем классе прослушивателя набора — смотрите Создание уведомления () Функция для Вашего Класса.

  3. Сопоставьте экземпляр своего класса прослушивателя набора со свойством — смотрите Прослушиватели Набора Соединения со Свойствами.

Определение класса прослушивателя набора

Создайте класс прослушивателя набора, выведя его из абстрактного класса 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++

    CHARACTER_VECTOR

    char*

    DOUBLE

    double*

    INT

    int*

    DOUBLE_ARRAY

    imaqkit::PropertyTypes::NDoubles*

    INT_ARRAY

    imaqkit::PropertyTypes::NInts*

Предложенный Алгоритм для уведомляет () Функцию.  Проект функции 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);

}

Соединение прослушивателей набора со свойствами

Чтобы настроить прослушиватель для свойства, вы сопоставляете объект прослушивателя со свойством в контейнере свойства. Следующий пример показывает, как добавить прослушиватели набора для всех специфичных для устройства свойств в контейнере свойства адаптера. Средства записи адаптера обычно настраивают прослушиватели свойства в своем конструкторе класса адаптера — смотрите Реализацию Вашего Конструктора класса Адаптера.

  1. Получите указатель на соответствующий контейнерный объект свойства.

    Объект IEngine имеет две функции членства, которые возвращают указатели на контейнеры свойства (объекты IPropContainer). Пример вызывает класс IEngine функция членства getAdaptorPropContainer(), чтобы получить специфичный для устройства контейнер свойства:

    imaqkit::IPropContainer* adaptorPropContainer =
                             getEngine()->getAdaptorPropContainer();
    
  2. Добавьте прослушиватель набора свойства в контейнере, с помощью объекта 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;
        
    }