...
This commit is contained in:
@@ -4,10 +4,10 @@
|
||||
|
||||
#include <concepts>
|
||||
|
||||
#include "mcc_finite_state_machine.h"
|
||||
#include "mcc_mount_coord.h"
|
||||
#include "mcc_traits.h"
|
||||
|
||||
|
||||
/* SOME LIBRARY-WIDE DECLARATIONS */
|
||||
|
||||
namespace mcc
|
||||
@@ -63,6 +63,22 @@ namespace mcc::traits
|
||||
{
|
||||
|
||||
|
||||
/* GENERIC LOGGER */
|
||||
|
||||
template <typename T>
|
||||
concept mcc_logger_c = requires(T t, const T t_const) {
|
||||
typename T::loglevel_t;
|
||||
{ t.setLogLevel(std::declval<typename T::loglevel_t>()) };
|
||||
{ t_const.getLogLevel() } -> std::same_as<typename T::loglevel_t>;
|
||||
|
||||
{ t.logMessage(std::declval<typename T::loglevel_t>(), std::declval<const std::string&>()) };
|
||||
|
||||
{ t.logError(std::declval<const std::string&>()) };
|
||||
{ t.logDebug(std::declval<const std::string&>()) };
|
||||
{ t.logWarn(std::declval<const std::string&>()) };
|
||||
{ t.logInfo(std::declval<const std::string&>()) };
|
||||
};
|
||||
|
||||
/* ASTROMETRY-RELATED COMPUTATION ENGINE */
|
||||
|
||||
template <typename T>
|
||||
@@ -171,6 +187,7 @@ concept mcc_mount_hardware_c = !std::copyable<T> && std::movable<T> && requires(
|
||||
{ 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>;
|
||||
{ t.init() } -> std::same_as<typename T::error_t>;
|
||||
};
|
||||
|
||||
|
||||
@@ -235,12 +252,14 @@ concept mcc_mount_telemetry_c = requires(T t, const T t_const) {
|
||||
// // 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 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>;
|
||||
@@ -336,8 +355,8 @@ concept mcc_prohibited_zone_c =
|
||||
|
||||
|
||||
// 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)
|
||||
// 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>())
|
||||
@@ -369,11 +388,11 @@ concept mcc_prohibited_zone_c =
|
||||
|
||||
|
||||
|
||||
/* MOUNT GENERIC CONFIGURATION */
|
||||
/* MOUNT GENERIC CONTROLS */
|
||||
|
||||
|
||||
template <typename T>
|
||||
concept mcc_mount_config_c = std::movable<T> && requires(T t) {
|
||||
concept mcc_mount_controls_c = std::move_constructible<T> && std::movable<T> && requires(T t) {
|
||||
requires mcc_astrom_engine_c<decltype(t.astrometryEngine)>;
|
||||
requires mcc_mount_pec_c<decltype(t.PEC)>;
|
||||
requires mcc_mount_hardware_c<decltype(t.hardware)>;
|
||||
@@ -388,5 +407,37 @@ concept mcc_mount_config_c = std::movable<T> && requires(T t) {
|
||||
};
|
||||
|
||||
|
||||
/* GENERIC MOUNT CONCEPTS */
|
||||
|
||||
template <typename T>
|
||||
concept mcc_mount_c = requires(T t) {
|
||||
// the class must define typename 'mount_controls_t' and it must be its base class
|
||||
requires mcc_mount_controls_c<typename T::mount_controls_t>;
|
||||
requires std::derived_from<T, typename T::mount_controls_t>;
|
||||
|
||||
|
||||
// deduced from 'mount_controls_t' typenames
|
||||
requires mcc_mount_telemetry_c<typename T::mount_telemetry_t>;
|
||||
requires std::same_as<typename T::mount_telemetry_data_t, typename T::mount_telemetry_t::mount_telemetry_data_t>;
|
||||
requires mcc_astrom_engine_c<typename T::astrom_engine_t>;
|
||||
requires mcc_mount_pec_c<typename T::pec_t>;
|
||||
requires mcc_mount_hardware_c<typename T::hardware_t>;
|
||||
requires mcc_slew_model_c<typename T::slew_model_t, typename T::mount_telemetry_t>;
|
||||
requires mcc_guiding_model_c<typename T::guiding_model_t, typename T::mount_telemetry_t>;
|
||||
|
||||
requires std::same_as<typename T::slew_params_t, typename T::slew_model_t::slew_params_t>;
|
||||
|
||||
// public method
|
||||
{ t.mountTelemetryData() } -> std::same_as<typename T::mount_telemetry_data_t>;
|
||||
};
|
||||
|
||||
// generic with logging methods
|
||||
template <typename T>
|
||||
concept mcc_log_mount_c = mcc_mount_c<T> && mcc_logger_c<T>;
|
||||
|
||||
|
||||
// a generic Finite State Machine mount with logging methods
|
||||
template <typename T>
|
||||
concept mcc_fsm_log_mount_c = std::derived_from<T, fsm::MccFiniteStateMachine> && mcc_log_mount_c<T>;
|
||||
|
||||
} // namespace mcc::traits
|
||||
|
||||
Reference in New Issue
Block a user