This commit is contained in:
Timur A. Fatkhullin
2026-03-12 22:20:56 +03:00
parent f2aad0807d
commit 0ee87ccbf9
2 changed files with 141 additions and 42 deletions

View File

@@ -262,48 +262,50 @@ public:
_stopFunc(std::forward<STOP_FUNC_T>(stop_func)) _stopFunc(std::forward<STOP_FUNC_T>(stop_func))
{ {
if constexpr (executePolicy == MccGenericMovementControlsPolicy::POLICY_ASYNC) { if constexpr (executePolicy == MccGenericMovementControlsPolicy::POLICY_ASYNC) {
*_stopMovementRequest = false; // *_stopMovementRequest = false;
*_fsmState = STATE_IDLE; // *_fsmState = STATE_IDLE;
// start thread of movements // // start thread of movements
_fstFuture = std::async( // _fstFuture = std::async(
[this](std::stop_token stoken) { // [this](std::stop_token stoken) {
auto do_state = _fsmState->load(); // auto do_state = _fsmState->load();
while (!stoken.stop_requested()) { // while (!stoken.stop_requested()) {
std::println("\n{:*^80}\n", " WAIT LOCK "); // std::println("\n{:*^80}\n", " WAIT LOCK ");
// wait here ... // // wait here ...
_wakeupRequest->wait(false, std::memory_order_relaxed); // _wakeupRequest->wait(false, std::memory_order_relaxed);
_wakeupRequest->clear(); // _wakeupRequest->clear();
std::println("\n{:*^80}\n", " UNLOCKED "); // std::println("\n{:*^80}\n", " UNLOCKED ");
// if (stoken.stop_requested()) { // // if (stoken.stop_requested()) {
// break; // // break;
// } // // }
do_state = _fsmState->load(); // do_state = _fsmState->load();
if (do_state & STATE_STOP) { // if (do_state & STATE_STOP) {
// if (_fsmState->load() & STATE_STOP) { // // if (_fsmState->load() & STATE_STOP) {
*_stopMovementRequest = true; // *_stopMovementRequest = true;
_stopFunc(); // _stopFunc();
} // }
if (do_state & STATE_SLEW) { // if (do_state & STATE_SLEW) {
// if (_fsmState->load() & STATE_SLEW) { // // if (_fsmState->load() & STATE_SLEW) {
*_stopMovementRequest = false; // *_stopMovementRequest = false;
_slewFunc(_slewAndStop->load()); // _slewFunc(_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) {
*_stopMovementRequest = false; // *_stopMovementRequest = false;
_trackFunc(); // _trackFunc();
} // }
} // }
}, // },
_fstStopSource.get_token()); // _fstStopSource.get_token());
startAsyncMovementCycle();
} }
} }
@@ -316,20 +318,108 @@ public:
virtual ~MccGenericMovementControls() virtual ~MccGenericMovementControls()
{ {
if constexpr (executePolicy == MccGenericMovementControlsPolicy::POLICY_ASYNC) { if constexpr (executePolicy == MccGenericMovementControlsPolicy::POLICY_ASYNC) {
*_fsmState = STATE_IDLE; // *_fsmState = STATE_IDLE;
_fstStopSource.request_stop(); // _fstStopSource.request_stop();
_wakeupRequest->test_and_set(); // _wakeupRequest->test_and_set();
_wakeupRequest->notify_one(); // _wakeupRequest->notify_one();
std::this_thread::sleep_for(std::chrono::milliseconds(200)); // std::this_thread::sleep_for(std::chrono::milliseconds(200));
if (_fstFuture.valid()) { // if (_fstFuture.valid()) {
auto status = _fstFuture.wait_for(_waitTimeout->load()); // auto status = _fstFuture.wait_for(_waitTimeout->load());
} // }
stopAsyncMovementCycle();
} }
} }
template <typename SelfT>
void stopAsyncMovementCycle(this SelfT&& self)
requires(EXEC_POLICY == MccGenericMovementControlsPolicy::POLICY_ASYNC)
{
self->_fsmState = STATE_IDLE;
self._fstStopSource.request_stop();
self._wakeupRequest->test_and_set();
self._wakeupRequest->notify_all();
std::this_thread::sleep_for(std::chrono::milliseconds(200));
if (self._fstFuture.valid()) {
auto status = self._fstFuture.wait_for(self._waitTimeout->load());
}
}
template <typename SelfT>
void startAsyncMovementCycle(this SelfT&& self)
requires(EXEC_POLICY == MccGenericMovementControlsPolicy::POLICY_ASYNC)
{
using self_t = std::decay_t<SelfT>;
if (self._fstFuture.valid()) {
self.stopAsyncMovementCycle();
}
self->_stopMovementRequest = false;
self._fstStopSource = std::stop_source{};
self->_fsmState = STATE_IDLE;
// start thread of movements
self._fstFuture = std::async(
[&self](std::stop_token stoken) {
auto do_state = self._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 ...
self._wakeupRequest->wait(false, std::memory_order_relaxed);
self._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 = self._fsmState->load();
if (do_state & STATE_STOP) {
// if (_fsmState->load() & STATE_STOP) {
self->_stopMovementRequest = true;
self._stopFunc();
}
if (do_state & STATE_SLEW) {
// if (_fsmState->load() & STATE_SLEW) {
self->_stopMovementRequest = false;
self._slewFunc(self._slewAndStop->load());
} else if (do_state & STATE_TRACK) {
// } else if (_fsmState->load() & STATE_TRACK) {
self->_stopMovementRequest = false;
self._trackFunc();
}
}
},
self._fstStopSource.get_token());
}
error_t slewToTarget(bool slew_and_stop) error_t slewToTarget(bool slew_and_stop)
{ {
// *_stopMovementRequest = false; // *_stopMovementRequest = false;

View File

@@ -14,6 +14,9 @@ static std::uniform_real_distribution<double> y_distrib(1000, 7000);
static std::uniform_real_distribution<double> xs_distrib(100, 700); static std::uniform_real_distribution<double> xs_distrib(100, 700);
static std::uniform_real_distribution<double> ys_distrib(100, 700); static std::uniform_real_distribution<double> ys_distrib(100, 700);
static std::uniform_int_distribution<uint8_t> err_distrib(0, 255);
struct hw_t { struct hw_t {
static constexpr mcc::MccMountType hwMountType{mcc::MccMountType::ALTAZ_TYPE}; static constexpr mcc::MccMountType hwMountType{mcc::MccMountType::ALTAZ_TYPE};
static constexpr std::string_view hardwareName{"HW-TEST"}; static constexpr std::string_view hardwareName{"HW-TEST"};
@@ -53,13 +56,19 @@ struct hw_t {
*state = hardware_state_t{.XY{x_distrib(gen), y_distrib(gen)}, .speedXY{xs_distrib(gen), ys_distrib(gen)}}; *state = hardware_state_t{.XY{x_distrib(gen), y_distrib(gen)}, .speedXY{xs_distrib(gen), ys_distrib(gen)}};
return 0; // return 0;
return err_distrib(gen) < 5 ? 1 : 0;
} }
error_t hardwareInit() error_t hardwareInit()
{ {
return 0; return 0;
} }
error_t hardwareShutdown()
{
return 0;
}
}; };
template <> template <>