From ab49f927fbe945f2feecd4b6a5898897ee62e135 Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Wed, 10 Sep 2025 18:07:22 +0300 Subject: [PATCH] ... --- CMakeLists.txt | 2 +- asibfm700/CMakeLists.txt | 3 +- asibfm700/asibfm700_common.h | 29 +++++++++++++++ asibfm700/asibfm700_mount.cpp | 20 +++++++++++ asibfm700/asibfm700_mount.h | 52 +++++++++++++++++++++++++++ asibfm700/asibfm700_servocontroller.h | 2 +- mcc/CMakeLists.txt | 32 ++++++++--------- mcc/mcc_defaults.h | 4 ++- mcc/mcc_generics.h | 13 +++---- mcc/mcc_tracking_model.h | 24 ++++++++++++- 10 files changed, 154 insertions(+), 27 deletions(-) create mode 100644 asibfm700/asibfm700_mount.cpp create mode 100644 asibfm700/asibfm700_mount.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 7353c2a..c6b399d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,6 +12,6 @@ set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) # # ******* C++ PART OF THE PROJECT ******* -add_subdirectory(cxx) +# add_subdirectory(cxx) add_subdirectory(mcc) add_subdirectory(asibfm700) diff --git a/asibfm700/CMakeLists.txt b/asibfm700/CMakeLists.txt index ada1a34..8d89451 100644 --- a/asibfm700/CMakeLists.txt +++ b/asibfm700/CMakeLists.txt @@ -11,5 +11,6 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") set(ASIBFM700_LIB_SRC asibfm700_common.h asibfm700_servocontroller.h asibfm700_servocontroller.cpp) set(ASIBFM700_LIB asibfm700mount) -add_library(${ASIBFM700_LIB} STATIC ${ASIBFM700_LIB_SRC}) +add_library(${ASIBFM700_LIB} STATIC ${ASIBFM700_LIB_SRC} + asibfm700_mount.h asibfm700_mount.cpp) target_link_libraries(${ASIBFM700_LIB} PRIVATE mcc1) diff --git a/asibfm700/asibfm700_common.h b/asibfm700/asibfm700_common.h index a563e11..9ef6e73 100644 --- a/asibfm700/asibfm700_common.h +++ b/asibfm700/asibfm700_common.h @@ -5,9 +5,38 @@ /* COMMON LIBRARY DEFINITIONS */ + +#include +#include + #include "asibfm700_servocontroller.h" namespace asibfm700 { +static constexpr mcc::MccMountType asibfm700MountType = mcc::MccMountType::FORK_TYPE; + +struct Asibfm700MountConfig { + std::chrono::milliseconds hardwarePollingPeriod{100}; // main cycle period + + // CCTE-related configuration + double siteLatitude{43.646711_degs}; + double siteLongitude{41.440732_degs}; + double siteElevation{2100.0}; + double refractWavelength{0.55}; + + std::string leapSecondFilename{}; + std::string bulletinAFilename{}; + + + // PCM-related configuration + mcc::MccDefaultPCM::pcm_data_t pcmData{ + .type = mcc::MccDefaultPCMType::PCM_TYPE_GEOMETRY, + .siteLatitude = siteLatitude, + .geomCoefficients = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}}; + + AsibFM700ServoController::hardware_config_t servoControllerConfig{}; + mcc::MccSimpleMovingModelParams movingModelParams{}; +}; + } // namespace asibfm700 diff --git a/asibfm700/asibfm700_mount.cpp b/asibfm700/asibfm700_mount.cpp new file mode 100644 index 0000000..477d17f --- /dev/null +++ b/asibfm700/asibfm700_mount.cpp @@ -0,0 +1,20 @@ +#include "asibfm700_mount.h" + +namespace asibfm700 +{ + + +Asibfm700Mount::Asibfm700Mount(Asibfm700MountConfig const& config, + std::shared_ptr logger, + const auto& pattern_range) + : mcc::ccte::erfa::MccCCTE_ERFA({.meteo{.temperature = 10.0, .humidity = 0.5, .pressure = 1010.0}, + .wavelength = config.refractWavelength, + .lat = config.siteLatitude, + .lon = config.siteLongitude, + .elev = config.siteElevation}), + mcc::MccDefaultPCM(config.pcmData), + base_gm_class_t(AsibFM700ServoController{config.servoControllerConfig}, mcc::MccTelemetry{this}); +{ +} + +} // namespace asibfm700 diff --git a/asibfm700/asibfm700_mount.h b/asibfm700/asibfm700_mount.h new file mode 100644 index 0000000..57dc1f4 --- /dev/null +++ b/asibfm700/asibfm700_mount.h @@ -0,0 +1,52 @@ +#pragma once + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "asibfm700_common.h" + + + +namespace asibfm700 +{ + +class Asibfm700Mount : protected mcc::ccte::erfa::MccCCTE_ERFA, + protected mcc::MccDefaultPCM, + protected AsibFM700ServoController, + public mcc::MccGenericMountFSM, + mcc::MccSimpleSlewingModel, + mcc::MccSimpleTrackingModel, + mcc::utils::MccSpdlogLogger> +{ + typedef mcc::MccGenericMountFSM, + mcc::MccSimpleSlewingModel, + mcc::MccSimpleTrackingModel, + mcc::utils::MccSpdlogLogger> + base_gm_class_t; + +public: + using mcc::ccte::erfa::MccCCTE_ERFA::setStateERFA; + using mcc::ccte::erfa::MccCCTE_ERFA::updateBulletinA; + using mcc::ccte::erfa::MccCCTE_ERFA::updateLeapSeconds; + using mcc::ccte::erfa::MccCCTE_ERFA::updateMeteoERFA; + + Asibfm700Mount(Asibfm700MountConfig const& config, + std::shared_ptr logger, + const auto& pattern_range = LOGGER_DEFAULT_FORMAT); + + ~Asibfm700Mount(); +}; + + +} // namespace asibfm700 diff --git a/asibfm700/asibfm700_servocontroller.h b/asibfm700/asibfm700_servocontroller.h index 4bc4ae6..098ed48 100644 --- a/asibfm700/asibfm700_servocontroller.h +++ b/asibfm700/asibfm700_servocontroller.h @@ -53,7 +53,7 @@ class is_error_code_enum : public namespace asibfm700 { -class AsibFM700ServoController final +class AsibFM700ServoController { public: typedef std::error_code error_t; diff --git a/mcc/CMakeLists.txt b/mcc/CMakeLists.txt index bdb739e..266264e 100644 --- a/mcc/CMakeLists.txt +++ b/mcc/CMakeLists.txt @@ -39,22 +39,22 @@ find_package(spdlog CONFIG) # ******* ERFA LIBRARY ******* -# ExternalProject_Add(erfalib -# PREFIX ${CMAKE_BINARY_DIR}/erfa_lib -# GIT_REPOSITORY "https://github.com/liberfa/erfa.git" -# GIT_TAG "v2.0.1" -# UPDATE_COMMAND "" -# PATCH_COMMAND "" -# # BINARY_DIR erfa_build -# # SOURCE_DIR erfa -# # INSTALL_DIR -# LOG_CONFIGURE 1 -# CONFIGURE_COMMAND meson setup --reconfigure -Ddefault_library=static -Dbuildtype=release -# -Dprefix=${CMAKE_BINARY_DIR}/erfa_lib -Dlibdir= -Dincludedir= -Ddatadir= -# BUILD_COMMAND ninja -C -# INSTALL_COMMAND meson install -C -# BUILD_BYPRODUCTS ${CMAKE_BINARY_DIR}/erfa_lib/liberfa.a -# ) +ExternalProject_Add(erfalib + PREFIX ${CMAKE_BINARY_DIR}/erfa_lib + GIT_REPOSITORY "https://github.com/liberfa/erfa.git" + GIT_TAG "v2.0.1" + UPDATE_COMMAND "" + PATCH_COMMAND "" + # BINARY_DIR erfa_build + # SOURCE_DIR erfa + # INSTALL_DIR + LOG_CONFIGURE 1 + CONFIGURE_COMMAND meson setup --reconfigure -Ddefault_library=static -Dbuildtype=release + -Dprefix=${CMAKE_BINARY_DIR}/erfa_lib -Dlibdir= -Dincludedir= -Ddatadir= + BUILD_COMMAND ninja -C + INSTALL_COMMAND meson install -C + BUILD_BYPRODUCTS ${CMAKE_BINARY_DIR}/erfa_lib/liberfa.a +) add_library(ERFA_LIB STATIC IMPORTED) set_target_properties(ERFA_LIB PROPERTIES IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/erfa_lib/liberfa.a) add_dependencies(ERFA_LIB erfalib) diff --git a/mcc/mcc_defaults.h b/mcc/mcc_defaults.h index 1fe57d2..d4af674 100644 --- a/mcc/mcc_defaults.h +++ b/mcc/mcc_defaults.h @@ -13,11 +13,13 @@ namespace mcc { -/* DEFAULT TIME POINT CLASS */ +/* DEFAULT TIME-RELATED CLASSES */ typedef std::chrono::system_clock::time_point MccTimePoint; +typedef std::chrono::duration MccTimeDuration; // seconds as floating-point value + template static constexpr DT mcc_infinite_duration_v = std::floating_point ? DT{std::numeric_limits::infinity()} diff --git a/mcc/mcc_generics.h b/mcc/mcc_generics.h index 4ed4854..88cc336 100644 --- a/mcc/mcc_generics.h +++ b/mcc/mcc_generics.h @@ -181,7 +181,8 @@ concept mcc_refract_model_c = requires(const T t_const) { template concept mcc_celestial_point_c = requires(T t) { - requires std::same_as; // type of given coordinate pair + requires std::same_as, + MccCoordPairKind>; // type of given coordinate pair (it may be even static constexpr value) requires mcc_time_point_c; // time point for given coordinates @@ -416,11 +417,11 @@ concept mcc_hardware_c = requires(T t, const T t_const) { { t_const.hardwareName() } -> std::formattable; // the 'T' class must contain static constexpr member of 'MccMountType' type - requires std::same_as; - []() { - static constexpr MccMountType val = T::mountType; - return val; - }(); // to ensure 'mountType' can be used in compile-time context + // requires std::same_as; + // []() { + // static constexpr MccMountType val = T::mountType; + // return val; + // }(); // to ensure 'mountType' can be used in compile-time context // a type that defines at least HW_MOVE_STOPPED, HW_MOVE_SLEWING, HW_MOVE_ADJUSTING, HW_MOVE_TRACKING diff --git a/mcc/mcc_tracking_model.h b/mcc/mcc_tracking_model.h index c79110f..4f3b661 100644 --- a/mcc/mcc_tracking_model.h +++ b/mcc/mcc_tracking_model.h @@ -26,6 +26,8 @@ enum class MccSimpleTrackingModelErrorCode : int { ERROR_NEAR_PZONE, ERROR_TIMEOUT, ERROR_UNEXPECTED_AXIS_RATES, + ERROR_ALREADY_TRACK, + ERROR_ALREADY_STOPPED, ERROR_STOPPED }; @@ -59,6 +61,8 @@ public: MccSimpleTrackingModel(CONTROLS_T* controls) : _stopTracking(new std::atomic_bool()), _currentParamsMutex(new std::mutex()) { + *_stopTracking = true; + _trackingFunc = [controls, this]() -> error_t { typename CONTROLS_T::hardware_state_t hw_state; @@ -78,6 +82,7 @@ public: auto t_err = controls->telemetryData(&tdata); if (t_err) { + *_stopTracking = true; return mcc_deduce_error(t_err, MccSimpleTrackingModelErrorCode::ERROR_GET_TELEMETRY); } @@ -165,6 +170,7 @@ public: auto pz_err = update_pzones_ipoint(); if (pz_err) { + *_stopTracking = true; return mcc_deduce_error(pz_err, MccSimpleTrackingModelErrorCode::ERROR_PZONE_CONTAINER_COMP); } @@ -175,6 +181,7 @@ public: auto ccte_err = target_point(&target_in_future_pt); if (ccte_err) { + *_stopTracking = true; return mcc_deduce_error(ccte_err, MccSimpleTrackingModelErrorCode::ERROR_CCTE); } @@ -187,6 +194,7 @@ public: // move mount auto hw_err = controls->hardwareSetState(hw_state); if (hw_err) { + *_stopTracking = true; return mcc_deduce_error(hw_err, MccSimpleTrackingModelErrorCode::ERROR_HW_SETSTATE); } @@ -201,6 +209,7 @@ public: t_err = controls->waitForTelemetryData(&tdata, _currentParams.telemetryTimeout); if (t_err) { + *_stopTracking = true; return mcc_deduce_error(t_err, MccSimpleTrackingModelErrorCode::ERROR_GET_TELEMETRY); } } @@ -211,9 +220,11 @@ public: // control prohibited zones if (mcc_is_near_pzones(controls, tdata, _currentParams.minTimeToPZone, pz_err)) { + *_stopTracking = true; return MccSimpleTrackingModelErrorCode::ERROR_NEAR_PZONE; } if (pz_err) { + *_stopTracking = true; return mcc_deduce_error(pz_err, MccSimpleTrackingModelErrorCode::ERROR_PZONE_CONTAINER_COMP); } @@ -234,6 +245,7 @@ public: if ((now - last_ipzone_update_tp) < _currentParams.updatingPZoneInterval) { pz_err = update_pzones_ipoint(); if (pz_err) { + *_stopTracking = true; return mcc_deduce_error( pz_err, MccSimpleTrackingModelErrorCode::ERROR_PZONE_CONTAINER_COMP); } @@ -242,6 +254,7 @@ public: // compute new target-in-future point auto ccte_err = target_point(&target_in_future_pt); if (ccte_err) { + *_stopTracking = true; return mcc_deduce_error(ccte_err, MccSimpleTrackingModelErrorCode::ERROR_CCTE); } } @@ -250,6 +263,7 @@ public: hw_state.moving_state = CONTROLS_T::hardware_moving_state_t::HW_MOVE_Tracking; hw_err = controls->hardwareSetState(hw_state); if (hw_err) { + *_stopTracking = true; return mcc_deduce_error(hw_err, MccSimpleTrackingModelErrorCode::ERROR_HW_SETSTATE); } } @@ -266,13 +280,21 @@ public: error_t trackTarget() { + if (!(*_stopTracking)) { // already tracking + return MccSimpleTrackingModelErrorCode::ERROR_ALREADY_TRACK; + } + *_stopTracking = false; return _trackingFunc(); } - error_t stoptTracking() + error_t stopTracking() { + if (*_stopTracking) { // already stopped + return MccSimpleTrackingModelErrorCode::ERROR_ALREADY_STOPPED; + } + *_stopTracking = true; return MccSimpleTrackingModelErrorCode::ERROR_OK;