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



>LIB_API ErrorCode shutDown();

>LIB_API ErrorCode assignDriver(DriverType type);

>LIB_API ErrorCode getAssignedDriver(DriverType* type);

>LIB_API ErrorCode getSensorDriver(SensorNumber number, DriverType* type);

>LIB_API ErrorCode addSensor(SensorType type, SensorNumber number);

>LIB_API ErrorCode deleteSensor(SensorNumber number);

>LIB_API ErrorCode isSensorExist(SensorNumber number, int* isExist);

>LIB_API ErrorCode isSensorOperable(SensorNumber number, int* isOperable);

>LIB_API ErrorCode getSensorValue(SensorNumber number, SensorValue* value);

>LIB_API ErrorCode querySensorValue(SensorNumber number, SensorValueCallback callback, void* pContextData);

>LIB_API ErrorCode readSensorValues(SensorValueCallback callback, void* pContextData);

>LIB_API ErrorCode getMinValue(SensorNumber first, SensorNumber last, SensorValue* value);

>LIB_API ErrorCode getMaxValue(SensorNumber first, SensorNumber last, SensorValue* value);

>LIB_API ErrorCode setAlert(SensorNumber number, SensorAlertCallback callback, SensorValue alertValue, AlertRule alertRule, CheckAlertTimeout checkTimeoutSeс, void* pContextData);

>LIB_API ErrorCode resetAlert(SensorNumber number);

>LIB_API ErrorCode setSimulateReadCallback(OnSimulateReadValue callback, void* pContextData);

>LIB_API ErrorCode setSimulateOperableCallback(OnSimulateOperable callback, void* pContextData);


В реализации этих функций мы будем возвращать код ошибки, получая его из перехваченного исключения. В качестве примера рассмотрим реализацию функции для получения значения датчика (Листинг 105).

Листинг 105. Функция для получения значения датчика

>ErrorCode getSensorValue(SensorNumber number, SensorValue* value)

>{

>  ErrorCode error = ERROR_NO;  // (1)


>  try

>  {

>    *value = g_SensorControl->getSensorValue(number);  // (2)

>  }

>  catch (sensor::sensor_exception& e)  // (3)

>  {

>    error = e.code();                  // (4)

>  }

>  return error;                        // (5)

>}


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


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