From 25438960e64e99935e67624f68514388d24d10c4 Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Sat, 2 Aug 2025 14:40:05 +0300 Subject: [PATCH] ... --- cxx/CMakeLists.txt | 1 + cxx/asibfm700_common.h | 35 ++++++++++++++++++++------ cxx/mcc_fsm_mount.h | 14 +++-------- cxx/mcc_mount_astro_erfa.h | 36 +++++++++----------------- cxx/mcc_mount_concepts.h | 9 +++---- cxx/mcc_mount_telemetry.h | 5 ++-- cxx/mcc_mount_telemetry_astrom.h | 7 ++---- cxx/mcc_slew_model.h | 8 +++--- cxx/tests/astrom_test.cpp | 43 ++++++++++++++++++++++---------- 9 files changed, 87 insertions(+), 71 deletions(-) diff --git a/cxx/CMakeLists.txt b/cxx/CMakeLists.txt index 4341ebf..3c61586 100644 --- a/cxx/CMakeLists.txt +++ b/cxx/CMakeLists.txt @@ -156,6 +156,7 @@ if (WITH_TESTS) set(ASTROM_TEST_APP astrom_test) add_executable(${ASTROM_TEST_APP} tests/astrom_test.cpp) + target_include_directories(${ASTROM_TEST_APP} PRIVATE ${FITPACK_INCLUDE_DIR}) target_link_libraries(${ASTROM_TEST_APP} ERFA_LIB) set(FITPACK_TEST_APP fitpack_test) diff --git a/cxx/asibfm700_common.h b/cxx/asibfm700_common.h index 6490b09..5e9a666 100644 --- a/cxx/asibfm700_common.h +++ b/cxx/asibfm700_common.h @@ -6,9 +6,11 @@ #include "asibfm700_hardware.h" +#include "mcc_fsm_mount.h" #include "mcc_guiding_model.h" #include "mcc_mount_astro_erfa.h" #include "mcc_mount_pec.h" +#include "mcc_mount_pz.h" #include "mcc_mount_telemetry.h" #include "mcc_slew_model.h" @@ -19,7 +21,7 @@ typedef mcc::astrom::erfa::MccMountAstromEngineERFA AsibFM700Astr typedef mcc::MccMountDefaultPEC AsibFM700PointingErrorCorrection; -typedef mcc::MccMountTelemetryData AsibFM700TelemetryData; +typedef mcc::MccMountTelemetryData AsibFM700TelemetryData; typedef mcc::MccMountTelemetry AsibFM700SlewModel; -typedef mcc::MccSimpleGuidingModel<> AsibFM700GuidingModel; +// typedef mcc::MccSimpleSlewModel<> AsibFM700SlewModel; +// typedef mcc::MccSimpleGuidingModel<> AsibFM700GuidingModel; -struct AsibMountControls { - AsibMountControls() : telemetry(astrometryEngine, PEC, hardware) {} +template +using AsibFM700SlewModel = mcc::MccSimpleSlewModel; + +template +using AsibFM700GuidingModel = mcc::MccSimpleGuidingModel; + + +template +struct AsibFM700MountControls { + AsibFM700MountControls(AsibFM700MountControls&&) = default; + AsibFM700MountControls& operator=(AsibFM700MountControls&&) = default; AsibFM700AstromEngine astrometryEngine; AsibFM700PointingErrorCorrection PEC; AsibFM700Hardware hardware; - AsibFM700Telemetry telemetry; - AsibFM700SlewModel slewModel; - AsibFM700GuidingModel guidingModel; + AsibFM700Telemetry telemetry{astrometryEngine, PEC, hardware}; + AsibFM700SlewModel slewModel; + AsibFM700GuidingModel guidingModel; + + std::tuple> prohibitedZones; }; // global mount configuration @@ -52,4 +65,10 @@ struct AsibFM700Config { AsibFM700Hardware::hardware_config_t hardwareConfig; }; + +class AsibFM700Mount : public mcc::MccMount> +{ +public: +}; + } // namespace asibfm700 diff --git a/cxx/mcc_fsm_mount.h b/cxx/mcc_fsm_mount.h index 0f7e129..8f44492 100644 --- a/cxx/mcc_fsm_mount.h +++ b/cxx/mcc_fsm_mount.h @@ -41,7 +41,7 @@ public: typedef decltype(mount_controls_t::slewModel) slew_model_t; typedef decltype(mount_controls_t::guidingModel) guiding_model_t; - typedef typename slew_model_t::slew_params_t slew_params_t; + // typedef typename slew_model_t::slew_params_t slew_params_t; /* constructors and destructor */ @@ -65,24 +65,18 @@ public: } - virtual ~MccMount() - { - logDebug("Delete MccMount class instance: thread = {}", getThreadId()); - } + virtual ~MccMount() { logDebug("Delete MccMount class instance: thread = {}", getThreadId()); } /* public methods */ - void initMount() - { - this->logInfo("STATE: {}", this->currentStateID()); - } + void initMount() { this->logInfo("STATE: {}", this->currentStateID()); } void stopMount() {} void shutdownMount() {} - void slewMount(slew_params_t params) {} + // void slewMount(slew_params_t params) {} void startGuiding() {} diff --git a/cxx/mcc_mount_astro_erfa.h b/cxx/mcc_mount_astro_erfa.h index 018c3ea..b492b6b 100644 --- a/cxx/mcc_mount_astro_erfa.h +++ b/cxx/mcc_mount_astro_erfa.h @@ -58,10 +58,7 @@ namespace mcc::astrom::erfa struct MccMountAstromEngineERFACategory : public std::error_category { MccMountAstromEngineERFACategory() : std::error_category() {} - const char* name() const noexcept - { - return "ADC_GENERIC_DEVICE"; - } + const char* name() const noexcept { return "ADC_GENERIC_DEVICE"; } std::string message(int ec) const { @@ -178,6 +175,12 @@ public: MccMountAstromEngineERFA(engine_state_t state) : _currentState(std::move(state)) {} + MccMountAstromEngineERFA(MccMountAstromEngineERFA&&) = default; + MccMountAstromEngineERFA& operator=(MccMountAstromEngineERFA&&) = default; + + MccMountAstromEngineERFA(const MccMountAstromEngineERFA&) = delete; + MccMountAstromEngineERFA& operator=(const MccMountAstromEngineERFA&) = delete; + virtual ~MccMountAstromEngineERFA() = default; void setState(engine_state_t state) @@ -251,10 +254,7 @@ public: /* time-related methods */ - static time_point_t timePointNow() - { - return time_point_t::clock::now(); - } + static time_point_t timePointNow() { return time_point_t::clock::now(); } // templated generic version template @@ -554,26 +554,14 @@ public: /* helper mathods */ - auto leapSecondsExpireDate() const - { - return _currentState._leapSeconds.expireDate(); - } + auto leapSecondsExpireDate() const { return _currentState._leapSeconds.expireDate(); } - auto leapSecondsExpireMJD() const - { - return _currentState._leapSeconds.expireMJD(); - } + auto leapSecondsExpireMJD() const { return _currentState._leapSeconds.expireMJD(); } - auto bulletinADateRange() const - { - return _currentState._bulletinA.dateRange(); - } + auto bulletinADateRange() const { return _currentState._bulletinA.dateRange(); } - auto bulletinADateRangeMJD() const - { - return _currentState._bulletinA.dateRangeMJD(); - } + auto bulletinADateRangeMJD() const { return _currentState._bulletinA.dateRangeMJD(); } protected: engine_state_t _currentState{}; diff --git a/cxx/mcc_mount_concepts.h b/cxx/mcc_mount_concepts.h index 79a680c..9989867 100644 --- a/cxx/mcc_mount_concepts.h +++ b/cxx/mcc_mount_concepts.h @@ -267,7 +267,7 @@ concept mcc_mount_hardware_c = !std::copyable && std::movable && requires( /* POINTING-ERROR CORRECTION */ template -concept mcc_mount_pec_c = requires(T t, const T t_const) { +concept mcc_mount_pec_c = requires(T t) { requires mcc_error_c; typename T::coord_t; @@ -349,8 +349,6 @@ concept mcc_mount_telemetry_c = requires(T t, const T t_const) { requires mcc_mount_telemetry_data_c; - { t_const.errorString(std::declval()) } -> mcc_formattable; - { t.update() } -> std::same_as; { t.data(std::declval()) } -> std::same_as; @@ -499,7 +497,8 @@ concept mcc_prohibited_zone_c = template -concept mcc_mount_controls_c = std::move_constructible && std::movable && requires(T t) { +concept mcc_mount_controls_c = requires(T t) { + // concept mcc_mount_controls_c = std::move_constructible && std::movable && requires(T t) { requires mcc_astrom_engine_c; requires mcc_mount_pec_c; requires mcc_mount_hardware_c; @@ -536,7 +535,7 @@ concept mcc_mount_c = requires(T t) { // requires mcc_guiding_model_c; requires mcc_guiding_model_c; - requires std::same_as; + // requires std::same_as; // public method { t.mountTelemetryData() } -> std::same_as; diff --git a/cxx/mcc_mount_telemetry.h b/cxx/mcc_mount_telemetry.h index 5446117..b3eda08 100644 --- a/cxx/mcc_mount_telemetry.h +++ b/cxx/mcc_mount_telemetry.h @@ -71,7 +71,7 @@ namespace mcc /* DEFAULT TELEMETRY DATA CLASS */ -template +template struct MccMountTelemetryData { typedef typename ASTROM_ENGINE_T::coord_t coord_t; typedef typename ASTROM_ENGINE_T::time_point_t time_point_t; @@ -120,8 +120,7 @@ struct MccMountTelemetryData { template > DATA_T = - MccMountTelemetryData> + std::derived_from> DATA_T = MccMountTelemetryData> class MccMountTelemetry : public MccMountTelemetryAstromTransform { typedef MccMountTelemetryAstromTransform base_t; diff --git a/cxx/mcc_mount_telemetry_astrom.h b/cxx/mcc_mount_telemetry_astrom.h index bac6a20..4c34d9b 100644 --- a/cxx/mcc_mount_telemetry_astrom.h +++ b/cxx/mcc_mount_telemetry_astrom.h @@ -26,10 +26,7 @@ enum class MccMountTelemetryAstromTransformErrorCode : int { struct MccMountTelemetryAstromTransformCategory : public std::error_category { MccMountTelemetryAstromTransformCategory() : std::error_category() {} - const char* name() const noexcept - { - return "ADC_GENERIC_DEVICE"; - } + const char* name() const noexcept { return "ADC_GENERIC_DEVICE"; } std::string message(int ec) const { @@ -83,7 +80,7 @@ namespace mcc template class MccMountTelemetryAstromTransform { - static typename ASTROM_ENGINE_T::coord_t dummyCoord{}; + inline static typename ASTROM_ENGINE_T::coord_t dummyCoord{}; public: typedef ASTROM_ENGINE_T astrom_engine_t; diff --git a/cxx/mcc_slew_model.h b/cxx/mcc_slew_model.h index 2093673..aad1f84 100644 --- a/cxx/mcc_slew_model.h +++ b/cxx/mcc_slew_model.h @@ -141,6 +141,11 @@ public: init(mount_controls); } + MccSimpleSlewModel(MccSimpleSlewModel&&) = default; + MccSimpleSlewModel& operator=(MccSimpleSlewModel&&) = default; + MccSimpleSlewModel(const MccSimpleSlewModel&) = default; + MccSimpleSlewModel& operator=(const MccSimpleSlewModel&) = default; + virtual ~MccSimpleSlewModel() { logDebug(std::format("Delete 'MccSimpleSlewModel' class instance ({})", (void*)this)); @@ -163,7 +168,6 @@ public: protected: std::atomic_bool _stopRequested{false}; std::function _slewFunc{}; - std::mutex _updateMutex{}; void init(auto& mount_controls) { @@ -404,6 +408,4 @@ protected: }; -static_assert(traits::mcc_slew_model_c>, ""); - } // namespace mcc diff --git a/cxx/tests/astrom_test.cpp b/cxx/tests/astrom_test.cpp index c58972e..e430c5c 100644 --- a/cxx/tests/astrom_test.cpp +++ b/cxx/tests/astrom_test.cpp @@ -1,23 +1,28 @@ -#include +// #include #include // #include "../mcc_coord.h" #include "../mcc_mount_astro_erfa.h" #include "../mcc_mount_pz.h" -#include "../mount_astrom.h" +// #include "../mount_astrom.h" +#include "../mcc_mount_pec.h" +#include "../mcc_mount_telemetry.h" // BTA coords from maps.yandex.ru: 43.646711, 41.440732 -struct tel_data_t { - typedef mcc::MccAngle coord_t; - typedef std::chrono::system_clock::time_point time_point_t; +// struct tel_data_t { +// typedef mcc::MccAngle coord_t; +// typedef std::chrono::system_clock::time_point time_point_t; - time_point_t time_point; - coord_t mntRA, mntDEC, mntHA; - coord_t mntAZ, mntALT; - coord_t mntPosX, mntPosY; - coord_t mntRateX, mntRateY; -}; +// time_point_t time_point; +// coord_t tagRA, tagDEC, tagHA; +// coord_t tagAZ, tagALT; + +// coord_t mntRA, mntDEC, mntHA; +// coord_t mntAZ, mntALT; +// coord_t mntPosX, mntPosY; +// coord_t mntRateX, mntRateY; +// }; int main(int argc, char* argv[]) { @@ -209,7 +214,13 @@ int main(int argc, char* argv[]) mcc::MccMinAltPZ minalt_pz(10.0_degs, state.lat); mcc::MccMaxAltPZ maxalt_pz(85.0_degs, state.lat); - tel_data_t tdata{std::chrono::system_clock::now(), ra_o, dec_o, ha1, az1, alt1, 0.0, 0.0, 0.0, 0.0}; + // tel_data_t tdata{std::chrono::system_clock::now(), ra_o, dec_o, ha1, az1, alt1, 0.0, 0.0, 0.0, 0.0}; + mcc::MccMountTelemetryData tdata{.time_point = engine_t::timePointNow(), + .mntRA = ra_o, + .mntDEC = dec_o, + .mntHA = ha1, + .mntAZ = az1, + .mntALT = alt1}; bool ask = minalt_pz.inZone(tdata); std::cout << "in zone? " << std::boolalpha << ask << "\n"; @@ -244,7 +255,13 @@ int main(int argc, char* argv[]) std::cout << "DEC_app = " << dec_o.sexagesimal() << "\n"; - tdata = {std::chrono::system_clock::now(), ra_o, dec_o, ha1, az1, alt1, 0.0, 0.0, 0.0, 0.0}; + // tdata = {std::chrono::system_clock::now(), ra_o, dec_o, ha1, az1, alt1, 0.0, 0.0, 0.0, 0.0}; + tdata = {.time_point = engine_t::timePointNow(), + .mntRA = ra_o, + .mntDEC = dec_o, + .mntHA = ha1, + .mntAZ = az1, + .mntALT = alt1}; jd.mjd += 1.0; res = erfa.icrs2obs(ra1, dec1, jd, ra_o, dec_o, ha1, az1, alt1, eor);