From 7556539084f7dc08025b2c28dd5e9effc24d2049 Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Tue, 26 Aug 2025 13:38:33 +0300 Subject: [PATCH] ... --- mcc/mcc_generic_mount.h | 57 +++++++++++++++++++++++ mcc/mcc_generics.h | 100 +++++++++++++++++++++++++--------------- 2 files changed, 121 insertions(+), 36 deletions(-) create mode 100644 mcc/mcc_generic_mount.h diff --git a/mcc/mcc_generic_mount.h b/mcc/mcc_generic_mount.h new file mode 100644 index 0000000..187c34f --- /dev/null +++ b/mcc/mcc_generic_mount.h @@ -0,0 +1,57 @@ +#pragma once + +/* MOUNT CONTROL COMPONENTS LIBRARY */ + + +/* GENERIC MOUNT REFERENCE IMPLEMENTATION */ + + +#include "mcc_generics.h" + +namespace mcc +{ + +template +class MccGenericMount : public TelemetryT, public PZoneContT, public LoggerT +{ +public: + MccGenericMount(TelemetryT telemetry, PZoneContT pzone_cont, LoggerT logger) + : TelemetryT(std::move(telemetry)), PZoneContT(std::move(pzone_cont)), LoggerT(std::move(logger)) + { + } + + virtual ~MccGenericMount() = default; + + + template SelfT> + auto slewToTarget(this SelfT&& self) + { + return std::forward(self).slewToTarget(); + } + + template SelfT> + auto trackTarget(this SelfT&& self) + { + return std::forward(self).trackTarget(); + } + + template SelfT> + auto startGuidingTarget(this SelfT&& self) + { + return std::forward(self).startGuidingTarget(); + } + + template SelfT> + auto stopGuidingTarget(this SelfT&& self) + { + return std::forward(self).stopGuidingTarget(); + } + + template SelfT> + auto stopMount(this SelfT&& self) + { + return std::forward(self).stopMount(); + } +}; + +} // namespace mcc diff --git a/mcc/mcc_generics.h b/mcc/mcc_generics.h index d82886b..6a1a109 100644 --- a/mcc/mcc_generics.h +++ b/mcc/mcc_generics.h @@ -698,6 +698,9 @@ concept mcc_slewing_model_c = requires(T t, const T t_const) { { t.slewToTarget() } -> std::same_as; { t.stopSlewing() } -> std::same_as; + + { t.setSlewingParams(std::declval()) } -> std::same_as; + { t.getSlewingParams() } -> std::same_as; }; @@ -715,6 +718,9 @@ concept mcc_tracking_model_c = requires(T t, const T t_const) { { t.trackTarget() } -> std::same_as; { t.stopTracking() } -> std::same_as; + + { t.setTrackingParams(std::declval()) } -> std::same_as; + { t.getTrackingParams() } -> std::same_as; }; template @@ -731,6 +737,9 @@ concept mcc_guiding_model_c = requires(T t, const T t_const) { { t.startGuidingTarget() } -> std::same_as; { t.stopGuidingTarget() } -> std::same_as; + + { t.setGuidingParams(std::declval()) } -> std::same_as; + { t.getGuidingParams() } -> std::same_as; }; @@ -738,51 +747,70 @@ concept mcc_guiding_model_c = requires(T t, const T t_const) { -template -struct mcc_generic_mount_interface_t { - virtual ~mcc_generic_mount_interface_t() = default; +// template +// struct mcc_generic_mount_interface_t { +// virtual ~mcc_generic_mount_interface_t() = default; - // slew mount to target (target coordinates were defined in telemetry data) - template SelfT> - RetT slewToTarget(this SelfT&& self, mcc_slewing_model_c auto model) - { - return std::forward(self).slewToTarget(std::move(model)); - } +// // slew mount to target (target coordinates were defined in telemetry data) +// template SelfT> +// RetT slewToTarget(this SelfT&& self, mcc_slewing_model_c auto model) +// { +// return std::forward(self).slewToTarget(std::move(model)); +// } - // track target, i.e., the mount moves with celestial speed - template SelfT> - RetT trackTarget(this SelfT&& self, mcc_tracking_model_c auto model) - { - return std::forward(self).trackTarget(std::move(model)); - } +// // track target, i.e., the mount moves with celestial speed +// template SelfT> +// RetT trackTarget(this SelfT&& self, mcc_tracking_model_c auto model) +// { +// return std::forward(self).trackTarget(std::move(model)); +// } - template SelfT> - RetT startGuidingTarget(this SelfT&& self, mcc_guiding_model_c auto model) - { - return std::forward(self).startGuidingTarget(std::move(model)); - } +// template SelfT> +// RetT startGuidingTarget(this SelfT&& self, mcc_guiding_model_c auto model) +// { +// return std::forward(self).startGuidingTarget(std::move(model)); +// } - template SelfT> - RetT stopGuidingTarget(this SelfT&& self) - { - return std::forward(self).stopGuidingTarget(); - } +// template SelfT> +// RetT stopGuidingTarget(this SelfT&& self) +// { +// return std::forward(self).stopGuidingTarget(); +// } - template SelfT> - RetT stopMount(this SelfT&& self, StopReasonT reason) - { - return std::forward(self).stopMount(std::move(reason)); - } +// template SelfT> +// RetT stopMount(this SelfT&& self, StopReasonT reason) +// { +// return std::forward(self).stopMount(std::move(reason)); +// } -protected: - mcc_generic_mount_interface_t() = default; -}; +// protected: +// mcc_generic_mount_interface_t() = default; +// }; +// template +// concept mcc_generic_mount_c +// = std::derived_from> +// && mcc_telemetry_c && mcc_pzone_container_c; + template -concept mcc_generic_mount_c = - std::derived_from> && - mcc_telemetry_c && mcc_pzone_container_c; +concept mcc_generic_mount_c = mcc_telemetry_c && mcc_pzone_container_c && requires(T t) { + requires mcc_error_c; + typename T::stop_reason_t; + + // slew mount to target (target coordinates were defined in telemetry data) + { t.slewToTarget() } -> std::same_as; + + // track target, i.e., the mount moves with celestial speed + { t.trackTarget() } -> std::same_as; + + + { t.startGuidingTarget() } -> std::same_as; + { t.stopGuidingTarget() } -> std::same_as; + + // stop any movement + { t.stopMount(std::declval()) } -> std::same_as; +}; // with logging methods