This commit is contained in:
Timur A. Fatkhullin
2025-05-20 01:05:31 +03:00
parent 88d4b30a58
commit f03e38466e
2 changed files with 165 additions and 9 deletions

View File

@@ -43,6 +43,12 @@ concept mcc_mount_state_c = requires(T t, const T t_const) {
{ t.enter() } -> std::same_as<void>;
{ t.exit() } -> std::same_as<void>;
{ t.stop() } -> std::same_as<void>;
typename T::state_data_t;
{ t.stateData() } -> std::same_as<typename T::state_data_t>;
requires std::movable<T>;
};
} // namespace traits
@@ -51,6 +57,46 @@ concept mcc_mount_state_c = requires(T t, const T t_const) {
/* SOME BASIC DATA STRUCTURES DEFINITIONS */
// coordinate system related constants
enum class MccCoordKind : uint8_t {
COORDS_KIND_RA_IRCS, // IRCS right ascension
COORDS_KIND_RA_APP, // apparent right ascension
COORDS_KIND_HA, // hour angle
COORDS_KIND_AZ, // azimuth
COORDS_KIND_X, // co-longitude coordinate
COORDS_KIND_DEC_IRCS, // IRCS declination
COORDS_KIND_DEC_APP, // apparent declination
COORDS_KIND_ALT, // altitude
COORDS_KIND_ZD, // zenithal distance
COORDS_KIND_Y // co-latitude coordinate
};
enum class MccCoordPairKind : uint16_t {
// catalog's
COORDS_KIND_RADEC_IRCS = (int)MccCoordKind::COORDS_KIND_RA_IRCS + ((int)MccCoordKind::COORDS_KIND_DEC_IRCS << 8),
// apparent RA and DEC
COORDS_KIND_RADEC_APP = (int)MccCoordKind::COORDS_KIND_RA_APP + ((int)MccCoordKind::COORDS_KIND_DEC_APP << 8),
// apparent HA (hour angle) and DEC
COORDS_KIND_HADEC_APP = (int)MccCoordKind::COORDS_KIND_HA + ((int)MccCoordKind::COORDS_KIND_DEC_APP << 8),
// Azimuth and Altitude
COORDS_KIND_AZALT = (int)MccCoordKind::COORDS_KIND_AZ + ((int)MccCoordKind::COORDS_KIND_ALT << 8),
// Azimuth and Zenithal distance
COORDS_KIND_AZZD = (int)MccCoordKind::COORDS_KIND_AZ + ((int)MccCoordKind::COORDS_KIND_ZD << 8),
// co-longitude and co-latitude (e.g. mount hardware drive/axis encoders)
COORDS_KIND_XY = (int)MccCoordKind::COORDS_KIND_X + ((int)MccCoordKind::COORDS_KIND_Y << 8),
};
template <MccCoordPairKind KIND>
static constexpr std::string_view MccCoordPairKindStr =
KIND == MccCoordPairKind::COORDS_KIND_RADEC_IRCS ? "RADEC-IRCS"
: KIND == MccCoordPairKind::COORDS_KIND_RADEC_APP ? "RADEC-APP"
: KIND == MccCoordPairKind::COORDS_KIND_HADEC_APP ? "HADEC-APP"
: KIND == MccCoordPairKind::COORDS_KIND_AZALT ? "Azimuth-Altitude"
: KIND == MccCoordPairKind::COORDS_KIND_AZZD ? "AzimuthZendist"
: KIND == MccCoordPairKind::COORDS_KIND_XY ? "XY"
: "UNKNOWN";
// meteo parameters (e.g. to compute refraction)
struct MccMountMeteo {
typedef double temp_t;
@@ -201,6 +247,31 @@ public:
DT time_from{DT::min()};
};
/* mount state base class */
class MccMountState
{
public:
MccMountState(MccMount& mount) : _mount(mount) {}
virtual ~MccMountState() = default;
void enter(this std::derived_from<MccMountState> auto&& self)
{
std::forward<decltype(self)>(self).enter();
}
void exit(std::derived_from<MccMountState> auto next_state)
requires std::movable<decltype(next_state)>
{
_mount.setMountState(std::move(next_state));
}
protected:
MccMount& _mount;
};
/* Constructors and destructor */
MccMount(traits::mcc_input_char_range auto const& logger_mark = "[MOUNT]",
@@ -229,7 +300,7 @@ public:
/* Public methods */
template <traits::mcc_mount_state_c StateT>
void setMountState(StateT& state)
void setMountState(StateT state)
{
_exitCurrentState(); // exit from current state
_exitCurrentState = [&state]() { state.exit(); };