Руслан Урядинский / libuavcan

Dependents:   UAVCAN UAVCAN_Subscriber

Committer:
RuslanUrya
Date:
Sat Apr 14 10:25:32 2018 +0000
Revision:
0:dfe6edabb8ec
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RuslanUrya 0:dfe6edabb8ec 1 /*
RuslanUrya 0:dfe6edabb8ec 2 * Copyright (C) 2014 Pavel Kirienko <pavel.kirienko@gmail.com>
RuslanUrya 0:dfe6edabb8ec 3 */
RuslanUrya 0:dfe6edabb8ec 4
RuslanUrya 0:dfe6edabb8ec 5 #pragma once
RuslanUrya 0:dfe6edabb8ec 6
RuslanUrya 0:dfe6edabb8ec 7 #include <cerrno>
RuslanUrya 0:dfe6edabb8ec 8 #include <cstring>
RuslanUrya 0:dfe6edabb8ec 9 #include <stdexcept>
RuslanUrya 0:dfe6edabb8ec 10
RuslanUrya 0:dfe6edabb8ec 11 namespace uavcan_linux
RuslanUrya 0:dfe6edabb8ec 12 {
RuslanUrya 0:dfe6edabb8ec 13 /**
RuslanUrya 0:dfe6edabb8ec 14 * This is the root exception class for all exceptions that can be thrown from the libuavcan Linux driver.
RuslanUrya 0:dfe6edabb8ec 15 */
RuslanUrya 0:dfe6edabb8ec 16 class Exception : public std::runtime_error
RuslanUrya 0:dfe6edabb8ec 17 {
RuslanUrya 0:dfe6edabb8ec 18 const int errno_;
RuslanUrya 0:dfe6edabb8ec 19
RuslanUrya 0:dfe6edabb8ec 20 static std::string makeErrorString(const std::string& descr, int use_errno)
RuslanUrya 0:dfe6edabb8ec 21 {
RuslanUrya 0:dfe6edabb8ec 22 return descr + " [errno " + std::to_string(use_errno) + " \"" + std::strerror(use_errno) + "\"]";
RuslanUrya 0:dfe6edabb8ec 23 }
RuslanUrya 0:dfe6edabb8ec 24
RuslanUrya 0:dfe6edabb8ec 25 public:
RuslanUrya 0:dfe6edabb8ec 26 explicit Exception(const std::string& descr, int use_errno = errno)
RuslanUrya 0:dfe6edabb8ec 27 : std::runtime_error(makeErrorString(descr, use_errno))
RuslanUrya 0:dfe6edabb8ec 28 , errno_(use_errno)
RuslanUrya 0:dfe6edabb8ec 29 { }
RuslanUrya 0:dfe6edabb8ec 30
RuslanUrya 0:dfe6edabb8ec 31 /**
RuslanUrya 0:dfe6edabb8ec 32 * Returns standard UNIX errno value captured at the moment
RuslanUrya 0:dfe6edabb8ec 33 * when this exception object was constructed.
RuslanUrya 0:dfe6edabb8ec 34 */
RuslanUrya 0:dfe6edabb8ec 35 int getErrno() const { return errno_; }
RuslanUrya 0:dfe6edabb8ec 36 };
RuslanUrya 0:dfe6edabb8ec 37
RuslanUrya 0:dfe6edabb8ec 38 /**
RuslanUrya 0:dfe6edabb8ec 39 * This type is thrown when a Libuavcan API method exits with error.
RuslanUrya 0:dfe6edabb8ec 40 * The error code is stored in the exception object and is avialable via @ref getLibuavcanErrorCode().
RuslanUrya 0:dfe6edabb8ec 41 */
RuslanUrya 0:dfe6edabb8ec 42 class LibuavcanErrorException : public Exception
RuslanUrya 0:dfe6edabb8ec 43 {
RuslanUrya 0:dfe6edabb8ec 44 const std::int16_t error_;
RuslanUrya 0:dfe6edabb8ec 45
RuslanUrya 0:dfe6edabb8ec 46 static std::string makeErrorString(std::int16_t e)
RuslanUrya 0:dfe6edabb8ec 47 {
RuslanUrya 0:dfe6edabb8ec 48 return "Libuavcan error (" + std::to_string(e) + ")";
RuslanUrya 0:dfe6edabb8ec 49 }
RuslanUrya 0:dfe6edabb8ec 50
RuslanUrya 0:dfe6edabb8ec 51 public:
RuslanUrya 0:dfe6edabb8ec 52 explicit LibuavcanErrorException(std::int16_t uavcan_error_code) :
RuslanUrya 0:dfe6edabb8ec 53 Exception(makeErrorString(uavcan_error_code)),
RuslanUrya 0:dfe6edabb8ec 54 error_(std::abs(uavcan_error_code))
RuslanUrya 0:dfe6edabb8ec 55 { }
RuslanUrya 0:dfe6edabb8ec 56
RuslanUrya 0:dfe6edabb8ec 57 std::int16_t getLibuavcanErrorCode() const { return error_; }
RuslanUrya 0:dfe6edabb8ec 58 };
RuslanUrya 0:dfe6edabb8ec 59
RuslanUrya 0:dfe6edabb8ec 60 /**
RuslanUrya 0:dfe6edabb8ec 61 * This exception is thrown when all available interfaces become down.
RuslanUrya 0:dfe6edabb8ec 62 */
RuslanUrya 0:dfe6edabb8ec 63 class AllIfacesDownException : public Exception
RuslanUrya 0:dfe6edabb8ec 64 {
RuslanUrya 0:dfe6edabb8ec 65 public:
RuslanUrya 0:dfe6edabb8ec 66 AllIfacesDownException() : Exception("All ifaces are down", ENETDOWN) { }
RuslanUrya 0:dfe6edabb8ec 67 };
RuslanUrya 0:dfe6edabb8ec 68
RuslanUrya 0:dfe6edabb8ec 69 }