...
This commit is contained in:
@@ -75,6 +75,7 @@ concept mcc_astrom_engine_c = requires(T t, const T t_const) {
|
||||
typename T::time_point_t; // type to represent UTC time point
|
||||
typename T::juldate_t; // type to represent Julian date
|
||||
typename T::sideral_time_t; // type to represent sideral time
|
||||
typename T::eo_t; // equation of origins
|
||||
typename T::pa_t; // type to represent parallactic angle
|
||||
|
||||
typename T::refract_result_t;
|
||||
@@ -153,18 +154,13 @@ concept mcc_astrom_engine_c = requires(T t, const T t_const) {
|
||||
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;
|
||||
|
||||
// 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>;
|
||||
|
||||
// at least contains time of measurement and coordinates for x,y axes
|
||||
// a class that contains at least 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>;
|
||||
@@ -173,6 +169,7 @@ 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>;
|
||||
{ t.stop() } -> std::same_as<typename T::error_t>;
|
||||
};
|
||||
|
||||
|
||||
@@ -182,7 +179,6 @@ 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;
|
||||
|
||||
// the 'T' class must contain static constexpr member of 'MccMountType' type
|
||||
requires requires {
|
||||
@@ -198,9 +194,6 @@ concept mcc_mount_pec_c = requires(T t, const T t_const) {
|
||||
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::declval<typename T::pec_result_t>())
|
||||
@@ -210,15 +203,26 @@ 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
|
||||
// a class that contains at least celestial (equatorial and horizontal) and harware 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
|
||||
|
||||
// target current coordinates
|
||||
requires std::same_as<decltype(telemetry.tagRA), typename T::coord_t>; // apparent RA
|
||||
requires std::same_as<decltype(telemetry.tagDEC), typename T::coord_t>; // apparent DEC
|
||||
requires std::same_as<decltype(telemetry.tagHA), typename T::coord_t>; // hour angle
|
||||
requires std::same_as<decltype(telemetry.tagAZ), typename T::coord_t>; // azimuth
|
||||
requires std::same_as<decltype(telemetry.tagALT), typename T::coord_t>; // altitude
|
||||
|
||||
// mount current coordinates
|
||||
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
|
||||
requires std::same_as<decltype(telemetry.mntPosX), typename T::coord_t>; // hardware encoder X-axis position
|
||||
requires std::same_as<decltype(telemetry.mntPosY), typename T::coord_t>; // hardware encoder Y-axis position
|
||||
};
|
||||
|
||||
|
||||
@@ -265,70 +269,103 @@ concept mcc_slew_params_c = std::movable<T> && requires(T 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>()) };
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/* GENERIC SLEW AND GUIDING MODEL */
|
||||
|
||||
template <typename T, typename TelemetryT>
|
||||
concept mcc_slew_model_c = mcc_mount_telemetry_c<TelemetryT> && requires(T t) {
|
||||
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, 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>;
|
||||
};
|
||||
|
||||
|
||||
/* MOUNT PROHIBITED ZONE */
|
||||
|
||||
template <typename T>
|
||||
concept mcc_prohibited_zone_c = std::movable<T> && requires(T t, const T t_const) {
|
||||
typename T::coord_t;
|
||||
typename T::time_point_t;
|
||||
template <typename T, typename TelemetryDataT>
|
||||
concept mcc_prohibited_zone_c =
|
||||
mcc_mount_telemetry_data_c<TelemetryDataT> && std::movable<T> && requires(T t, const T t_const) {
|
||||
typename T::coord_t;
|
||||
typename T::time_point_t;
|
||||
|
||||
// the type 'T' must define a static constexpr member of type MccCoordPairKind
|
||||
// to declarate type of coordinate pair used to describe the zone.
|
||||
// This coordinate pair must be used as input in the 'inZone' class method.
|
||||
requires requires {
|
||||
requires std::same_as<decltype(T::zoneCoordPairKind), const MccCoordPairKind>;
|
||||
[]() {
|
||||
constexpr MccCoordPairKind val = T::zoneCoordPairKind;
|
||||
}(); // to ensure that 'zoneCoordPairKind' can be used at compile-time context
|
||||
// the type 'T' must define a static constexpr member of type MccCoordPairKind
|
||||
// to declarate type of coordinate pair used to describe the zone.
|
||||
// This coordinate pair must be used as input in the 'inZone' class method.
|
||||
requires requires {
|
||||
requires std::same_as<decltype(T::zoneCoordPairKind), const MccCoordPairKind>;
|
||||
[]() {
|
||||
constexpr MccCoordPairKind val = T::zoneCoordPairKind;
|
||||
}(); // to ensure that 'zoneCoordPairKind' can be used at compile-time context
|
||||
};
|
||||
|
||||
// return a name of the zone
|
||||
{ t_const.name() } -> mcc_formattable;
|
||||
|
||||
|
||||
// check if given coordinates are into the zone.
|
||||
// input coordinates interpretation is in according to 'zoneCoordPairKind' static constexpr member
|
||||
{
|
||||
t.inZone(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>())
|
||||
} -> std::convertible_to<bool>;
|
||||
|
||||
|
||||
// for given coordinates and time the method computes a time to reach the zone.
|
||||
// implementation of the method must assume that input coordinates are apparent RA and DEC at given time point,
|
||||
// while the time point is one from which computation should be performed (e.g. current time moment)
|
||||
{
|
||||
t.timeTo(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>(),
|
||||
std::declval<typename T::time_point_t>())
|
||||
} -> mcc_time_duration_c;
|
||||
|
||||
|
||||
// for given coordinates and time the method computes a time to exit from the zone
|
||||
{
|
||||
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_data_c&' (const lvalue reference)
|
||||
|
||||
{ t.inZone(std::declval<const TelemetryDataT&>()) } -> std::convertible_to<bool>;
|
||||
{ t.timeTo(std::declval<const TelemetryDataT&>()) } -> mcc_time_duration_c;
|
||||
{ t.timeFrom(std::declval<const TelemetryDataT&>()) } -> mcc_time_duration_c;
|
||||
};
|
||||
|
||||
// return a name of the zone
|
||||
{ t_const.name() } -> mcc_formattable;
|
||||
|
||||
|
||||
// check if given coordinates are into the zone.
|
||||
// input coordinates interpretation is in according to 'zoneCoordPairKind' static constexpr member
|
||||
{ t.inZone(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>()) } -> std::convertible_to<bool>;
|
||||
|
||||
|
||||
// for given coordinates and time the method computes a time to reach the zone.
|
||||
// implementation of the method must assume that input coordinates are apparent RA and DEC at given time point,
|
||||
// while the time point is one from which computation should be performed (e.g. current time moment)
|
||||
{
|
||||
t.timeTo(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>(),
|
||||
std::declval<typename T::time_point_t>())
|
||||
} -> mcc_time_duration_c;
|
||||
|
||||
|
||||
// for given coordinates and time the method computes a time to exit from the zone
|
||||
{
|
||||
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)>>;
|
||||
};
|
||||
|
||||
|
||||
/* MOUNT GENERIC CONFIGURATION */
|
||||
|
||||
|
||||
template <typename T>
|
||||
concept mcc_mount_config_c = requires(T t) {
|
||||
{ t.astromEngine() } -> mcc_astrom_engine_c;
|
||||
{ t.pec() } -> mcc_mount_pec_c;
|
||||
{ t.hardware() } -> mcc_mount_hardware_c;
|
||||
// { t.astromEngine() } -> mcc_astrom_engine_c;
|
||||
// { t.pec() } -> mcc_mount_pec_c;
|
||||
// { t.hardware() } -> mcc_mount_hardware_c;
|
||||
|
||||
requires mcc_astrom_engine_c<decltype(t.astrometryEngine)>;
|
||||
requires mcc_mount_pec_c<decltype(t.PEC)>;
|
||||
requires mcc_mount_hardware_c<decltype(t.hardware)>;
|
||||
requires mcc_mount_telemetry_c<decltype(t.telemetry)>;
|
||||
|
||||
requires mcc_slew_model_c<decltype(t.slewModel), decltype(t.telemetry)>;
|
||||
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...>) {
|
||||
}(t.prohibitedZones);
|
||||
};
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user