Skip to content
Snippets Groups Projects
ErrorHandler.hpp 5.58 KiB
Newer Older
  • Learn to ignore specific revisions
  • kongr45gpen's avatar
    kongr45gpen committed
    #ifndef PROJECT_ERRORHANDLER_HPP
    #define PROJECT_ERRORHANDLER_HPP
    
    
    // Forward declaration of the class, since its header file depends on the ErrorHandler
    class Message;
    
    kongr45gpen's avatar
    kongr45gpen committed
    
    /**
     * A class that handles unexpected software errors, including internal errors or errors due to
     * invalid & incorrect input data.
     *
     * @todo Add auxiliary data field to errors
     */
    class ErrorHandler {
    private:
    	/**
    	 * Log the error to a logging facility. Currently, this just displays the error on the screen.
    	 *
    	 * @todo This function MUST be moved as platform-dependent code. Currently, it uses g++ specific
    	 * functions for desktop.
    	 */
    	template<typename ErrorType>
    	static void logError(const Message &message, ErrorType errorType);
    
    	/**
    	 * Log an error without a Message to a logging facility. Currently, this just displays the error
    	 * on the screen.
    	 *
    	 * @todo This function MUST be moved as platform-dependent code. Currently, it uses g++ specific
    	 * functions for desktop.
    	 */
    	template<typename ErrorType>
    	static void logError(ErrorType errorType);
    
    public:
    	enum InternalErrorType {
    		UnknownInternalError = 0,
    		/**
    		 * While writing (creating) a message, an amount of bytes was tried to be added but
    		 * resulted in failure, since the message storage was not enough.
    		 */
    			MessageTooLarge = 1,
    		/**
    		 * Asked to append a number of bits larger than supported
    		 */
    			TooManyBitsAppend = 2,
    		/**
    		 * Asked to append a byte, while the previous byte was not complete
    		 */
    			ByteBetweenBits = 3,
    		/**
    		 * A string is larger than the largest allowed string
    		 */
    			StringTooLarge = 4,
    
    kongr45gpen's avatar
    kongr45gpen committed
    
    		/**
    		 * An error in the header of a packet makes it unable to be parsed
    		 */
    			UnacceptablePacket = 5,
    
    
    		/**
    		 * Asked a Message type that it doesn't exist
    		 */
    			UnknownMessageType = 6,
    
    kongr45gpen's avatar
    kongr45gpen committed
    	};
    
    	/**
    	 * The error code for failed acceptance reports, as specified in ECSS 6.1.4.3d
    	 *
    	 * Note: Numbers are kept in code explicitly, so that there is no uncertainty when something
    	 * changes.
    	 */
    	enum AcceptanceErrorType {
    		UnknownAcceptanceError = 0,
    		/**
    		 * The received message does not contain enough information as specified
    		 */
    			MessageTooShort = 1,
    		/**
    		 * Asked to read a number of bits larger than supported
    		 */
    			TooManyBitsRead = 2,
    		/**
    		 * Cannot read a string, because it is larger than the largest allowed string
    		 */
    			StringTooShort = 4,
    
    kongr45gpen's avatar
    kongr45gpen committed
    		/**
    		 * Cannot parse a Message, because there is an error in its secondary header
    		 */
    		    UnacceptableMessage = 5,
    
    	/**
    	 * The error code for failed start of execution reports, as specified in ECSS 5.3.5.2.3g
    	 *
    	 * Note: Numbers are kept in code explicitly, so that there is no uncertainty when something
    	 * changes.
    	 */
    	enum StartExecutionErrorType {
    		UnknownStartExecutionError = 0,
    	};
    
    	/**
    	 * The error code for failed progress of execution reports, as specified in ECSS 5.3.5.2.3g
    	 *
    	 * Note: Numbers are kept in code explicitly, so that there is no uncertainty when something
    	 * changes.
    	 */
    	enum ProgressExecutionErrorType {
    		UnknownProgressExecutionError = 0,
    	};
    
    
    
    kongr45gpen's avatar
    kongr45gpen committed
    	/**
    	 * The error code for failed completion of execution reports, as specified in ECSS 5.3.5.2.3g
    	 *
    	 * Note: Numbers are kept in code explicitly, so that there is no uncertainty when something
    	 * changes.
    	 */
    
    	enum CompletionExecutionErrorType {
    		UnknownCompletionExecutionError = 0,
    
    		/**
    		 * Checksum comparison failed
    		 */
    			ChecksumFailed = 1,
    		/**
    		 * Address of a memory is out of the defined range for the type of memory
    		 */
    			AddressOutOfRange = 2,
    
    thodkatz's avatar
    thodkatz committed
    	 * The error code for failed routing reports, as specified in ECSS 6.1.3.3d
    
    kongr45gpen's avatar
    kongr45gpen committed
    	 *
    	 * Note: Numbers are kept in code explicitly, so that there is no uncertainty when something
    	 * changes.
    	 */
    	enum RoutingErrorType {
    		UnknownRoutingError = 0
    	};
    
    	/**
    	 * The location where the error occurred
    	 */
    	enum ErrorSource {
    		Internal,
    		Acceptance,
    		ExecutionStart,
    		ExecutionProgress,
    		ExecutionCompletion,
    		Routing
    	};
    
    	/**
    	 * Report a failure and, if applicable, store a failure report message
    	 *
    	 * @tparam ErrorType The Type struct of the error; can be AcceptanceErrorType,
    	 * 					 ExecutionErrorType, or RoutingErrorType.
    	 * @param message The incoming message that prompted the failure
    	 * @param errorCode The error's code, as defined in ErrorHandler
    	 * @todo See if this needs to include InternalErrorType
    	 */
    	template<typename ErrorType>
    	static void reportError(const Message &message, ErrorType errorCode);
    
    	/**
    	 * Report a failure that occurred internally, not due to a failure of a received packet.
    	 *
    	 * Note that these errors correspond to bugs or faults in the software, and should be treated
    	 * differently. Such an error may prompt a task or software reset.
    	 */
    	static void reportInternalError(InternalErrorType errorCode);
    
    	/**
    	 * Make an assertion, to ensure that a runtime condition is met.
    	 *
    	 * Reports a failure that occurred internally, not due to a failure of a received packet.
    	 *
    	 * Creates an error if \p condition is false. The created error is Internal.
    	 */
    	static void assertInternal(bool condition, InternalErrorType errorCode) {
    		if (not condition) {
    			reportInternalError(errorCode);
    		}
    	}
    
    	/**
    	 * Make an assertion, to ensure that a runtime condition is met.
    	 *
    	 * Reports a failure that occurred while processing a request, in any of the process phases.
    	 *
    	 * Creates an error if \p condition is false. The created error corresponds to a \p message.
    	 */
    	template<typename ErrorType>
    	static void assertRequest(bool condition, const Message &message, ErrorType errorCode) {
    		if (not condition) {
    			reportError(message, errorCode);
    		}
    	}
    };
    
    #endif //PROJECT_ERRORHANDLER_HPP