This commit is contained in:
Timur A. Fatkhullin
2026-03-12 23:50:47 +03:00
parent 0ee87ccbf9
commit 28352f6c64

View File

@@ -339,7 +339,7 @@ public:
void stopAsyncMovementCycle(this SelfT&& self) void stopAsyncMovementCycle(this SelfT&& self)
requires(EXEC_POLICY == MccGenericMovementControlsPolicy::POLICY_ASYNC) requires(EXEC_POLICY == MccGenericMovementControlsPolicy::POLICY_ASYNC)
{ {
self->_fsmState = STATE_IDLE; *self._fsmState = STATE_IDLE;
self._fstStopSource.request_stop(); self._fstStopSource.request_stop();
self._wakeupRequest->test_and_set(); self._wakeupRequest->test_and_set();
@@ -353,7 +353,7 @@ public:
} }
template <typename SelfT> template <typename SelfT>
void startAsyncMovementCycle(this SelfT&& self) void startAsyncMovementCycle(this SelfT& self)
requires(EXEC_POLICY == MccGenericMovementControlsPolicy::POLICY_ASYNC) requires(EXEC_POLICY == MccGenericMovementControlsPolicy::POLICY_ASYNC)
{ {
using self_t = std::decay_t<SelfT>; using self_t = std::decay_t<SelfT>;
@@ -362,15 +362,16 @@ public:
self.stopAsyncMovementCycle(); self.stopAsyncMovementCycle();
} }
self->_stopMovementRequest = false; *self._stopMovementRequest = false;
self._fstStopSource = std::stop_source{}; self._fstStopSource = std::stop_source{};
self->_fsmState = STATE_IDLE; *self._fsmState = STATE_IDLE;
// start thread of movements // start thread of movements
self._fstFuture = std::async( self._fstFuture = std::async(
[&self](std::stop_token stoken) { std::launch::async,
[&self](std::stop_token stoken) mutable {
auto do_state = self._fsmState->load(); auto do_state = self._fsmState->load();
std::string log_str; std::string log_str;
@@ -379,7 +380,7 @@ public:
if constexpr (mcc_generic_mount_c<self_t>) { if constexpr (mcc_generic_mount_c<self_t>) {
self.logTrace(log_str); self.logTrace(log_str);
} else { } else {
std::println(log_str); std::println("{}", log_str);
} }
// wait here ... // wait here ...
@@ -391,7 +392,7 @@ public:
if constexpr (mcc_generic_mount_c<self_t>) { if constexpr (mcc_generic_mount_c<self_t>) {
self.logTrace(log_str); self.logTrace(log_str);
} else { } else {
std::println(log_str); std::println("{}", log_str);
} }
// if (stoken.stop_requested()) { // if (stoken.stop_requested()) {
@@ -402,17 +403,17 @@ public:
if (do_state & STATE_STOP) { if (do_state & STATE_STOP) {
// if (_fsmState->load() & STATE_STOP) { // if (_fsmState->load() & STATE_STOP) {
self->_stopMovementRequest = true; *self._stopMovementRequest = true;
self._stopFunc(); self._stopFunc();
} }
if (do_state & STATE_SLEW) { if (do_state & STATE_SLEW) {
// if (_fsmState->load() & STATE_SLEW) { // if (_fsmState->load() & STATE_SLEW) {
self->_stopMovementRequest = false; *self._stopMovementRequest = false;
self._slewFunc(self._slewAndStop->load()); self._slewFunc(self._slewAndStop->load());
} else if (do_state & STATE_TRACK) { } else if (do_state & STATE_TRACK) {
// } else if (_fsmState->load() & STATE_TRACK) { // } else if (_fsmState->load() & STATE_TRACK) {
self->_stopMovementRequest = false; *self._stopMovementRequest = false;
self._trackFunc(); self._trackFunc();
} }
} }
@@ -542,6 +543,59 @@ protected:
std::unique_ptr<std::atomic_int> _fsmState{new std::atomic_int}; std::unique_ptr<std::atomic_int> _fsmState{new std::atomic_int};
// template <typename SelfT>
// void mainCycle(this SelfT&& self, std::stop_token stoken)
// {
// using self_t = std::decay_t<SelfT>;
// 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_t>) {
// 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_t>) {
// 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 // utility methods
// the method calculates the change in coordinates of a point over a given time given the current speed and braking // the method calculates the change in coordinates of a point over a given time given the current speed and braking