From 28352f6c64bb38f8ab8c3082dcecc8cac4f5f3ac Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Thu, 12 Mar 2026 23:50:47 +0300 Subject: [PATCH] ... --- include/mcc/mcc_generic_movecontrols.h | 74 ++++++++++++++++++++++---- 1 file changed, 64 insertions(+), 10 deletions(-) diff --git a/include/mcc/mcc_generic_movecontrols.h b/include/mcc/mcc_generic_movecontrols.h index b95e4b8..537a42a 100644 --- a/include/mcc/mcc_generic_movecontrols.h +++ b/include/mcc/mcc_generic_movecontrols.h @@ -339,7 +339,7 @@ public: void stopAsyncMovementCycle(this SelfT&& self) requires(EXEC_POLICY == MccGenericMovementControlsPolicy::POLICY_ASYNC) { - self->_fsmState = STATE_IDLE; + *self._fsmState = STATE_IDLE; self._fstStopSource.request_stop(); self._wakeupRequest->test_and_set(); @@ -353,7 +353,7 @@ public: } template - void startAsyncMovementCycle(this SelfT&& self) + void startAsyncMovementCycle(this SelfT& self) requires(EXEC_POLICY == MccGenericMovementControlsPolicy::POLICY_ASYNC) { using self_t = std::decay_t; @@ -362,15 +362,16 @@ public: self.stopAsyncMovementCycle(); } - self->_stopMovementRequest = false; + *self._stopMovementRequest = false; self._fstStopSource = std::stop_source{}; - self->_fsmState = STATE_IDLE; + *self._fsmState = STATE_IDLE; // start thread of movements self._fstFuture = std::async( - [&self](std::stop_token stoken) { + std::launch::async, + [&self](std::stop_token stoken) mutable { auto do_state = self._fsmState->load(); std::string log_str; @@ -379,7 +380,7 @@ public: if constexpr (mcc_generic_mount_c) { self.logTrace(log_str); } else { - std::println(log_str); + std::println("{}", log_str); } // wait here ... @@ -391,7 +392,7 @@ public: if constexpr (mcc_generic_mount_c) { self.logTrace(log_str); } else { - std::println(log_str); + std::println("{}", log_str); } // if (stoken.stop_requested()) { @@ -402,17 +403,17 @@ public: if (do_state & STATE_STOP) { // if (_fsmState->load() & STATE_STOP) { - self->_stopMovementRequest = true; + *self._stopMovementRequest = true; self._stopFunc(); } if (do_state & STATE_SLEW) { // if (_fsmState->load() & STATE_SLEW) { - self->_stopMovementRequest = false; + *self._stopMovementRequest = false; self._slewFunc(self._slewAndStop->load()); } else if (do_state & STATE_TRACK) { // } else if (_fsmState->load() & STATE_TRACK) { - self->_stopMovementRequest = false; + *self._stopMovementRequest = false; self._trackFunc(); } } @@ -542,6 +543,59 @@ protected: std::unique_ptr _fsmState{new std::atomic_int}; + // template + // void mainCycle(this SelfT&& self, std::stop_token stoken) + // { + // using self_t = std::decay_t; + + // auto do_state = _fsmState->load(); + + // std::string log_str; + + // while (!stoken.stop_requested()) { + // log_str = std::format("\n{:*^80}\n", " WAIT LOCK "); + // if constexpr (mcc_generic_mount_c) { + // self.logTrace(log_str); + // } else { + // std::println(log_str); + // } + + // // wait here ... + // _wakeupRequest->wait(false, std::memory_order_relaxed); + + // _wakeupRequest->clear(); + + // log_str = std::format("\n{:*^80}\n", " UNLOCKED "); + // if constexpr (mcc_generic_mount_c) { + // self.logTrace(log_str); + // } else { + // std::println(log_str); + // } + + // // if (stoken.stop_requested()) { + // // break; + // // } + + // do_state = _fsmState->load(); + + // if (do_state & STATE_STOP) { + // // if (_fsmState->load() & STATE_STOP) { + // *_stopMovementRequest = true; + // _stopFunc(); + // } + + // if (do_state & STATE_SLEW) { + // // if (_fsmState->load() & STATE_SLEW) { + // *_stopMovementRequest = false; + // _slewFunc(_slewAndStop->load()); + // } else if (do_state & STATE_TRACK) { + // // } else if (_fsmState->load() & STATE_TRACK) { + // *_stopMovementRequest = false; + // _trackFunc(); + // } + // } + // } + // utility methods // the method calculates the change in coordinates of a point over a given time given the current speed and braking