This commit is contained in:
Timur A. Fatkhullin 2025-07-14 23:41:20 +03:00
parent 2dbb23dc46
commit 62258a991b
4 changed files with 42 additions and 23 deletions

View File

@ -56,10 +56,16 @@ public:
/* constructors and destructor */
template <fsm::traits::fsm_state_c InitStateT, traits::mcc_input_char_range LogMarkT = std::string_view>
MccMount(InitStateT,
MccMount(mount_config_t mount_config,
InitStateT,
std::shared_ptr<spdlog::logger> logger = spdlog::null_logger_mt("NULL"),
const LogMarkT& logger_mark = "[MOUNT]")
: fsm::MccFiniteStateMachine(InitStateT{}), utils::MccSpdlogLogger(logger)
: fsm::MccFiniteStateMachine(InitStateT{}),
utils::MccSpdlogLogger(logger),
_mountConfig(std::move(mount_config)),
_mountTelemetry(_mountConfig.telemetry),
_slewModel(_mountConfig.slewModel),
_guidingModel(_mountConfig.guidingModel)
{
addMarkToPatternIdx(logger_mark);
@ -93,11 +99,18 @@ public:
void startGuiding() {}
mount_config_t mountConfig() const
{
return _mountConfig;
}
// mount_config_t mountConfig() const
// {
// return _mountConfig;
// }
// returns "mount_config_t&" or "mount_config_t const&"
decltype(auto) mountConfig(this auto&& self)
{
auto& config_ref = std::forward<decltype(self)>(self)._mountConfig;
return config_ref;
}
mount_telemetry_data_t mountTelemetryData() const
{
@ -119,8 +132,6 @@ public:
traits::mcc_prohibited_zone_c<mount_telemetry_data_t>... ZTs>
size_t pzAddZone(ZT zone, ZTs... zones)
{
static constexpr auto pi2 = std::numbers::pi / 2.0;
auto zone_ptr = std::make_shared<ZT>(std::move(zone));
_pzFuncs.emplace_back(
@ -151,7 +162,9 @@ public:
protected:
mount_config_t _mountConfig;
mount_telemetry_t _mountTelemetry;
mount_telemetry_t& _mountTelemetry;
slew_model_t& _slewModel;
guiding_model_t& _guidingModel;
// a type to which the result of calling prohibited zone class methods 'timeTo' and 'timeFrom' will be converted
typedef std::chrono::duration<double> pz_duration_t; // seconds as floating-point number

View File

@ -289,7 +289,8 @@ public:
coord_t& dec_app,
coord_t& ha,
coord_t& az,
coord_t& alt)
coord_t& alt,
eo_t& eo)
{
std::lock_guard lock{_stateMutex};
@ -307,12 +308,12 @@ public:
pol_pos->x *= arcsec2rad;
pol_pos->y *= arcsec2rad;
double oaz, ozd, oha, odec, ora, eo;
double oaz, ozd, oha, odec, ora, eo_;
int ret = eraAtco13(ra, dec, 0.0, 0.0, 0.0, 0.0, juldate.MJD0, juldate.mjd, dut1->count(), _currentState.lon,
_currentState.lat, _currentState.elev, pol_pos->x, pol_pos->y, _currentState.meteo.pressure,
_currentState.meteo.temperature, _currentState.meteo.humidity, _currentState.wavelength,
&oaz, &ozd, &oha, &odec, &ora, &eo);
&oaz, &ozd, &oha, &odec, &ora, &eo_);
if (ret == 1) {
return ERROR_DUBIOUS_YEAR;
@ -325,6 +326,7 @@ public:
az = oaz;
alt = std::numbers::pi / 2.0 - ozd;
ha = oha;
eo = eo_;
return ERROR_OK;
}

View File

@ -68,8 +68,8 @@ namespace mcc::traits
template <typename T>
concept mcc_astrom_engine_c = requires(T t, const T t_const) {
requires mcc_error_c<typename T::error_t>;
typename T::engine_state_t;
requires std::movable<typename T::engine_state_t>;
// typename T::engine_state_t;
// requires std::movable<typename T::engine_state_t>;
typename T::coord_t; // type for coordinates representation
typename T::time_point_t; // type to represent UTC time point
@ -81,20 +81,21 @@ concept mcc_astrom_engine_c = requires(T t, const T t_const) {
typename T::refract_result_t;
{ t.setState(std::declval<typename T::engine_state_t>()) };
// { t.setState(std::declval<typename T::engine_state_t>()) };
{ t_const.getState() } -> std::same_as<typename T::engine_state_t>;
// { t_const.getState() } -> std::same_as<typename T::engine_state_t>;
{ t_const.errorString(std::declval<typename T::error_t>()) } -> mcc_formattable;
/* coordinates conversional methods */
// ICRS RA and DEC to observed place: icrs2obs(ra, dec, jd, ra_app, dec_app, ha, az, alt)
// ICRS RA and DEC to observed place: icrs2obs(ra, dec, jd, ra_app, dec_app, ha, az, alt, eo)
{
t.icrs2obs(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>(),
std::declval<typename T::juldate_t>(), std::declval<typename T::coord_t&>(),
std::declval<typename T::coord_t&>(), std::declval<typename T::coord_t&>(),
std::declval<typename T::coord_t&>(), std::declval<typename T::coord_t&>())
std::declval<typename T::coord_t&>(), std::declval<typename T::coord_t&>(),
std::declval<typename T::eo_t&>())
} -> std::same_as<typename T::error_t>;
// compute hour angle and declination from azimuth and altitude: hadec2azalt(ha, dec, az, alt)
@ -185,6 +186,7 @@ concept mcc_mount_pec_c = requires(T t, const T t_const) {
requires std::same_as<decltype(T::mountType), const MccMountType>;
[]() {
static constexpr MccMountType val = T::mountType;
return val;
}(); // to ensure 'mountType' can be used in compile-time context
};
@ -307,6 +309,7 @@ concept mcc_prohibited_zone_c =
requires std::same_as<decltype(T::zoneCoordPairKind), const MccCoordPairKind>;
[]() {
constexpr MccCoordPairKind val = T::zoneCoordPairKind;
return val;
}(); // to ensure that 'zoneCoordPairKind' can be used at compile-time context
};
@ -350,7 +353,7 @@ concept mcc_prohibited_zone_c =
template <typename T>
concept mcc_mount_config_c = requires(T t) {
concept mcc_mount_config_c = std::movable<T> && requires(T t) {
// { t.astromEngine() } -> mcc_astrom_engine_c;
// { t.pec() } -> mcc_mount_pec_c;
// { t.hardware() } -> mcc_mount_hardware_c;

View File

@ -170,11 +170,12 @@ int main(int argc, char* argv[])
mcc::MccAngle ra1{"10:00:00", mcc::mcc_hms}, dec1{"68:25:10.43"}, ra_o, dec_o, ha1, az1, alt1;
mcc::MccAngle eor;
std::cout << "RA = " << ra1.sexagesimal(true) << ", DEC = " << dec1.sexagesimal() << "\n";
auto res = erfa.icrs2obs(ra1, dec1, jd, ra_o, dec_o, ha1, az1, alt1);
mcc::MccAngle eor;
auto res = erfa.icrs2obs(ra1, dec1, jd, ra_o, dec_o, ha1, az1, alt1, eor);
std::cout << "eq of origins (from icrs2obs) = " << eor.sexagesimal(true) << "\n";
std::cout << "ret code (icrs2obs) = " << erfa.errorString(res) << "\n";
std::cout << "alt = " << alt1.sexagesimal() << "\n";
@ -186,7 +187,7 @@ int main(int argc, char* argv[])
res = erfa.eqOrigins(jd, eor);
std::cout << "eq of origins = " << eor.sexagesimal(true) << "\n";
std::cout << "eq of origins (from eqOrigins) = " << eor.sexagesimal(true) << "\n";
std::cout << "RA_app_comp = " << (lst - ha1 + eor).sexagesimal(true) << "\n";