This commit is contained in:
2026-02-23 11:38:23 +03:00
parent 32ed709222
commit e0b3ef225d

View File

@@ -0,0 +1,116 @@
#pragma once
#include "mcc_error.h"
namespace mcc::impl
{
enum class MccGenericMovementControlsErrorCode : int {
ERROR_OK,
ERROR_IN_PZONE,
ERRROR_NEAR_PZONE,
ERROR_TELEMETRY_TIMEOUT
};
} // namespace mcc::impl
namespace std
{
template <>
class is_error_code_enum<mcc::impl::MccGenericMovementControlsErrorCode> : public true_type
{
};
} // namespace std
namespace mcc::impl
{
// error category
struct MccGenericMovementControlsErrorCategory : std::error_category {
const char* name() const noexcept { return "MCC-GENERIC-MOVECONTRL"; }
std::string message(int ec) const
{
MccGenericMovementControlsErrorCode err = static_cast<MccGenericMovementControlsErrorCode>(ec);
switch (err) {
case MccGenericMovementControlsErrorCode::ERROR_OK:
return "OK";
case MccGenericMovementControlsErrorCode::ERROR_IN_PZONE:
return "target is in zone";
case MccGenericMovementControlsErrorCode::ERRROR_NEAR_PZONE:
return "mount is near zone";
case MccGenericMovementControlsErrorCode::ERROR_TELEMETRY_TIMEOUT:
return "telemetry data timeout";
default:
return "unknown";
}
static const MccGenericMovementControlsErrorCategory& get()
{
static const MccGenericMovementControlsErrorCategory constInst;
return constInst;
}
}
};
inline std::error_code make_error_code(MccGenericMovementControlsErrorCode ec)
{
return std::error_code(static_cast<int>(ec), MccGenericMovementControlsErrorCategory::get());
}
struct MccGenericMovementControlsParams {
// timeout to telemetry updating
std::chrono::milliseconds telemetryTimeout{3000};
// braking acceleration after execution of mount stopping command (in rads/s^2)
// it must be given as non-negative value!!!
double brakingAccelX{0.0};
double brakingAccelY{0.0};
// ******* slewing mode *******
// coordinates difference to stop slewing (in radians)
double slewToleranceRadius{5.0_arcsecs};
// slewing trajectory file. if empty - just skip saving
std::string slewingPathFilename{};
// ******* tracking mode *******
// maximal target-to-mount difference for tracking process (in arcsecs)
// it it is greater then the current mount coordinates are used as target one
double trackingMaxCoordDiff{20.0};
// tracking trajectory file. if empty - just skip saving
std::string trackingPathFilename{};
};
template <std::default_constructible PARAMS_T>
class MccGenericMovementControls
{
public:
typedef MccError error_t;
typedef PARAMS_T movement_params_t;
error_t slewToTarget(bool slew_and_stop) {}
error_t trackTarget() {}
error_t stopMount() {}
error_t setMovementParams(movement_params_t const& pars) { _currentParams->store(pars); }
movement_params_t getMovementParams() const { return _currentParams->load(); }
protected:
MccGenericMovementControls() = default;
std::unique_ptr<std::atomic<PARAMS_T>> _currentParams{new std::atomic<PARAMS_T>{}};
};
} // namespace mcc::impl