...
This commit is contained in:
parent
281ceacf89
commit
1087e043a8
@ -27,10 +27,10 @@ struct Asibfm700MountConfig {
|
|||||||
std::chrono::milliseconds hardwarePollingPeriod{100}; // main cycle period
|
std::chrono::milliseconds hardwarePollingPeriod{100}; // main cycle period
|
||||||
|
|
||||||
// CCTE-related configuration
|
// CCTE-related configuration
|
||||||
double siteLatitude{43.646711_degs};
|
mcc::MccAngle siteLatitude{43.646711_degs}; // in radians
|
||||||
double siteLongitude{41.440732_degs};
|
mcc::MccAngle siteLongitude{41.440732_degs}; // in radians
|
||||||
double siteElevation{2100.0};
|
double siteElevation{2070.0}; // in meters
|
||||||
double refractWavelength{0.55};
|
double refractWavelength{0.55}; // in mkm
|
||||||
|
|
||||||
std::string leapSecondFilename{};
|
std::string leapSecondFilename{};
|
||||||
std::string bulletinAFilename{};
|
std::string bulletinAFilename{};
|
||||||
@ -41,8 +41,16 @@ struct Asibfm700MountConfig {
|
|||||||
.siteLatitude = siteLatitude,
|
.siteLatitude = siteLatitude,
|
||||||
.geomCoefficients = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}};
|
.geomCoefficients = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}};
|
||||||
|
|
||||||
|
// servo controller configuration
|
||||||
AsibFM700ServoController::hardware_config_t servoControllerConfig{};
|
AsibFM700ServoController::hardware_config_t servoControllerConfig{};
|
||||||
|
|
||||||
|
// slew and track parameters
|
||||||
mcc::MccSimpleMovingModelParams movingModelParams{};
|
mcc::MccSimpleMovingModelParams movingModelParams{};
|
||||||
|
|
||||||
|
// prohibited zones parameters
|
||||||
|
mcc::MccAngle pzMinAltitude{10.0_degs}; // in radians
|
||||||
|
mcc::MccAngle pzLimitSwitchHAMin{}; // in radians
|
||||||
|
mcc::MccAngle pzLimitSwitchHAMax{}; // in radians
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace asibfm700
|
} // namespace asibfm700
|
||||||
|
|||||||
@ -1,5 +1,7 @@
|
|||||||
#include "asibfm700_mount.h"
|
#include "asibfm700_mount.h"
|
||||||
|
|
||||||
|
#include <mcc_pzone.h>
|
||||||
|
|
||||||
namespace asibfm700
|
namespace asibfm700
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -20,8 +22,30 @@ Asibfm700Mount::Asibfm700Mount(Asibfm700MountConfig const& config,
|
|||||||
Asibfm700StartState{})
|
Asibfm700StartState{})
|
||||||
{
|
{
|
||||||
logDebug("Create Asibfm700Mount class instance ({})", this->getThreadId());
|
logDebug("Create Asibfm700Mount class instance ({})", this->getThreadId());
|
||||||
|
|
||||||
|
logInfo("Init AstroSib FM-700 mount with configuration:");
|
||||||
|
logInfo(" site latitude: {}", config.siteLatitude.sexagesimal());
|
||||||
|
logInfo(" site longitude: {}", config.siteLongitude.sexagesimal());
|
||||||
|
logInfo(" site elevation: {} meters", config.siteElevation);
|
||||||
|
logInfo(" refraction wavelength: {} mkm", config.refractWavelength);
|
||||||
|
logInfo(" leap seconds filename: {}", config.leapSecondFilename);
|
||||||
|
logInfo(" IERS Bulletin A filename: {}", config.bulletinAFilename);
|
||||||
|
|
||||||
|
logInfo("Add prohibited zones ...");
|
||||||
|
|
||||||
|
logInfo("Add MccAltLimitPZ zone: min alt = {}, lat = {}", config.pzMinAltitude.degrees(),
|
||||||
|
config.siteLatitude.degrees());
|
||||||
|
addPZone(mcc::MccAltLimitPZ<mcc::MccAltLimitKind::MIN_ALT_LIMIT>{config.pzMinAltitude, config.siteLatitude, this});
|
||||||
|
|
||||||
|
logInfo("Add MccAxisLimitSwitchPZ zone: min value = {}, max value = {}", config.pzLimitSwitchHAMin,
|
||||||
|
config.pzLimitSwitchHAMax);
|
||||||
|
size_t pz_num = addPZone(mcc::MccAxisLimitSwitchPZ<mcc::MccCoordKind::COORDS_KIND_HA>{
|
||||||
|
config.pzLimitSwitchHAMin, config.pzLimitSwitchHAMax, this});
|
||||||
|
|
||||||
|
logInfo("{} prohibited zones were added", pz_num);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Asibfm700Mount::~Asibfm700Mount()
|
Asibfm700Mount::~Asibfm700Mount()
|
||||||
{
|
{
|
||||||
logDebug("Delete Asibfm700Mount class instance ({})", this->getThreadId());
|
logDebug("Delete Asibfm700Mount class instance ({})", this->getThreadId());
|
||||||
|
|||||||
@ -93,6 +93,8 @@ public:
|
|||||||
using Asibfm700Logger::logInfo;
|
using Asibfm700Logger::logInfo;
|
||||||
using Asibfm700Logger::logWarn;
|
using Asibfm700Logger::logWarn;
|
||||||
|
|
||||||
|
// using Asibfm700PZoneContainer::addPZone;
|
||||||
|
|
||||||
Asibfm700Mount(Asibfm700MountConfig const& config,
|
Asibfm700Mount(Asibfm700MountConfig const& config,
|
||||||
std::shared_ptr<spdlog::logger> logger,
|
std::shared_ptr<spdlog::logger> logger,
|
||||||
const auto& pattern_range = mcc::utils::MccSpdlogLogger::LOGGER_DEFAULT_FORMAT);
|
const auto& pattern_range = mcc::utils::MccSpdlogLogger::LOGGER_DEFAULT_FORMAT);
|
||||||
@ -104,6 +106,5 @@ static_assert(mcc::mcc_position_controls_c<Asibfm700Mount>, "");
|
|||||||
static_assert(mcc::mcc_all_controls_c<Asibfm700Mount>, "");
|
static_assert(mcc::mcc_all_controls_c<Asibfm700Mount>, "");
|
||||||
|
|
||||||
static_assert(mcc::mcc_generic_mount_c<Asibfm700Mount>, "");
|
static_assert(mcc::mcc_generic_mount_c<Asibfm700Mount>, "");
|
||||||
// static_assert(mcc::mcc_generic_fsm_log_mount_c<Asibfm700Mount>, "");
|
|
||||||
|
|
||||||
} // namespace asibfm700
|
} // namespace asibfm700
|
||||||
|
|||||||
@ -279,7 +279,18 @@ protected:
|
|||||||
struct MccGenericFsmMountSlewEvent : MccGenericFsmMountBaseEvent {
|
struct MccGenericFsmMountSlewEvent : MccGenericFsmMountBaseEvent {
|
||||||
static constexpr std::string_view ID{"GENERIC-MOUNT-SLEW-EVENT"};
|
static constexpr std::string_view ID{"GENERIC-MOUNT-SLEW-EVENT"};
|
||||||
|
|
||||||
MccGenericFsmMountSlewEvent(MccGenericFsmMount* mount) : MccGenericFsmMountBaseEvent(mount) {}
|
MccGenericFsmMountSlewEvent(MccGenericFsmMount* mount, bool slew_and_stop)
|
||||||
|
: MccGenericFsmMountBaseEvent(mount), _slewAndStop(slew_and_stop)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool eventData() const noexcept
|
||||||
|
{
|
||||||
|
return _slewAndStop;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool _slewAndStop{};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct MccGenericFsmMountTrackEvent : MccGenericFsmMountBaseEvent {
|
struct MccGenericFsmMountTrackEvent : MccGenericFsmMountBaseEvent {
|
||||||
@ -473,9 +484,8 @@ protected:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
MccGenericFsmMount::slewing_params_t params;
|
bool slew_and_stop = event.eventData();
|
||||||
mount_ptr->getSlewingParams(¶ms);
|
if (slew_and_stop) { // after slewing switch to IDLE state
|
||||||
if (params.slewAndStop) { // after slewing switch to IDLE state
|
|
||||||
mount_ptr->dispatchEvent(MccGenericFsmMountIdleEvent{mount_ptr});
|
mount_ptr->dispatchEvent(MccGenericFsmMountIdleEvent{mount_ptr});
|
||||||
} else { // after slewing switch to tracking state
|
} else { // after slewing switch to tracking state
|
||||||
mount_ptr->dispatchEvent(MccGenericFsmMountTrackEvent{mount_ptr});
|
mount_ptr->dispatchEvent(MccGenericFsmMountTrackEvent{mount_ptr});
|
||||||
@ -674,10 +684,10 @@ public:
|
|||||||
return _lastError;
|
return _lastError;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto slewToTarget()
|
auto slewToTarget(bool slew_and_stop = false)
|
||||||
{
|
{
|
||||||
try {
|
try {
|
||||||
this->dispatchEvent(MccGenericFsmMountSlewEvent{this});
|
this->dispatchEvent(MccGenericFsmMountSlewEvent{this, slew_and_stop});
|
||||||
} catch (std::system_error const& exc) {
|
} catch (std::system_error const& exc) {
|
||||||
if (exc.code().category() == fsm::MccFiniteStateMachineCategory::get()) {
|
if (exc.code().category() == fsm::MccFiniteStateMachineCategory::get()) {
|
||||||
_lastError = MccGenericFsmMountErrorCode::ERROR_INVALID_OPERATION;
|
_lastError = MccGenericFsmMountErrorCode::ERROR_INVALID_OPERATION;
|
||||||
|
|||||||
@ -836,14 +836,20 @@ 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) {
|
typename T::slewing_params_t;
|
||||||
// slew mount to target and stop
|
// requires requires(typename T::slewing_params_t pars) {
|
||||||
requires std::convertible_to<decltype(pars.slewAndStop), bool>;
|
// // slew mount to target and stop
|
||||||
};
|
// 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;
|
|
||||||
|
// the method signature:
|
||||||
|
// slewToTarget(bool slew_and_stop)
|
||||||
|
// slew_and_stop == true, slew mount and stop
|
||||||
|
// slew_and_stop == false, slew mount and track
|
||||||
|
{ t.slewToTarget(std::declval<bool>()) } -> mcc_error_c;
|
||||||
{ t.stopSlewing() } -> mcc_error_c;
|
{ t.stopSlewing() } -> mcc_error_c;
|
||||||
|
|
||||||
{ t.setSlewingParams(std::declval<typename T::slewing_params_t>()) } -> mcc_error_c;
|
{ t.setSlewingParams(std::declval<typename T::slewing_params_t>()) } -> mcc_error_c;
|
||||||
@ -912,7 +918,7 @@ template <typename T>
|
|||||||
concept mcc_generic_mount_c = mcc_telemetry_c<T> && mcc_pzone_container_c<T> && requires(T t) {
|
concept mcc_generic_mount_c = mcc_telemetry_c<T> && mcc_pzone_container_c<T> && requires(T t) {
|
||||||
// requires mcc_error_c<typename T::error_t>;
|
// requires mcc_error_c<typename T::error_t>;
|
||||||
|
|
||||||
// slew mount to target (target coordinates were defined in telemetry data)
|
// slew mount to target (it is assumed that the target coordinates are determined in the telemetry data)
|
||||||
{ t.slewToTarget() };
|
{ t.slewToTarget() };
|
||||||
// { t.slewToTarget() } -> std::same_as<typename T::error_t>;
|
// { t.slewToTarget() } -> std::same_as<typename T::error_t>;
|
||||||
|
|
||||||
|
|||||||
@ -12,7 +12,7 @@ namespace mcc
|
|||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
enum MccAltLimitPZErrorCode : int { ERROR_OK, ERROR_NULLPTR, ERROR_COORD_TRANSFROM, ERROR_PCM_COMP };
|
enum class MccAltLimitPZErrorCode : int { ERROR_OK, ERROR_NULLPTR, ERROR_COORD_TRANSFROM, ERROR_PCM_COMP };
|
||||||
|
|
||||||
} // namespace mcc
|
} // namespace mcc
|
||||||
|
|
||||||
@ -621,7 +621,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
consteval std::string_view name()
|
consteval std::string_view name() const
|
||||||
{
|
{
|
||||||
return axisKind == MccCoordKind::COORDS_KIND_AZ ? "AZ_AXIS-LIMITSWITCH_ZONE"
|
return axisKind == MccCoordKind::COORDS_KIND_AZ ? "AZ_AXIS-LIMITSWITCH_ZONE"
|
||||||
: axisKind == MccCoordKind::COORDS_KIND_HA ? "HA_AXIS-LIMITSWITCH_ZONE"
|
: axisKind == MccCoordKind::COORDS_KIND_HA ? "HA_AXIS-LIMITSWITCH_ZONE"
|
||||||
@ -750,6 +750,17 @@ public:
|
|||||||
requires((mcc_eqt_hrz_coord_c<InputT> || mcc_celestial_point_c<InputT>) &&
|
requires((mcc_eqt_hrz_coord_c<InputT> || mcc_celestial_point_c<InputT>) &&
|
||||||
(mcc_eqt_hrz_coord_c<ResultT> || mcc_celestial_point_c<ResultT>))
|
(mcc_eqt_hrz_coord_c<ResultT> || mcc_celestial_point_c<ResultT>))
|
||||||
{
|
{
|
||||||
|
if (point == nullptr) {
|
||||||
|
return MccAltLimitPZErrorCode::ERROR_NULLPTR;
|
||||||
|
}
|
||||||
|
|
||||||
|
point->X = _minLimit;
|
||||||
|
// if constexpr (mcc_eqt_hrz_coord_c<ResultT>) {
|
||||||
|
// point->X = _minLimit;
|
||||||
|
// } else { // mcc_celestial_point_c
|
||||||
|
// point->X = _minLimit;
|
||||||
|
// }
|
||||||
|
|
||||||
return MccAltLimitPZErrorCode::ERROR_OK;
|
return MccAltLimitPZErrorCode::ERROR_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,7 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
/* MOUNT CONTROL COMPONENTS LIBRARY */
|
/* MOUNT CONTROL COMPONENTS LIBRARY */
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -122,7 +122,7 @@ public:
|
|||||||
{
|
{
|
||||||
*_stopSlewing = true;
|
*_stopSlewing = true;
|
||||||
|
|
||||||
_slewingFunc = [controls, this]() -> error_t {
|
_slewingFunc = [controls, this](bool slew_and_stop) -> error_t {
|
||||||
// first, check target coordinates
|
// first, check target coordinates
|
||||||
typename CONTROLS_T::error_t t_err;
|
typename CONTROLS_T::error_t t_err;
|
||||||
MccTelemetryData tdata;
|
MccTelemetryData tdata;
|
||||||
@ -278,7 +278,8 @@ public:
|
|||||||
{
|
{
|
||||||
std::lock_guard lock{*_currentParamsMutex};
|
std::lock_guard lock{*_currentParamsMutex};
|
||||||
|
|
||||||
if (adjust_mode && !_currentParams.slewAndStop) {
|
// if (adjust_mode && !_currentParams.slewAndStop) {
|
||||||
|
if (adjust_mode && !slew_and_stop) {
|
||||||
// do not allow mount speed fall below sideral
|
// do not allow mount speed fall below sideral
|
||||||
if constexpr (mccIsEquatorialMount(CONTROLS_T::mountType)) {
|
if constexpr (mccIsEquatorialMount(CONTROLS_T::mountType)) {
|
||||||
// turn on sideral rate only if the current position point catches up with the target
|
// turn on sideral rate only if the current position point catches up with the target
|
||||||
@ -359,7 +360,7 @@ public:
|
|||||||
|
|
||||||
virtual ~MccSimpleSlewingModel() = default;
|
virtual ~MccSimpleSlewingModel() = default;
|
||||||
|
|
||||||
error_t slewToTarget()
|
error_t slewToTarget(bool slew_and_stop = false)
|
||||||
{
|
{
|
||||||
if (!(*_stopSlewing)) {
|
if (!(*_stopSlewing)) {
|
||||||
return MccSimpleSlewingModelErrorCode::ERROR_ALREADY_SLEW;
|
return MccSimpleSlewingModelErrorCode::ERROR_ALREADY_SLEW;
|
||||||
@ -367,7 +368,7 @@ public:
|
|||||||
|
|
||||||
*_stopSlewing = false;
|
*_stopSlewing = false;
|
||||||
|
|
||||||
return _slewingFunc();
|
return _slewingFunc(slew_and_stop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -401,7 +402,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::function<error_t()> _slewingFunc{};
|
std::function<error_t(bool)> _slewingFunc{};
|
||||||
std::unique_ptr<std::atomic_bool> _stopSlewing;
|
std::unique_ptr<std::atomic_bool> _stopSlewing;
|
||||||
|
|
||||||
slewing_params_t _currentParams{};
|
slewing_params_t _currentParams{};
|
||||||
|
|||||||
@ -16,7 +16,7 @@
|
|||||||
namespace mcc
|
namespace mcc
|
||||||
{
|
{
|
||||||
|
|
||||||
enum MccTelemetryErrorCode : int {
|
enum class MccTelemetryErrorCode : int {
|
||||||
ERROR_OK,
|
ERROR_OK,
|
||||||
ERROR_NULLPTR,
|
ERROR_NULLPTR,
|
||||||
ERROR_COORD_TRANSFORM,
|
ERROR_COORD_TRANSFORM,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user