From 5fe2788cd789077e81d8ea0c85a736bca43f7e21 Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Fri, 3 Oct 2025 12:11:21 +0300 Subject: [PATCH] ... --- asibfm700/asibfm700_configfile.h | 43 +++++++++++++++++++++++++++-- asibfm700/tests/cfg_test.cpp | 5 ++++ mcc/mcc_generic_mount.h | 47 +++++++++++++++++++++++++++++++- mcc/mcc_generics.h | 4 +-- 4 files changed, 93 insertions(+), 6 deletions(-) diff --git a/asibfm700/asibfm700_configfile.h b/asibfm700/asibfm700_configfile.h index b3521fc..195508d 100644 --- a/asibfm700/asibfm700_configfile.h +++ b/asibfm700/asibfm700_configfile.h @@ -249,6 +249,31 @@ public: return res; } + template + bool update(std::string_view key, const T& value) + { + auto it = _configDB.find(key); + if (it == _configDB.end()) { + return false; + } + + bool ok; + std::visit( + [&value, &ok](auto& val) { + using v_t = std::decay_t; + + if constexpr (std::convertible_to) { + val = static_cast(value); + ok = true; + } else { + ok = false; + } + }, + it->second); + + return ok; + } + protected: std::unordered_map>> _configDB; @@ -453,11 +478,12 @@ class Asibfm700MountConfig : protected ConfigHolder; public: + using base_t::update; using base_t::value; Asibfm700MountConfig() : base_t(Asibfm700MountConfigDefaults) { - update(); + updateAll(); } ~Asibfm700MountConfig() = default; @@ -481,7 +507,7 @@ public: ec = base_t::parse(buffer, deserializer); if (!ec) { - update(); + updateAll(); } } catch (std::ios_base::failure const& ex) { ec = ex.code(); @@ -497,6 +523,17 @@ public: return ec; } + template + bool update(std::string_view key, const T& value) + { + bool ok = base_t::update(key, value); + if (ok) { + updateAll(); + } + + return ok; + } + std::chrono::milliseconds hardwarePollingPeriod{}; mcc::MccAngle siteLatitude{}; @@ -517,7 +554,7 @@ public: Asibfm700PCM::pcm_data_t pcmData{}; protected: - void update() + void updateAll() { hardwarePollingPeriod = std::get(this->_configDB["hardwarePollingPeriod"]); diff --git a/asibfm700/tests/cfg_test.cpp b/asibfm700/tests/cfg_test.cpp index af0b41d..9407272 100644 --- a/asibfm700/tests/cfg_test.cpp +++ b/asibfm700/tests/cfg_test.cpp @@ -62,6 +62,11 @@ int main() std::cout << "refr w: " << acfg.refractWavelength << "\n"; + acfg.update("refractWavelength", 0.3); + + auto e = acfg.value("refractWavelength"); + std::cout << "refr w: " << e.value_or(0.0) << "\n"; + std::cout << "refr w: " << acfg.refractWavelength << "\n"; return 0; } diff --git a/mcc/mcc_generic_mount.h b/mcc/mcc_generic_mount.h index ce82bf3..4f1b897 100644 --- a/mcc/mcc_generic_mount.h +++ b/mcc/mcc_generic_mount.h @@ -6,13 +6,21 @@ /* GENERIC MOUNT REFERENCE IMPLEMENTATION */ +#include "mcc_defaults.h" #include "mcc_generics.h" namespace mcc { -enum class MccGenericMountErrorCode : int { ERROR_OK, ERROR_HW_INIT, ERROR_HW_STOP, ERROR_HW_GETSTATE }; +enum class MccGenericMountErrorCode : int { + ERROR_OK, + ERROR_HW_INIT, + ERROR_HW_STOP, + ERROR_HW_GETSTATE, + ERROR_SET_TARGET, + ERROR_MOUNT_SLEW +}; enum class MccGenericFsmMountErrorCode : int { ERROR_OK, ERROR_INVALID_OPERATION, ERROR_UNKNOWN_EVENT }; @@ -197,6 +205,43 @@ public: return MccGenericMountErrorCode::ERROR_OK; } + + // re-implements TelemetryT::setPointingTarget to hold target coordinates + // in some intermediate buffer + error_t setPointingTarget(mcc_celestial_point_c auto pt) + { + mcc_copy_celestial_point(std::move(pt), &_inputTargetCoordiniates); + + std::string xstr; + if (_inputTargetCoordiniates.pair_kind == MccCoordPairKind::COORDS_KIND_RADEC_ICRS || + _inputTargetCoordiniates.pair_kind == MccCoordPairKind::COORDS_KIND_RADEC_APP || + _inputTargetCoordiniates.pair_kind == MccCoordPairKind::COORDS_KIND_HADEC_APP) { + xstr = MccAngle(_inputTargetCoordiniates.X).sexagesimal(true); + } else { + MccAngle(_inputTargetCoordiniates.X).sexagesimal(); + } + + logInfo(std::format("Set input target coordinates to: {} {} {}", xstr, + MccAngle(_inputTargetCoordiniates.Y).sexagesimal(), + MccCoordPairKindStr<_inputTargetCoordiniates.pair_kind>)); + + return MccGenericMountErrorCode::ERROR_OK; + } + + // re-implements SlewModelT::slewToTarget to fetch input target coordinates from intermediate buffer + error_t slewToTarget(bool slew_and_stop = false) + { + auto err = TelemetryT::setPointingTarget(_inputTargetCoordiniates); + if (err) { + return mcc_deduce_error_code(err, MccGenericMountErrorCode::ERROR_SET_TARGET); + } + + return mcc_deduce_error_code(SlewModelT::slewToTarget(slew_and_stop), + MccGenericMountErrorCode::ERROR_MOUNT_SLEW); + } + +protected: + MccCelestialPoint _inputTargetCoordiniates; }; diff --git a/mcc/mcc_generics.h b/mcc/mcc_generics.h index 0d3454a..8012439 100644 --- a/mcc/mcc_generics.h +++ b/mcc/mcc_generics.h @@ -663,7 +663,7 @@ struct mcc_telemetry_interface_t { template SelfT> RetT setPointingTarget(this SelfT&& self, mcc_celestial_point_c auto pt) { - return std::forward(self).telemetryData(std::move(pt)); + return std::forward(self).setPointingTarget(std::move(pt)); } @@ -929,7 +929,7 @@ concept mcc_generic_mount_c = mcc_telemetry_c && mcc_pzone_container_c && // requires mcc_error_c; // slew mount to target (it is assumed that the target coordinates are determined in the telemetry data) - { t.slewToTarget() }; + { t.slewToTarget(std::declval()) }; // { t.slewToTarget() } -> std::same_as; // track target, i.e., the mount moves with celestial speed