diff --git a/asibfm700/asibfm700_mount.h b/asibfm700/asibfm700_mount.h index 5569d67..bd1d410 100644 --- a/asibfm700/asibfm700_mount.h +++ b/asibfm700/asibfm700_mount.h @@ -55,6 +55,44 @@ public: ~Asibfm700Mount(); }; +class Asibfm700Mount1 : protected mcc::ccte::erfa::MccCCTE_ERFA, + protected mcc::MccDefaultPCM, + public mcc::MccGenericFsmMount> +{ + typedef mcc::MccGenericFsmMount> + base_gm_class_t; + +public: + using base_gm_class_t::error_t; + + using mcc::ccte::erfa::MccCCTE_ERFA::setStateERFA; + using mcc::ccte::erfa::MccCCTE_ERFA::updateBulletinA; + using mcc::ccte::erfa::MccCCTE_ERFA::updateLeapSeconds; + using mcc::ccte::erfa::MccCCTE_ERFA::updateMeteoERFA; + + using Asibfm700Logger::logCritical; + using Asibfm700Logger::logDebug; + using Asibfm700Logger::logError; + using Asibfm700Logger::logInfo; + using Asibfm700Logger::logWarn; + + Asibfm700Mount1(Asibfm700MountConfig const& config, + std::shared_ptr logger, + const auto& pattern_range = mcc::utils::MccSpdlogLogger::LOGGER_DEFAULT_FORMAT); + + ~Asibfm700Mount1(); +}; + static_assert(mcc::mcc_position_controls_c, ""); static_assert(mcc::mcc_all_controls_c, ""); diff --git a/cxx/mcc_slew_model.h b/cxx/mcc_slew_model.h index 7dd7f42..ca5db1e 100644 --- a/cxx/mcc_slew_model.h +++ b/cxx/mcc_slew_model.h @@ -52,7 +52,10 @@ namespace mcc struct MccSimpleSlewModelCategory : public std::error_category { MccSimpleSlewModelCategory() : std::error_category() {} - const char* name() const noexcept { return "ADC_GENERIC_DEVICE"; } + const char* name() const noexcept + { + return "ADC_GENERIC_DEVICE"; + } std::string message(int ec) const { @@ -164,7 +167,7 @@ public: } _stopRequested = other._stopRequested.load(); - _slewFunc = std::move(_slewFunc); + _slewFunc = std::move(other._slewFunc); return *this; }; diff --git a/mcc/mcc_generic_mount.h b/mcc/mcc_generic_mount.h index cd58005..5435d0b 100644 --- a/mcc/mcc_generic_mount.h +++ b/mcc/mcc_generic_mount.h @@ -136,6 +136,9 @@ public: using fsm::MccFiniteStateMachine::currentStateID; + using typename MOUNT_T::slewing_params_t; + using typename MOUNT_T::tracking_params_t; + protected: /* default events implementation */ @@ -333,6 +336,120 @@ protected: }; + template + struct MccGenericFsmMountSlewState : MccGenericFsmMountBaseState { + static constexpr std::string_view ID{"GENERIC-MOUNT-SLEW-STATE"}; + + using transition_t = fsm::fsm_transition_table_t< + std::pair>, + std::pair, + std::pair>, + std::pair>; + + + void exit(MccGenericFsmMountSlewEvent& event) + { + if constexpr (mcc_generic_log_mount_c) { + event.mount()->logWarn( + "It seems re-entering to slewing state was asked! Do not stop the current slewing process, just " + "ignore this event!"); + } + } + + void enter(MccGenericFsmMountSlewEvent& event) + { + if constexpr (mcc_generic_log_mount_c) { + event.mount()->logWarn( + "It seems re-entering to slewing state was asked! Do not start a new slewing process, just ignore " + "this event!"); + } + } + + void exit(fsm::traits::fsm_event_c auto& event) + { + exitLog(event); + } + + void enter(fsm::traits::fsm_event_c auto& event) + { + enterLog(event); + + auto* mount_ptr = event.mount(); + + // call base-class stopMount method! + auto err = static_cast(mount_ptr)->slewToTarget(); + if (err) { + mount_ptr->dispatchEvent(MccGenericFsmMountErrorEvent{mount_ptr}); + return; + } + + + MccGenericFsmMount::slewing_params_t params; + mount_ptr->getSlewingParams(¶ms); + if (params.slewAndStop) { // after slewing switch to IDLE state + mount_ptr->dispatchEvent(MccGenericFsmMountIdleEvent{mount_ptr}); + } else { // after slewing switch to tracking state + mount_ptr->dispatchEvent(MccGenericFsmMountTrackEvent{mount_ptr}); + } + } + }; + + + + template + struct MccGenericFsmMountTrackState : MccGenericFsmMountBaseState { + static constexpr std::string_view ID{"GENERIC-MOUNT-TRACK-STATE"}; + + using transition_t = fsm::fsm_transition_table_t< + std::pair>, + std::pair, + std::pair>; + + + void exit(MccGenericFsmMountTrackEvent& event) + { + if constexpr (mcc_generic_log_mount_c) { + event.mount()->logWarn( + "It seems re-entering to tracking state was asked! Do not stop the current tracking process, just " + "ignore this event!"); + } + } + + void enter(MccGenericFsmMountTrackEvent& event) + { + if constexpr (mcc_generic_log_mount_c) { + event.mount()->logWarn( + "It seems re-entering to tracking state was asked! Do not start a new tracking process, just " + "ignore this event!"); + } + } + + void exit(fsm::traits::fsm_event_c auto& event) + { + exitLog(event); + } + + void enter(fsm::traits::fsm_event_c auto& event) + { + enterLog(event); + + auto* mount_ptr = event.mount(); + + // call base-class stopMount method! + auto err = static_cast(mount_ptr)->trackTarget(); + if (err) { + mount_ptr->dispatchEvent(MccGenericFsmMountErrorEvent{mount_ptr}); + return; + } + + // after stop trackin switch to IDLE state + + mount_ptr->dispatchEvent(MccGenericFsmMountIdleEvent{mount_ptr}); + } + }; + + + template struct MccGenericFsmMountStopState : MccGenericFsmMountBaseState { static constexpr std::string_view ID{"GENERIC-MOUNT-STOP-STATE"}; @@ -420,9 +537,9 @@ protected: public: - MccGenericFsmMount( - MOUNT_T mount, - fsm::traits::fsm_state_c auto start_state = MccGenericFsmMountStartState{}) + template + MccGenericFsmMount(MOUNT_T mount, + fsm::traits::fsm_state_c auto start_state = MccGenericFsmMountStartState{}) : MOUNT_T(std::move(mount)), fsm::MccFiniteStateMachine(std::move(start_state)) { } diff --git a/mcc/mcc_generics.h b/mcc/mcc_generics.h index 69fa60f..65e4a04 100644 --- a/mcc/mcc_generics.h +++ b/mcc/mcc_generics.h @@ -822,7 +822,7 @@ concept mcc_pzone_container_c = std::derived_from concept mcc_slewing_model_c = requires(T t) { - requires mcc_error_c; + // requires mcc_error_c; // a class of slewing process parameters requires requires(typename T::slewing_params_t pars) { @@ -830,17 +830,20 @@ concept mcc_slewing_model_c = requires(T t) { requires std::convertible_to; }; - { t.slewToTarget() } -> std::same_as; - { t.stopSlewing() } -> std::same_as; + // { t.slewToTarget() } -> std::same_as; + // { t.stopSlewing() } -> std::same_as; + { t.slewToTarget() } -> mcc_error_c; + { t.stopSlewing() } -> mcc_error_c; - { t.setSlewingParams(std::declval()) } -> std::same_as; + { t.setSlewingParams(std::declval()) } -> mcc_error_c; + // { t.setSlewingParams(std::declval()) } -> std::same_as; { t.getSlewingParams() } -> std::same_as; }; template concept mcc_tracking_model_c = requires(T t) { - requires mcc_error_c; + // requires mcc_error_c; // a class of tracking process parameters requires requires(typename T::tracking_params_t pars) { @@ -848,10 +851,13 @@ concept mcc_tracking_model_c = requires(T t) { requires mcc_angle_c; }; - { t.trackTarget() } -> std::same_as; - { t.stopTracking() } -> std::same_as; + // { t.trackTarget() } -> std::same_as; + // { t.stopTracking() } -> std::same_as; + { t.trackTarget() } -> mcc_error_c; + { t.stopTracking() } -> mcc_error_c; - { t.setTrackingParams(std::declval()) } -> std::same_as; + { t.setTrackingParams(std::declval()) } -> mcc_error_c; + // { t.setTrackingParams(std::declval()) } -> std::same_as; { t.getTrackingParams() } -> std::same_as; };