Обратные вызовы в C++ | страница 88




>  void initialize() override;

>  void activate(SensorNumber number) override;

>  bool isOperable(SensorNumber number) override;


>  void setDefaultValue(SensorValue value);   // (4)

>  void setDefaultOperable(bool isOperable);  // (5)

>  void setReadValue(OnReadValue value);      // (6)

>  void setOperable(OnOperable operable);     // (7)


>  SensorValue readSpot(SensorNumber number) override;       // (8)

>  SensorValue readSmooth(SensorNumber number) override;     // (9)

>  SensorValue readDerivative(SensorNumber number) override; // (10)


>  static IDriver* create();


>protected:

>  DriverSimulation();


>private:

>  OnReadValue getValue_;         // (11)

>  OnOperable getOperable_;       // (12)

>  SensorValue defaultValue_ = 0; // (13)

>  bool defaultOperable_ = true;  // (14)

>};


В строке 1 объявляется перечисление для указания используемого метода чтения показателей. В строке 2 и 3 объявляются типы для обратных вызовов. Переменные соответствующих типов для хранения вызовов объявлены в строках 11 и 12. Настройка вызовов производится в методах 6 и 7. Кроме того, объявляются переменные для хранения значений по умолчанию (строки 13 и 14), эти переменные настраиваются в методах 4 и 5.

Реализацию чтения показателей продемонстрируем на примере получения текущего значения датчика (Листинг 90).

Листинг 90. Чтение текущего значения датчика в имитируемом драйвере (DriverImpl.cpp)

>SensorValue DriverSimulation::readSpot(SensorNumber number)

>{

>  if (getValue_)  // (1)

>  {

>    return getValue_(number, READ_SPOT);  // (2)

>  }

>  else

>  {

>    return defaultValue_;  // (3)

>  }

>}


В строке 1 проверяется, настроен ли обратный вызов. Если настроен, то через него запрашивается значение для соответствующего датчика. Информацией вызова здесь является номер датчика и метод чтения показателей (строка 2). Если обратный вызов не настроен, то возвращается значение по умолчанию (строка 3).

6.2.4. Датчик

Обобщенный интерфейсный класс для работы с датчиком приведен в Листинг 91.

Листинг 91. Интерфейсный класс для роботы с датчиком (SensorInterface.h)

>namespace sensor

>{


>class ISensor

>{

>public:

>  virtual void setDriver(DriverPointer driverPointer) = 0;  // (1)

>  virtual DriverPointer getDriver() = 0;  // (2)


>  virtual double getValue() = 0;  // (3)

>  virtual bool isOperable() = 0;  // (4)


>  virtual ~ISensor() = default;


>  static SensorPointer createSensor(SensorType type, SensorNumber number, DriverPointer driverPointer);  // (5)


>};


>}; //namespace sensor


В строке 1 объявлен метод для настройки драйвера, с которым будет работать датчик. Получить используемый драйвер можно с помощью метода 2. В строках 3 и 4 объявлены методы для получения текущего значения датчика и определения его работоспособности. В строке 5 объявлен метод для создания экземпляра класса соответствующего типа.