This commit is contained in:
2025-07-09 18:47:13 +03:00
parent d663f6b54a
commit 6646ef6aca
7 changed files with 339 additions and 148 deletions

View File

@@ -21,6 +21,36 @@ static constexpr std::string_view MccMountTypeStr = TYPE == MccMountType::GERMAN
: TYPE == MccMountType::ALTAZ_TYPE ? "ALTAZ"
: "UNKNOWN";
template <MccMountType TYPE>
static constexpr bool mcc_is_equatorial_mount = TYPE == MccMountType::GERMAN_TYPE ? true
: TYPE == MccMountType::FORK_TYPE ? true
: TYPE == MccMountType::CROSSAXIS_TYPE ? true
: TYPE == MccMountType::ALTAZ_TYPE ? false
: false;
template <MccMountType TYPE>
static constexpr bool mcc_is_altaz_mount = TYPE == MccMountType::GERMAN_TYPE ? false
: TYPE == MccMountType::FORK_TYPE ? false
: TYPE == MccMountType::CROSSAXIS_TYPE ? false
: TYPE == MccMountType::ALTAZ_TYPE ? true
: false;
static consteval bool mccIsEquatorialMount(const MccMountType type)
{
return type == MccMountType::GERMAN_TYPE ? true
: type == MccMountType::FORK_TYPE ? true
: type == MccMountType::CROSSAXIS_TYPE ? true
: type == MccMountType::ALTAZ_TYPE ? false
: false;
};
static consteval bool mccIsAltAzMount(const MccMountType type)
{
return type == MccMountType::GERMAN_TYPE ? false
: type == MccMountType::FORK_TYPE ? false
: type == MccMountType::CROSSAXIS_TYPE ? false
: type == MccMountType::ALTAZ_TYPE ? true
: false;
};
} // namespace mcc
@@ -99,108 +129,114 @@ concept mcc_astrom_engine_c = requires(T t, const T t_const) {
/* atmospheric refraction-related methods */
// compute refraction-related quantities: refraction(refr_params)
{ t.refraction(std::declval<typename T::refract_result_t&>()) } -> std::same_as<typename T::engine_err_t>;
// compute refraction correction for given altitude: refractCorrection(alt, refr_params, refr_corr)
{
t.refractCorrection(std::declval<typename T::coord_t>(), std::declval<typename T::refract_result_t>(),
std::declval<typename T::coord_t&>())
} -> std::same_as<typename T::engine_err_t>;
};
/* MOUNT AXES AND MOTORS HARDWARE GENERIC ABSTRACTION */
// encoder basic concept (e.g. mount axis encoder or motor shaft one)
template <typename T>
concept mcc_hw_encoder_c = requires(T t, const T t_const) {
typename T::error_t;
// // encoder basic concept (e.g. mount axis encoder or motor shaft one)
// template <typename T>
// concept mcc_hw_encoder_c = requires(T t, const T t_const) {
// requires mcc_error_c<typename T::error_t>;
typename T::time_point_t;
typename T::coord_t;
typename T::speed_t;
typename T::accel_t;
// typename T::time_point_t;
// typename T::coord_t;
// typename T::speed_t;
// typename T::accel_t;
requires requires(typename T::state_t st) {
requires std::same_as<decltype(st.time), typename T::time_point_t>;
requires std::same_as<decltype(st.pos), typename T::coord_t>;
requires std::same_as<decltype(st.speed), typename T::speed_t>;
requires std::same_as<decltype(st.accel), typename T::accel_t>;
};
// requires requires(typename T::state_t st) {
// requires std::same_as<decltype(st.time), typename T::time_point_t>;
// requires std::same_as<decltype(st.pos), typename T::coord_t>;
// requires std::same_as<decltype(st.speed), typename T::speed_t>;
// requires std::same_as<decltype(st.accel), typename T::accel_t>;
// };
{ t_const.errorString(std::declval<typename T::error_t>()) } -> mcc_formattable;
// { t_const.errorString(std::declval<typename T::error_t>()) } -> mcc_formattable;
{ t_const.id() } -> mcc_formattable;
// { t_const.id() } -> mcc_formattable;
{ t.getState(std::declval<typename T::state_t&>()) } -> std::same_as<typename T::error_t>;
};
// { t.getState(std::declval<typename T::state_t&>()) } -> std::same_as<typename T::error_t>;
// };
template <typename T>
concept mcc_hw_motor_c = requires(T t, const T t_const) {
typename T::error_t;
// template <typename T>
// concept mcc_hw_motor_c = requires(T t, const T t_const) {
// requires mcc_error_c<typename T::error_t>;
typename T::coord_t;
typename T::speed_t;
typename T::accel_t;
// typename T::coord_t;
// typename T::speed_t;
// typename T::accel_t;
requires requires(typename T::pos_t st) {
requires std::same_as<decltype(st.pos), typename T::coord_t>;
requires std::same_as<decltype(st.speed), typename T::speed_t>; // means maximal allowed speed
requires std::same_as<decltype(st.accel), typename T::accel_t>; // means a maximal allowed acceleration (jerk)
};
// requires requires(typename T::pos_t st) {
// requires std::same_as<decltype(st.pos), typename T::coord_t>;
// requires std::same_as<decltype(st.speed), typename T::speed_t>; // means maximal allowed speed
// requires std::same_as<decltype(st.accel), typename T::accel_t>; // means a maximal allowed acceleration
// (jerk)
// };
{ t_const.errorString(std::declval<typename T::error_t>()) } -> mcc_formattable;
// { t_const.errorString(std::declval<typename T::error_t>()) } -> mcc_formattable;
{ t_const.id() } -> mcc_formattable;
// { t_const.id() } -> mcc_formattable;
{ t.toPos(std::declval<typename T::pos_t>()) } -> std::same_as<typename T::error_t>;
// { t.toPos(std::declval<typename T::pos_t>()) } -> std::same_as<typename T::error_t>;
{ t.stop() } -> std::same_as<typename T::error_t>;
};
// { t.stop() } -> std::same_as<typename T::error_t>;
// };
namespace details
{
template <typename T>
concept mcc_tuple_enc_ref_c = mcc_tuple_c<T> && requires(T t) {
[]<template <typename...> typename TT, mcc_hw_encoder_c... Ts>(TT<Ts & ...>) {}(t);
};
// namespace details
// {
// template <typename T>
// concept mcc_hw_enc_lvref_c = mcc_nonconst_lvref<T> && mcc_hw_encoder_c<std::remove_reference_t<T>>;
template <typename T>
concept mcc_tuple_enc_cref_c = mcc_tuple_c<T> && requires(T t) {
[]<template <typename...> typename TT, mcc_hw_encoder_c... Ts>(TT<const Ts & ...>) {}(t);
};
// template <typename T>
// concept mcc_hw_motor_lvref_c = mcc_nonconst_lvref<T> && mcc_hw_motor_c<std::remove_reference_t<T>>;
template <typename T>
concept mcc_tuple_motor_ref_c = mcc_tuple_c<T> && requires(T t) {
[]<template <typename...> typename TT, mcc_hw_motor_c... Ts>(TT<Ts & ...>) {}(t);
};
template <typename T>
concept mcc_hw_enc_lref_c = std::is_lvalue_reference_v<T> && mcc_hw_encoder_c<std::remove_reference_t<T>>;
template <typename T>
concept mcc_hw_motor_lref_c = std::is_lvalue_reference_v<T> && mcc_hw_motor_c<std::remove_reference_t<T>>;
} // namespace details
// } // namespace details
// a very generic mount hardware concept
template <typename T>
concept mcc_mount_hardware_c = requires(T t, const T t_const) {
requires mcc_error_c<typename T::error_t>;
typename T::config_t;
typename T::time_point_t;
typename T::coord_t;
{ t_const.id() } -> mcc_formattable;
// access to encoders
{ t_const.encoders() } -> details::mcc_tuple_enc_cref_c;
{ t.encoders() } -> details::mcc_tuple_enc_ref_c;
// hardware configuration
{ t.setConfig(std::declval<typename T::config_t>()) } -> std::same_as<typename T::error_t>;
{ t.getConfig(std::declval<typename T::config_t&>()) } -> std::same_as<typename T::error_t>;
{ t.encoderPosX() } -> details::mcc_hw_enc_lref_c;
{ t.encoderPosY() } -> details::mcc_hw_enc_lref_c;
// at least contains time of measurement and coordinates for x,y axes
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.x), typename T::coord_t>;
requires std::same_as<decltype(pos.y), typename T::coord_t>;
};
// access to motors
{ t.motors() } -> details::mcc_tuple_motor_ref_c;
{ 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.motorX() } -> details::mcc_hw_motor_lref_c;
{ t.motorY() } -> details::mcc_hw_motor_lref_c;
// // access to encoders
// { t.encoderPosX() } -> details::mcc_hw_enc_lvref_c;
// { t.encoderPosY() } -> details::mcc_hw_enc_lvref_c;
// // access to motors
// { t.motorX() } -> details::mcc_hw_motor_lvref_c;
// { t.motorY() } -> details::mcc_hw_motor_lvref_c;
};
@@ -245,5 +281,4 @@ concept mcc_mount_config_c = requires(T t) {
{ t.pec() } -> mcc_mount_pec_c;
{ t.hardware() } -> mcc_mount_hardware_c;
};
} // namespace mcc::traits