...
This commit is contained in:
parent
3ae2d41fc8
commit
92b1a3cfd5
@ -55,6 +55,44 @@ public:
|
|||||||
~Asibfm700Mount();
|
~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_position_controls_c<Asibfm700Mount>, "");
|
||||||
static_assert(mcc::mcc_all_controls_c<Asibfm700Mount>, "");
|
static_assert(mcc::mcc_all_controls_c<Asibfm700Mount>, "");
|
||||||
|
|
||||||
|
|||||||
@ -52,7 +52,10 @@ namespace mcc
|
|||||||
struct MccSimpleSlewModelCategory : public std::error_category {
|
struct MccSimpleSlewModelCategory : public std::error_category {
|
||||||
MccSimpleSlewModelCategory() : 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
|
std::string message(int ec) const
|
||||||
{
|
{
|
||||||
@ -164,7 +167,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
_stopRequested = other._stopRequested.load();
|
_stopRequested = other._stopRequested.load();
|
||||||
_slewFunc = std::move(_slewFunc);
|
_slewFunc = std::move(other._slewFunc);
|
||||||
|
|
||||||
return *this;
|
return *this;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -136,6 +136,9 @@ public:
|
|||||||
|
|
||||||
using fsm::MccFiniteStateMachine::currentStateID;
|
using fsm::MccFiniteStateMachine::currentStateID;
|
||||||
|
|
||||||
|
using typename MOUNT_T::slewing_params_t;
|
||||||
|
using typename MOUNT_T::tracking_params_t;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/* default events implementation */
|
/* 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>
|
template <fsm::traits::fsm_state_c ERROR_STATE_T>
|
||||||
struct MccGenericFsmMountStopState : MccGenericFsmMountBaseState {
|
struct MccGenericFsmMountStopState : MccGenericFsmMountBaseState {
|
||||||
static constexpr std::string_view ID{"GENERIC-MOUNT-STOP-STATE"};
|
static constexpr std::string_view ID{"GENERIC-MOUNT-STOP-STATE"};
|
||||||
@ -420,9 +537,9 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MccGenericFsmMount(
|
template <fsm::traits::fsm_state_c ERROR_STATE_T = MccGenericFsmMountErrorState>
|
||||||
MOUNT_T mount,
|
MccGenericFsmMount(MOUNT_T mount,
|
||||||
fsm::traits::fsm_state_c auto start_state = MccGenericFsmMountStartState<MccGenericFsmMountErrorState>{})
|
fsm::traits::fsm_state_c auto start_state = MccGenericFsmMountStartState<ERROR_STATE_T>{})
|
||||||
: MOUNT_T(std::move(mount)), fsm::MccFiniteStateMachine(std::move(start_state))
|
: 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>
|
template <typename T>
|
||||||
concept mcc_slewing_model_c = requires(T 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
|
// a class of slewing process parameters
|
||||||
requires requires(typename T::slewing_params_t pars) {
|
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>;
|
requires std::convertible_to<decltype(pars.slewAndStop), bool>;
|
||||||
};
|
};
|
||||||
|
|
||||||
{ t.slewToTarget() } -> 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.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>;
|
{ t.getSlewingParams() } -> std::same_as<typename T::slewing_params_t>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
concept mcc_tracking_model_c = requires(T 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
|
// a class of tracking process parameters
|
||||||
requires requires(typename T::tracking_params_t pars) {
|
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)>;
|
requires mcc_angle_c<decltype(pars.trackSpeedY)>;
|
||||||
};
|
};
|
||||||
|
|
||||||
{ t.trackTarget() } -> 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.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>;
|
{ t.getTrackingParams() } -> std::same_as<typename T::tracking_params_t>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user