Интерфейс для работы с датчиками объявлен в классе ISensor, обощенная реализация интерфейса осуществляется в классе SensorAbstract. Указанный класс хранит указатель на IDriver, который используется для получения значений датчиков. В классе IDriver объявляется интерфейс для взаимодействия с аппаратурой.

<p>6.2. Реализация классов</p><p>6.2.1. Общие определения</p>

В Листинг 86 представлены общие объявления типов.

Листинг 86. Общие объявления типов (SensorDef.h)

namespace sensor

{

class ISensor;

class IDriver;

using SensorNumber = unsigned int;       // (1)

using SensorValue = double;              // (2)

using CheckAlertTimeout = unsigned int;  // (3)

enum class SensorType : uint32_t  // (4)

{

  Spot = 0,

  Smooth = 1,

  Derivative = 2,

};

enum class DriverType : uint32_t  // (5)

{

  Simulation = 0,

  Usb = 1,

  Ethernet = 2

};

enum class AlertRule : uint32_t // (6)

{

  More = 0,

  Less = 1

};

using SensorPointer = std::shared_ptr;  // (7)

using DriverPointer = std::shared_ptr;  // (8)

using SensorValueCallback = std::function;               // (9)

using SensorAlertCallback = std::function;  // (10)

}; //namespace sensor

В строке 1 объявлен тип для номера датчика, в строке 2 объявлен тип значения, возвращаемого датчиком. В строке 3 объявлен тип значения интервала опроса датчиков для сигнализации пороговых значений.

В строке 4 объявлены идентификаторы типов датчиков, в строке 5 объявлены идентификаторы драйверов. В строке 6 объявлены идентификаторы правил для задания пороговых значений (сигнализация превышения или опускания ниже заданного значения).

В строке 7 объявлен тип для хранения указателей классов датчиков, в строке 8 – тип для хранения указателей классов драйверов. В строке 9 объявлен тип обратного вызова, в который передается значение датчика, в строке 10 – тип обратного вызова, в который передается значение датчика в случае срабатывания сигнализации порогового значения.

<p>6.2.2. Обработка ошибок</p>

В процессе работы любой программы могут ситуации, приводящие к ошибкам. Причины ошибок могут быть самыми различными: неправильные действия пользователя, некорректная работа ПО, сбои в работе оборудования и т. п. Таким образом, возникает необходимость реализации подсистемы обработки ошибок, которая осуществляет восстановление работоспособности компонента после возникновения ошибочной ситуации и уведомление об этом пользователя.

В общем случае существуют две модели обработки ошибок: анализ кодов возврата и использование исключений. Несмотря на то, что использование исключений в последнее время подвергается серьезной критике, вплоть до того, что в новых языках программирования от них избавляются, в C++ указанный механизм остается востребованным, и мы также им воспользуемся. Объявления для формирования исключений представлены в Листинг 87.

Листинг 87. Исключения для обработки ошибок (Errors.h)

namespace sensor

{

enum class SensorError: uint32_t  // (1)

{

  NoError = 0,

  NotInitialized = 1,

  UnknownSensorType = 2,

  UnknownSensorNumber = 3,

  SensorIsNotOperable = 4,

  DriverIsNotSet = 5,

  InvalidArgument = 6,

  NotSupportedOperation = 7,

  InitDriverError = 8

};

class sensor_exception : public std::exception    // (2)

{

public:

  sensor_exception(SensorError error);

  SensorError code() const;

  virtual const char* what() const;

  static void throw_exception(SensorError error);  // (3)

private:

  SensorError code_;

};

}; //namespace sensor

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

<p>6.2.3. Драйвер</p>
Перейти на страницу:

Похожие книги