...
This commit is contained in:
parent
3ae2d41fc8
commit
92b1a3cfd5
@ -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>, "");
|
||||
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
@ -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(¶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 <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))
|
||||
{
|
||||
}
|
||||
|
||||
@ -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>;
|
||||
};
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user