This commit is contained in:
2025-07-10 12:03:50 +03:00
parent a35e72d166
commit 4d13c86e3d
5 changed files with 209 additions and 243 deletions

View File

@@ -64,7 +64,7 @@ namespace mcc::traits
template <typename T>
concept mcc_astrom_engine_c = requires(T t, const T t_const) {
typename T::engine_err_t;
requires mcc_error_c<typename T::error_t>;
typename T::engine_state_t;
requires std::movable<typename T::engine_state_t>;
@@ -81,7 +81,7 @@ concept mcc_astrom_engine_c = requires(T t, const T t_const) {
{ t_const.getState() } -> std::same_as<typename T::engine_state_t>;
{ t_const.errorString(std::declval<typename T::engine_err_t>()) } -> mcc_formattable;
{ t_const.errorString(std::declval<typename T::error_t>()) } -> mcc_formattable;
/* coordinates conversional methods */
@@ -91,25 +91,30 @@ concept mcc_astrom_engine_c = requires(T t, const T t_const) {
std::declval<typename T::juldate_t>(), std::declval<typename T::coord_t&>(),
std::declval<typename T::coord_t&>(), std::declval<typename T::coord_t&>(),
std::declval<typename T::coord_t&>(), std::declval<typename T::coord_t&>())
} -> std::same_as<typename T::engine_err_t>;
} -> std::same_as<typename T::error_t>;
// compute hour angle and declination from azimuth and altitude: hadec2azalt(ha, dec, az, alt)
{
t.hadec2azalt(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>(),
std::declval<typename T::coord_t&>(), std::declval<typename T::coord_t&>())
} -> std::same_as<typename T::engine_err_t>;
} -> std::same_as<typename T::error_t>;
// compute azimuth and altitude from hour angle and declination: azalt2hadec(az, alt, ha, dec)
{
t.azalt2hadec(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>(),
std::declval<typename T::coord_t&>(), std::declval<typename T::coord_t&>())
} -> std::same_as<typename T::engine_err_t>;
} -> std::same_as<typename T::error_t>;
// compute parallactic angle: hadec2pa(ha, dec, pa)
{
t.hadec2pa(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>(),
std::declval<typename T::pa_t&>())
} -> std::same_as<typename T::engine_err_t>;
} -> std::same_as<typename T::error_t>;
// compute equation of origins
{
t.eqOrigins(std::declval<typename T::juldate_t>(), std::declval<typename T::eo_t&>())
} -> std::same_as<typename T::error_t>;
/* time-related methods */
@@ -117,95 +122,31 @@ concept mcc_astrom_engine_c = requires(T t, const T t_const) {
// 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&>())
} -> std::same_as<typename T::engine_err_t>;
} -> std::same_as<typename T::error_t>;
// apparent sideral time: apparentSiderTime(jd, gst, islocal)
// if islocal == false then the method must return the Greenwich apparent sideral time, otherwise - local one
{
t.apparentSiderTime(std::declval<typename T::juldate_t>(), std::declval<typename T::sideral_time_t&>(),
std::declval<bool>())
} -> std::same_as<typename T::engine_err_t>;
} -> std::same_as<typename T::error_t>;
/* 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>;
{ t.refraction(std::declval<typename T::refract_result_t&>()) } -> std::same_as<typename T::error_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>;
} -> std::same_as<typename T::error_t>;
};
/* MOUNT AXES AND MOTORS HARDWARE GENERIC ABSTRACTION */
/* A VERY GENERIC MOUNT HARDWARE CONCEPT */
// // 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;
// 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.id() } -> mcc_formattable;
// { 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) {
// requires mcc_error_c<typename T::error_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)
// };
// { t_const.errorString(std::declval<typename T::error_t>()) } -> mcc_formattable;
// { t_const.id() } -> mcc_formattable;
// { t.toPos(std::declval<typename T::pos_t>()) } -> std::same_as<typename T::error_t>;
// { t.stop() } -> std::same_as<typename T::error_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_hw_motor_lvref_c = mcc_nonconst_lvref<T> && mcc_hw_motor_c<std::remove_reference_t<T>>;
// } // 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>;
@@ -229,14 +170,6 @@ concept mcc_mount_hardware_c = requires(T t, const T t_const) {
{ 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>;
// // 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;
};
@@ -244,16 +177,23 @@ concept mcc_mount_hardware_c = requires(T t, const T t_const) {
template <typename T>
concept mcc_mount_pec_c = requires(T t, const T t_const) {
requires mcc_error_c<typename T::error_t>;
typename T::coord_t;
typename T::pec_data_t;
typename T::pec_result_t;
{ t.setData(std::declval<typename T::pec_data_t>()) };
{ t_const.getData() } -> std::same_as<typename T::pec_data_t>;
// at least contains .dx and .dy fields
requires requires(typename T::pec_result_t res) {
requires std::same_as<decltype(res.dx), typename T::coord_t>;
requires std::same_as<decltype(res.dy), typename T::coord_t>;
};
{ t.setData(std::declval<typename T::pec_data_t>()) } -> std::same_as<typename T::error_t>;
{ t_const.getData(std::declval<typename T::pec_data_t&>()) } -> std::same_as<typename T::error_t>;
{
t.compute(std::declval<const typename T::coord_t&>(), std::declval<const typename T::coord_t&>())
} -> std::same_as<typename T::pec_result_t>;
t.compute(std::declval<const typename T::coord_t&>(), std::declval<const typename T::coord_t&>(),
std::declval<typename T::pec_result_t>())
} -> std::same_as<typename T::error_t>;
};