From 578339fd8b3031c109e76090d571465265ffd8c8 Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Tue, 17 Feb 2026 16:24:33 +0300 Subject: [PATCH] ... --- include/mcc/mcc_concepts.h | 8 ++++++++ include/mcc/mcc_coordinate.h | 22 +++++++++++++++------ include/mcc/mcc_movement_controls.h | 30 ++++++++++++++++++++++------- 3 files changed, 47 insertions(+), 13 deletions(-) diff --git a/include/mcc/mcc_concepts.h b/include/mcc/mcc_concepts.h index 879c7fb..24a4974 100644 --- a/include/mcc/mcc_concepts.h +++ b/include/mcc/mcc_concepts.h @@ -662,6 +662,14 @@ concept mcc_hardware_c = requires(T t) { // static const variable with name of hardware requires std::formattable && std::is_const_v; + + // the 'T' class must contain static constexpr member of 'MccMountType' type + requires std::same_as; + []() { + [[maybe_unused]] static constexpr MccMountType val = T::mountType; + }(); // to ensure 'mountType' can be used in compile-time context + + // a type that defines at least HW_MOVE_ERROR, HW_MOVE_STOPPING, HW_MOVE_STOPPED, HW_MOVE_SLEWING, // HW_MOVE_ADJUSTING, HW_MOVE_TRACKING and HW_MOVE_GUIDING compile-time constants. The main purpose of this type is // a possible tunning of hardware hardwareSetState-related commands and detect the stop and error states from diff --git a/include/mcc/mcc_coordinate.h b/include/mcc/mcc_coordinate.h index c873aff..0f18b2c 100644 --- a/include/mcc/mcc_coordinate.h +++ b/include/mcc/mcc_coordinate.h @@ -344,14 +344,24 @@ struct MccSkyAZALT : MccCoordPair { } }; - -using MccGenXY = MccCoordPair; - -using MccGeoLONLAT = MccCoordPair; +// utility type definition: deduce a coordinate pair kind according to mount type +// mcc_deduced_coord_pair_t = MccSkyHADEC_OBS for equathorial mounts, +// mcc_deduced_coord_pair_t = MccSkyAZZD for altazimuthal ones and +// mcc_deduced_coord_pair_t = std::nullptr_t otherwise +template +using mcc_deduced_coord_pair_t = + std::conditional_t>; -static MccSkyHADEC_APP hadec = MccGenXY{}; -static MccSkyAZALT azalt{MccSkyAZZD{1.0, 1.1}}; +// using MccGenXY = MccCoordPair; + +// using MccGeoLONLAT = MccCoordPair; + + +// static MccSkyHADEC_APP hadec = MccGenXY{}; +// static MccSkyAZALT azalt{MccSkyAZZD{1.0, 1.1}}; /* MCC-LIBRARY DEFAULT GENERIC SKY POINT CLASS IMPLEMENTATION */ diff --git a/include/mcc/mcc_movement_controls.h b/include/mcc/mcc_movement_controls.h index 6ec6fb3..b7db3fb 100644 --- a/include/mcc/mcc_movement_controls.h +++ b/include/mcc/mcc_movement_controls.h @@ -602,9 +602,7 @@ public: auto start_point = std::chrono::steady_clock::now(); auto last_hw_time = tdata.hwState.XY.epoch().UTC(); - std::conditional_t> - tag_cp, mnt_cp; + mcc_deduced_coord_pair_t tag_cp, mnt_cp; while (!*_stopMoving) { t_err = telemetry->telemetryData(&tdata); @@ -651,8 +649,16 @@ public: last_hw_time = tdata.hwState.XY.epoch().UTC(); - auto dist = utils::distanceOnSphere(tdata.targetPos.co_lon(), tdata.targetPos.co_lat(), - tdata.mountPos.co_lon(), tdata.mountPos.co_lat()); + auto ccte_err = tdata.targetPos.to(tag_cp); + if (ccte_err) { + *_lastError = mcc_deduced_err(ccte_err, MccSimpleMovementControlsErrorCode::ERROR_CCTE_COMP); + } + ccte_err = tdata.mountPos.to(mnt_cp); + if (ccte_err) { + *_lastError = mcc_deduced_err(ccte_err, MccSimpleMovementControlsErrorCode::ERROR_CCTE_COMP); + } + + auto dist = utils::distanceOnSphere(tag_cp.x(), tag_cp.y(), mnt_cp.x(), mnt_cp.y()); logger->logTrace(std::format(" target-to-mount distance: {} (dx = {}, dy = {})", MccAngleFancyString(std::get<2>(dist)), std::get<0>(dist), @@ -711,8 +717,18 @@ public: return; } - auto dist = utils::distanceOnSphere(tdata.targetPos.co_lon(), tdata.targetPos.co_lat(), - tdata.mountPos.co_lon(), tdata.mountPos.co_lat()); + auto ccte_err = tdata.targetPos.to(tag_cp); + if (ccte_err) { + *_lastError = mcc_deduced_err(ccte_err, MccSimpleMovementControlsErrorCode::ERROR_CCTE_COMP); + return; + } + ccte_err = tdata.mountPos.to(mnt_cp); + if (ccte_err) { + *_lastError = mcc_deduced_err(ccte_err, MccSimpleMovementControlsErrorCode::ERROR_CCTE_COMP); + return; + } + + auto dist = utils::distanceOnSphere(tag_cp.x(), tag_cp.y(), mnt_cp.x(), mnt_cp.y()); log_pos(tdata);