...
This commit is contained in:
@@ -72,6 +72,15 @@ struct MccNullLogger {
|
||||
void logInfo(const std::string&) {};
|
||||
};
|
||||
|
||||
|
||||
struct MccCelestialPoint {
|
||||
typedef double coord_t;
|
||||
|
||||
MccCoordPairKind coordPairKind{MccCoordPairKind::COORDS_KIND_RADEC_ICRS};
|
||||
coord_t x{0.0}, y{0.0};
|
||||
};
|
||||
|
||||
|
||||
} // namespace mcc
|
||||
|
||||
|
||||
@@ -98,6 +107,7 @@ concept mcc_logger_c = requires(T t, const T t_const) {
|
||||
{ t.logInfo(std::declval<const std::string&>()) };
|
||||
};
|
||||
|
||||
|
||||
/* ASTROMETRY-RELATED COMPUTATION ENGINE */
|
||||
|
||||
template <typename T>
|
||||
@@ -165,6 +175,9 @@ concept mcc_astrom_engine_c = requires(T t, const T t_const) {
|
||||
|
||||
/* time-related methods */
|
||||
|
||||
// this static method must return a current time point
|
||||
{ T::timePointNow() } -> std::same_as<typename T::time_point_t>;
|
||||
|
||||
// Gregorian Calendar time point to Julian Date: greg2jul(time_point, jd)
|
||||
{
|
||||
t.greg2jul(std::declval<typename T::time_point_t>(), std::declval<typename T::juldate_t&>())
|
||||
@@ -202,20 +215,48 @@ concept mcc_mount_hardware_c = !std::copyable<T> && std::movable<T> && requires(
|
||||
|
||||
{ t_const.id() } -> mcc_formattable;
|
||||
|
||||
// a type that defines at least HW_STATE_STOP, HW_STATE_SLEW, HW_STATE_TRACK
|
||||
// compile-time constants
|
||||
// e.g. an implementations can be as follows:
|
||||
// enum class HW_STATE: int {HW_STATE_STOP, HW_STATE_SLEW, HW_STATE_TRACK}
|
||||
//
|
||||
// struct HW_STATE {
|
||||
// uint8_t HW_STATE_STOP = 100;
|
||||
// uint8_t HW_STATE_SLEW = 200;
|
||||
// uint8_t HW_STATE_TRACK = 300;
|
||||
// }
|
||||
requires requires(typename T::hw_state_t state) {
|
||||
[]() {
|
||||
// hardware is in stop state (no any moving)
|
||||
static constexpr auto v1 = T::hw_state_t::HW_STATE_STOP;
|
||||
// hardware is in slew state (move to given celestial point)
|
||||
|
||||
static constexpr auto v2 = T::hw_state_t::HW_STATE_SLEW;
|
||||
|
||||
// hardware is in track state (track given celestial point)
|
||||
static constexpr auto v3 = T::hw_state_t::HW_STATE_TRACK;
|
||||
}();
|
||||
};
|
||||
|
||||
|
||||
// a class that contains at least time of measurement, coordinates for x,y axes and its moving rates
|
||||
requires requires(typename T::axes_pos_t pos) {
|
||||
requires std::same_as<decltype(pos.time_point), typename T::time_point_t>;
|
||||
requires std::same_as<decltype(pos.time_point), typename T::time_point_t>; // time point of measurement
|
||||
|
||||
requires std::same_as<decltype(pos.x), typename T::coord_t>;
|
||||
requires std::same_as<decltype(pos.y), typename T::coord_t>;
|
||||
requires std::same_as<decltype(pos.x), typename T::coord_t>; // co-longitude coordinate
|
||||
requires std::same_as<decltype(pos.y), typename T::coord_t>; // co-latitude coordinate
|
||||
|
||||
requires std::same_as<decltype(pos.xrate), typename T::coord_t>;
|
||||
requires std::same_as<decltype(pos.yrate), typename T::coord_t>;
|
||||
|
||||
requires std::same_as<decltype(pos.state), typename T::hw_state_t>; // hardware state
|
||||
};
|
||||
|
||||
{ t.setPos(std::declval<typename T::axes_pos_t>()) } -> std::same_as<typename T::error_t>;
|
||||
{ t.getPos(std::declval<typename T::axes_pos_t&>()) } -> std::same_as<typename T::error_t>;
|
||||
|
||||
{ t_const.getState(std::declval<typename T::hw_state_t&>()) } -> std::same_as<typename T::error_t>;
|
||||
|
||||
{ t.stop() } -> std::same_as<typename T::error_t>;
|
||||
{ t.init() } -> std::same_as<typename T::error_t>;
|
||||
};
|
||||
@@ -302,11 +343,11 @@ concept mcc_mount_telemetry_c = requires(T t, const T t_const) {
|
||||
};
|
||||
|
||||
|
||||
/* A CONCEPT FOR CLASS TO REPRESENT CELESTIAL POINT */
|
||||
|
||||
/* SLEW PARAMETERS */
|
||||
|
||||
template <typename T>
|
||||
concept mcc_slew_params_c = std::movable<T> && requires(T t) {
|
||||
concept mcc_celestial_point_c = requires(T t) {
|
||||
// input coordinates pair type (e.g. IRCS RA,DEC, Az,Alt and so on)
|
||||
requires std::same_as<decltype(t.coordPairKind), MccCoordPairKind>;
|
||||
|
||||
@@ -317,37 +358,49 @@ concept mcc_slew_params_c = std::movable<T> && requires(T t) {
|
||||
|
||||
// co-latitude (e.g. DEC or ZD)
|
||||
requires std::same_as<decltype(t.y), typename T::coord_t>;
|
||||
|
||||
// stop after slewing
|
||||
requires std::convertible_to<decltype(t.stop), bool>;
|
||||
};
|
||||
|
||||
|
||||
// /* SLEW PARAMETERS */
|
||||
|
||||
// template <typename T>
|
||||
// concept mcc_slew_params_c = std::movable<T> && requires(T t) {
|
||||
// // input coordinates pair type (e.g. IRCS RA,DEC, Az,Alt and so on)
|
||||
// requires std::same_as<decltype(t.coordPairKind), MccCoordPairKind>;
|
||||
|
||||
// typename T::coord_t;
|
||||
|
||||
// // co-longitude (e.g. RA or Az)
|
||||
// requires std::same_as<decltype(t.x), typename T::coord_t>;
|
||||
|
||||
// // co-latitude (e.g. DEC or ZD)
|
||||
// requires std::same_as<decltype(t.y), typename T::coord_t>;
|
||||
|
||||
// // stop after slewing
|
||||
// requires std::convertible_to<decltype(t.stop), bool>;
|
||||
// };
|
||||
|
||||
|
||||
/* GENERIC SLEW AND GUIDING MODEL */
|
||||
|
||||
template <typename T>
|
||||
concept mcc_slew_model_c = requires(T t) {
|
||||
requires mcc_error_c<typename T::error_t>;
|
||||
requires mcc_slew_params_c<typename T::slew_params_t>;
|
||||
// requires mcc_slew_params_c<typename T::slew_params_t>;
|
||||
requires mcc_celestial_point_c<typename T::slew_point_t>;
|
||||
|
||||
{ t.slew(std::declval<typename T::slew_params_t>()) } -> std::same_as<typename T::error_t>;
|
||||
// { t.slew(std::declval<typename T::slew_params_t>()) } -> std::same_as<typename T::error_t>;
|
||||
{ t.slew(std::declval<typename T::slew_point_t>()) } -> std::same_as<typename T::error_t>;
|
||||
};
|
||||
|
||||
// template <typename T, typename TelemetryT>
|
||||
// concept mcc_slew_model_c = mcc_mount_telemetry_c<TelemetryT> && requires(T t) {
|
||||
// requires mcc_error_c<typename T::error_t>;
|
||||
// requires mcc_slew_params_c<typename T::slew_params_t>;
|
||||
|
||||
// {
|
||||
// t.slew(std::declval<typename T::slew_params_t>(), std::declval<TelemetryT&>())
|
||||
// } -> std::same_as<typename T::error_t>;
|
||||
// };
|
||||
template <typename T>
|
||||
concept mcc_guiding_model_c = requires(T t) {
|
||||
requires mcc_error_c<typename T::error_t>;
|
||||
requires mcc_celestial_point_c<typename T::guiding_point_t>;
|
||||
|
||||
template <typename T, typename TelemetryT>
|
||||
concept mcc_guiding_model_c = mcc_mount_telemetry_c<TelemetryT> && requires(T t) {
|
||||
typename T::error_t;
|
||||
|
||||
{ t.guiding(std::declval<TelemetryT&>()) } -> std::same_as<typename T::error_t>;
|
||||
// start process of guiding
|
||||
{ t.guiding(std::declval<typename T::guiding_point_t>()) } -> std::same_as<typename T::error_t>;
|
||||
};
|
||||
|
||||
|
||||
@@ -438,7 +491,8 @@ concept mcc_mount_controls_c = std::move_constructible<T> && std::movable<T> &&
|
||||
|
||||
requires mcc_slew_model_c<decltype(t.slewModel)>;
|
||||
// requires mcc_slew_model_c<decltype(t.slewModel), decltype(t.telemetry)>;
|
||||
requires mcc_guiding_model_c<decltype(t.guidingModel), decltype(t.telemetry)>;
|
||||
requires mcc_guiding_model_c<decltype(t.guidingModel)>;
|
||||
// requires mcc_guiding_model_c<decltype(t.guidingModel), decltype(t.telemetry)>;
|
||||
|
||||
// a std::tuple of prohibited zones
|
||||
[]<mcc_prohibited_zone_c<typename decltype(t.telemetry)::mount_telemetry_data_t>... Ts>(std::tuple<Ts...>) {
|
||||
@@ -463,7 +517,8 @@ concept mcc_mount_c = requires(T t) {
|
||||
requires mcc_mount_hardware_c<typename T::hardware_t>;
|
||||
// requires mcc_slew_model_c<typename T::slew_model_t, typename T::mount_telemetry_t>;
|
||||
requires mcc_slew_model_c<typename T::slew_model_t>;
|
||||
requires mcc_guiding_model_c<typename T::guiding_model_t, typename T::mount_telemetry_t>;
|
||||
// requires mcc_guiding_model_c<typename T::guiding_model_t, typename T::mount_telemetry_t>;
|
||||
requires mcc_guiding_model_c<typename T::guiding_model_t>;
|
||||
|
||||
requires std::same_as<typename T::slew_params_t, typename T::slew_model_t::slew_params_t>;
|
||||
|
||||
@@ -481,3 +536,15 @@ template <typename T>
|
||||
concept mcc_fsm_log_mount_c = std::derived_from<T, fsm::MccFiniteStateMachine> && mcc_log_mount_c<T>;
|
||||
|
||||
} // namespace mcc::traits
|
||||
|
||||
|
||||
|
||||
/* CHECK LIBRARY-WIDE CLASS DECLARATIONS FOR ITS CONCEPTS SATISFACTION */
|
||||
|
||||
namespace mcc
|
||||
{
|
||||
|
||||
static_assert(traits::mcc_logger_c<MccNullLogger>, "MccNullLogger INVALID DECLARATION!");
|
||||
static_assert(traits::mcc_celestial_point_c<MccCelestialPoint>, "MccCelestialPoint INVALID DECLARATION!");
|
||||
|
||||
} // namespace mcc
|
||||
|
||||
Reference in New Issue
Block a user