This commit is contained in:
Timur A. Fatkhullin 2025-09-13 23:46:38 +03:00
parent 3ae2d41fc8
commit 92b1a3cfd5
4 changed files with 177 additions and 13 deletions

View File

@ -55,6 +55,44 @@ public:
~Asibfm700Mount();
};
class Asibfm700Mount1 : protected mcc::ccte::erfa::MccCCTE_ERFA,
protected mcc::MccDefaultPCM<asibfm700MountType>,
public mcc::MccGenericFsmMount<mcc::MccGenericMount<AsibFM700ServoController,
mcc::MccTelemetry,
Asibfm700PZoneContainer,
mcc::MccSimpleSlewingModel,
mcc::MccSimpleTrackingModel,
Asibfm700Logger>>
{
typedef mcc::MccGenericFsmMount<mcc::MccGenericMount<AsibFM700ServoController,
mcc::MccTelemetry,
Asibfm700PZoneContainer,
mcc::MccSimpleSlewingModel,
mcc::MccSimpleTrackingModel,
Asibfm700Logger>>
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<spdlog::logger> logger,
const auto& pattern_range = mcc::utils::MccSpdlogLogger::LOGGER_DEFAULT_FORMAT);
~Asibfm700Mount1();
};
static_assert(mcc::mcc_position_controls_c<Asibfm700Mount>, "");
static_assert(mcc::mcc_all_controls_c<Asibfm700Mount>, "");

View File

@ -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;
};

View File

@ -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 <fsm::traits::fsm_state_c ERROR_STATE_T>
struct MccGenericFsmMountSlewState : MccGenericFsmMountBaseState {
static constexpr std::string_view ID{"GENERIC-MOUNT-SLEW-STATE"};
using transition_t = fsm::fsm_transition_table_t<
std::pair<MccGenericFsmMountIdleEvent, MccGenericFsmMountIdleState<ERROR_STATE_T>>,
std::pair<MccGenericFsmMountErrorEvent, ERROR_STATE_T>,
std::pair<MccGenericFsmMountTrackEvent, MccGenericFsmMountTrackState<ERROR_STATE_T>>,
std::pair<MccGenericFsmMountSlewEvent, MccGenericFsmMountSlewState>>;
void exit(MccGenericFsmMountSlewEvent& event)
{
if constexpr (mcc_generic_log_mount_c<MOUNT_T>) {
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<MOUNT_T>) {
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_T*>(mount_ptr)->slewToTarget();
if (err) {
mount_ptr->dispatchEvent(MccGenericFsmMountErrorEvent{mount_ptr});
return;
}
MccGenericFsmMount::slewing_params_t params;
mount_ptr->getSlewingParams(&params);
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 <fsm::traits::fsm_state_c ERROR_STATE_T>
struct MccGenericFsmMountTrackState : MccGenericFsmMountBaseState {
static constexpr std::string_view ID{"GENERIC-MOUNT-TRACK-STATE"};
using transition_t = fsm::fsm_transition_table_t<
std::pair<MccGenericFsmMountIdleEvent, MccGenericFsmMountIdleState<ERROR_STATE_T>>,
std::pair<MccGenericFsmMountErrorEvent, ERROR_STATE_T>,
std::pair<MccGenericFsmMountTrackEvent, MccGenericFsmMountTrackState>>;
void exit(MccGenericFsmMountTrackEvent& event)
{
if constexpr (mcc_generic_log_mount_c<MOUNT_T>) {
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<MOUNT_T>) {
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_T*>(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 <fsm::traits::fsm_state_c ERROR_STATE_T>
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<MccGenericFsmMountErrorState>{})
template <fsm::traits::fsm_state_c ERROR_STATE_T = MccGenericFsmMountErrorState>
MccGenericFsmMount(MOUNT_T mount,
fsm::traits::fsm_state_c auto start_state = MccGenericFsmMountStartState<ERROR_STATE_T>{})
: MOUNT_T(std::move(mount)), fsm::MccFiniteStateMachine(std::move(start_state))
{
}

View File

@ -822,7 +822,7 @@ concept mcc_pzone_container_c = std::derived_from<T, mcc_pzone_container_interfa
template <typename T>
concept mcc_slewing_model_c = requires(T t) {
requires mcc_error_c<typename T::error_t>;
// requires mcc_error_c<typename T::error_t>;
// 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<decltype(pars.slewAndStop), bool>;
};
{ t.slewToTarget() } -> std::same_as<typename T::error_t>;
{ t.stopSlewing() } -> std::same_as<typename T::error_t>;
// { t.slewToTarget() } -> std::same_as<typename T::error_t>;
// { t.stopSlewing() } -> std::same_as<typename T::error_t>;
{ t.slewToTarget() } -> mcc_error_c;
{ t.stopSlewing() } -> mcc_error_c;
{ t.setSlewingParams(std::declval<typename T::slewing_params_t>()) } -> std::same_as<typename T::error_t>;
{ t.setSlewingParams(std::declval<typename T::slewing_params_t>()) } -> mcc_error_c;
// { t.setSlewingParams(std::declval<typename T::slewing_params_t>()) } -> std::same_as<typename T::error_t>;
{ t.getSlewingParams() } -> std::same_as<typename T::slewing_params_t>;
};
template <typename T>
concept mcc_tracking_model_c = requires(T t) {
requires mcc_error_c<typename T::error_t>;
// requires mcc_error_c<typename T::error_t>;
// 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<decltype(pars.trackSpeedY)>;
};
{ t.trackTarget() } -> std::same_as<typename T::error_t>;
{ t.stopTracking() } -> std::same_as<typename T::error_t>;
// { t.trackTarget() } -> std::same_as<typename T::error_t>;
// { t.stopTracking() } -> std::same_as<typename T::error_t>;
{ t.trackTarget() } -> mcc_error_c;
{ t.stopTracking() } -> mcc_error_c;
{ t.setTrackingParams(std::declval<typename T::tracking_params_t>()) } -> std::same_as<typename T::error_t>;
{ t.setTrackingParams(std::declval<typename T::tracking_params_t>()) } -> mcc_error_c;
// { t.setTrackingParams(std::declval<typename T::tracking_params_t>()) } -> std::same_as<typename T::error_t>;
{ t.getTrackingParams() } -> std::same_as<typename T::tracking_params_t>;
};