/* Copyright 2018-2019 The MathWorks, Inc. */

/**
 * @file
 * Constants used in shared autonomous features.
 * To fully support code generation, note that this file needs to be fully
 * compliant with the C++98 standard.
 */

#ifndef AUTONOMOUSCODEGEN_CONSTANTS_H_
#define AUTONOMOUSCODEGEN_CONSTANTS_H_

#ifdef BUILDING_LIBMWAUTONOMOUSCODEGEN
#include "autonomouscodegen/autonomouscodegen_util.hpp"
#else
#include "autonomouscodegen_util.hpp"
#endif

namespace autonomous {
// Codegen-compatible versions of declaration in
// matlab/math/foundation/src/mfl_scalar/export/include/mfl_scalar/detail/word_types.hpp
typedef union {
    real64_T value;
    struct {
        uint32_T lw;
        uint32_T hw;
    } words;
} auton_double_word_T;

// Codegen-compatible version of declarations in
// matlab/math/foundation/src/mfl_scalar/export/include/mfl_scalar/constants.hpp
inline real64_T getInf() {
    autonomous::auton_double_word_T tmp;
    tmp.words.hw = 0x7ff00000U;
    tmp.words.lw = 0x00000000U;
    return tmp.value;
}

inline real64_T getNaN(){
    autonomous::auton_double_word_T x;
    x.words.hw = 0xfff80000U;
    x.words.lw = 0x00000000U;
    return x.value;
}

inline real64_T getPi() {
    return 3.14159265358979323846;
}

// toosamll value found from a trial-and-error process to find thresholds 
// such that the unit tests would consistently pass. Source - OMPL.
const real64_T tooSmall = 1e-7;

const real64_T pi = autonomous::getPi();
const real64_T twoPi = 2.0 * autonomous::getPi();
const real64_T inf = autonomous::getInf();
const real64_T nan = autonomous::getNaN();

} // namespace autonomous

#endif // AUTONOMOUSCODEGEN_CONSTANTS_H_