This commit is contained in:
Timur A. Fatkhullin
2025-07-14 00:38:10 +03:00
parent 096040bb1b
commit a34d258b94
3 changed files with 114 additions and 58 deletions

View File

@@ -184,6 +184,14 @@ concept mcc_mount_pec_c = requires(T t, const T t_const) {
typename T::coord_t;
typename T::pec_data_t;
// the 'T' class must contain static constexpr member of 'MccMountType' type
requires requires {
requires std::same_as<decltype(T::mountType), const MccMountType>;
[]() {
static constexpr MccMountType val = T::mountType;
}(); // to ensure 'mountType' can be used in compile-time context
};
// a class that contains at least .dx and .dy public fields
requires requires(typename T::pec_result_t res) {
requires std::same_as<decltype(res.dx), typename T::coord_t>;
@@ -202,25 +210,65 @@ concept mcc_mount_pec_c = requires(T t, const T t_const) {
/* MOUNT STATE TELEMETRY */
// a class that contains at least celestial (equatorial and horizontal) coordinates
template <typename T>
concept mcc_mount_telemetry_data_c = requires(T telemetry) {
typename T::coord_t;
requires std::same_as<decltype(telemetry.mntRA), typename T::coord_t>; // apparent RA
requires std::same_as<decltype(telemetry.mntDEC), typename T::coord_t>; // apparent DEC
requires std::same_as<decltype(telemetry.mntHA), typename T::coord_t>; // hour angle
requires std::same_as<decltype(telemetry.mntAZ), typename T::coord_t>; // azimuth
requires std::same_as<decltype(telemetry.mntALT), typename T::coord_t>; // altitude
};
template <typename T>
concept mcc_mount_telemetry_c = requires(T t, const T t_const) {
typename T::error_t;
// a class that at least contains celestial (equatorial and horizontal) coordinates
requires requires(typename T::mount_telemetry_data_t telemetry) {
typename T::mount_telemetry_data_t::coord_t;
requires std::same_as<decltype(telemetry.mntRA), typename T::mount_telemetry_data_t::coord_t>; // apparent RA
requires std::same_as<decltype(telemetry.mntDEC), typename T::mount_telemetry_data_t::coord_t>; // apparent DEC
requires std::same_as<decltype(telemetry.mntHA), typename T::mount_telemetry_data_t::coord_t>; // hour angle
requires std::same_as<decltype(telemetry.mntAZ), typename T::mount_telemetry_data_t::coord_t>; // azimuth
requires std::same_as<decltype(telemetry.mntALT), typename T::mount_telemetry_data_t::coord_t>; // altitude
};
// // a class that at least contains celestial (equatorial and horizontal) coordinates
// requires requires(typename T::mount_telemetry_data_t telemetry) {
// typename T::mount_telemetry_data_t::coord_t;
// requires std::same_as<decltype(telemetry.mntRA), typename T::mount_telemetry_data_t::coord_t>; // apparent
// RA requires std::same_as<decltype(telemetry.mntDEC), typename T::mount_telemetry_data_t::coord_t>; //
// apparent DEC requires std::same_as<decltype(telemetry.mntHA), typename T::mount_telemetry_data_t::coord_t>;
// // hour angle requires std::same_as<decltype(telemetry.mntAZ), typename T::mount_telemetry_data_t::coord_t>;
// // azimuth requires std::same_as<decltype(telemetry.mntALT), typename T::mount_telemetry_data_t::coord_t>; //
// altitude
// };
requires mcc_mount_telemetry_data_c<typename T::mount_telemetry_data_t>;
{ t_const.errorString(std::declval<typename T::error_t>()) } -> mcc_formattable;
{ t.update() } -> std::same_as<typename T::error_t>;
{ t.data() } -> std::same_as<typename T::mount_telemetry_data_t>;
{ t.data(std::declval<typename T::mount_telemetry_data_t&>()) } -> std::same_as<typename T::error_t>;
};
/* 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>;
requires requires(typename T::slew_model_t t) {
{ t.slew(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>()) };
};
};
@@ -265,6 +313,12 @@ concept mcc_prohibited_zone_c = std::movable<T> && requires(T t, const T t_const
t.timeFrom(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>(),
std::declval<typename T::time_point_t>())
} -> mcc_time_duration_c;
// requires for the methods above with the first argument of type 'const
// mcc_mount_telemetry_c::mcc_mount_telemetry_data_t&' (const lvalue reference)
//
// something like this:
requires mcc_mount_telemetry_data_c<mcc_func_arg1_t<decltype(T::inZone)>>;
};