This commit is contained in:
2025-09-10 18:07:22 +03:00
parent 00354d9b41
commit ab49f927fb
10 changed files with 154 additions and 27 deletions

View File

@@ -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= <SOURCE_DIR>
# BUILD_COMMAND ninja -C <BINARY_DIR>
# INSTALL_COMMAND meson install -C <BINARY_DIR>
# 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= <SOURCE_DIR>
BUILD_COMMAND ninja -C <BINARY_DIR>
INSTALL_COMMAND meson install -C <BINARY_DIR>
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)

View File

@@ -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<double> MccTimeDuration; // seconds as floating-point value
template <traits::mcc_time_duration_c DT>
static constexpr DT mcc_infinite_duration_v =
std::floating_point<typename DT::rep> ? DT{std::numeric_limits<typename DT::rep>::infinity()}

View File

@@ -181,7 +181,8 @@ concept mcc_refract_model_c = requires(const T t_const) {
template <typename T>
concept mcc_celestial_point_c = requires(T t) {
requires std::same_as<decltype(t.pair_kind), MccCoordPairKind>; // type of given coordinate pair
requires std::same_as<std::remove_const_t<decltype(t.pair_kind)>,
MccCoordPairKind>; // type of given coordinate pair (it may be even static constexpr value)
requires mcc_time_point_c<decltype(t.time_point)>; // 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<char>;
// the 'T' class must contain static constexpr member of 'MccMountType' type
requires std::same_as<decltype(T::mountType), const MccMountType>;
[]() {
static constexpr MccMountType val = T::mountType;
return val;
}(); // to ensure 'mountType' can be used in compile-time context
// requires std::same_as<decltype(T::mountType), const MccMountType>;
// []() {
// 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

View File

@@ -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<error_t>(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<error_t>(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<error_t>(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<error_t>(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<error_t>(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<error_t>(
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<error_t>(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;