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

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