This commit is contained in:
Timur A. Fatkhullin 2025-07-14 00:38:10 +03:00
parent 096040bb1b
commit a34d258b94
3 changed files with 114 additions and 58 deletions

View File

@ -111,7 +111,14 @@ public:
mount_telemetry_data_t mountTelemetry() const
{
return _mountTelemetry.data();
mount_telemetry_data_t mnt_data;
auto err = _mountTelemetry.data(mnt_data);
if (err) {
// log ....
}
return mnt_data;
}
@ -123,62 +130,61 @@ public:
{
static constexpr auto pi2 = std::numbers::pi / 2.0;
using tl_coord_t = typename mount_telemetry_data_t::coord_t;
using pz_coord_t = typename ZT::coord_t;
static_assert(std::convertible_to<tl_coord_t, pz_coord_t>,
"TELEMETRY DATA AND PROHIBITED ZONE COORDINATES TYPES ARE NOT COMPATIBLE!");
auto zone_ptr = std::make_shared<ZT>(std::move(zone));
// typename ZT::coord_t x, y;
pz_funcs_t funcs{.coordPairKind = ZT::zoneCoordPairKind,
.name = std::format("{}", zone_ptr->name()),
.timeToFunc =
[zone_ptr, this]() {
auto tmry_data = _mountTelemetry.data();
if constexpr (ZT::preferedCoordKind == MccCoordPairKind::COORDS_KIND_AZALT) { // azimuth and altitude
_pzFuncs.emplace_back({.coordPairKind = ZT::preferedCoordKind,
.inZoneFunc =
[zone_ptr, this]() {
auto tmry_data = _mountTelemetry.data();
return zone_ptr->timeTo(tmry_data.mntRA, tmry_data.mntDEC, tmry_data.utc);
},
.timeFromFunc =
[zone_ptr, this]() {
auto tmry_data = _mountTelemetry.data();
return zone_ptr->inZone(tmry_data.mntAZ, tmry_data.mntALT, tmry_data.utc);
},
.timeToFunc =
[zone_ptr, this]() {
auto tmry_data = _mountTelemetry.data();
return zone_ptr->timeFrom(tmry_data.mntRA, tmry_data.mntDEC, tmry_data.utc);
}};
return zone_ptr->timeTo(tmry_data.mntAZ, tmry_data.mntALT, tmry_data.utc);
},
.timeFromFunc =
[zone_ptr, this]() {
auto tmry_data = _mountTelemetry.data();
return zone_ptr->timeFrom(tmry_data.mntAZ, tmry_data.mntALT, tmry_data.utc);
}});
if constexpr (ZT::zoneCoordPairKind == MccCoordPairKind::COORDS_KIND_AZALT) { // azimuth and altitude
funcs.inZoneFunc = [zone_ptr, this]() {
auto tmry_data = _mountTelemetry.data();
} else if constexpr (ZT::preferedCoordKind ==
return zone_ptr->inZone(tmry_data.mntAZ, tmry_data.mntALT);
};
} else if constexpr (ZT::zoneCoordPairKind ==
MccCoordPairKind::COORDS_KIND_AZZD) { // azimuth and zenithal distance
_pzFuncs.emplace_back(
{.coordPairKind = ZT::preferedCoordKind,
.inZoneFunc =
[zone_ptr, this]() {
auto tmry_data = _mountTelemetry.data();
funcs.inZoneFunc = [zone_ptr, this]() {
auto tmry_data = _mountTelemetry.data();
return zone_ptr->inZone(tmry_data.mntAZ, pi2 - tmry_data.mntALT, tmry_data.utc);
},
.timeToFunc =
[zone_ptr, this]() {
auto tmry_data = _mountTelemetry.data();
return zone_ptr->inZone(tmry_data.mntAZ, pi2 - tmry_data.mntALT);
};
return zone_ptr->timeTo(tmry_data.mntAZ, pi2 - tmry_data.mntALT, tmry_data.utc);
},
.timeFromFunc =
[zone_ptr, this]() {
auto tmry_data = _mountTelemetry.data();
} else if constexpr (ZT::zoneCoordPairKind == MccCoordPairKind::COORDS_KIND_RADEC_APP) {
funcs.inZoneFunc = [zone_ptr, this]() {
auto tmry_data = _mountTelemetry.data();
return zone_ptr->timeFrom(tmry_data.mntAZ, pi2 - tmry_data.mntALT, tmry_data.utc);
}});
return zone_ptr->inZone(tmry_data.mntRA, tmry_data.mntDEC);
};
} else if constexpr (ZT::zoneCoordPairKind == MccCoordPairKind::COORDS_KIND_HADEC_APP) {
funcs.inZoneFunc = [zone_ptr, this]() {
auto tmry_data = _mountTelemetry.data();
} else if constexpr (ZT::preferedCoordKind == MccCoordPairKind::COORDS_KIND_RADEC_APP) {
} else if constexpr (ZT::preferedCoordKind == MccCoordPairKind::COORDS_KIND_HADEC_APP) {
} else if constexpr (ZT::preferedCoordKind == MccCoordPairKind::COORDS_KIND_RADEC_ICRS) {
} else if constexpr (ZT::preferedCoordKind == MccCoordPairKind::COORDS_KIND_XY) {
return zone_ptr->inZone(tmry_data.mntHA, tmry_data.mntDEC);
};
} else {
static_assert(false, "UNKNOWN COORDINATE SYSTEM!!!");
}
_pzFuncs.emplace_back(funcs);
if constexpr (sizeof...(ZTs)) {
pzAddZone(std::move(zones)...);
}
@ -192,10 +198,6 @@ public:
_pzFuncs.clear();
}
template <std::derived_from<MccAngle> XT, std::derived_from<MccAngle> YT>
auto pzInZone(const XT& x, const YT& y, traits::mcc_time_duration_c auto const& utc)
{
}
protected:
mount_config_t _mountConfig;
@ -209,6 +211,7 @@ protected:
typedef std::function<pz_duration_t()> pz_timefrom_func_t;
struct pz_funcs_t {
MccCoordPairKind coordPairKind;
std::string name;
pz_inzone_func_t inZoneFunc;
pz_timeto_func_t timeToFunc;
pz_timefrom_func_t timeFromFunc;
@ -216,6 +219,7 @@ protected:
std::vector<pz_funcs_t> _pzFuncs{};
}; // end of MccMount class

View File

@ -70,9 +70,7 @@ public:
AngleT lat = "00:00:00"_dms; // site latitude
AngleT lon = "00:00:00"_dms; // site longitude
// MccAngle lat = "00:00:00"_dms; // site latitude
// MccAngle lon = "00:00:00"_dms; // site longitude
double elev = 0.0; // site elevation (in meters)
double elev = 0.0; // site elevation (in meters)
mcc::astrom::iers::MccLeapSeconds _leapSeconds{};
mcc::astrom::iers::MccIersBulletinA _bulletinA{};

View File

@ -184,6 +184,14 @@ concept mcc_mount_pec_c = requires(T t, const T t_const) {
typename T::coord_t;
typename T::pec_data_t;
// the 'T' class must contain static constexpr member of 'MccMountType' type
requires requires {
requires std::same_as<decltype(T::mountType), const MccMountType>;
[]() {
static constexpr MccMountType val = T::mountType;
}(); // to ensure 'mountType' can be used in compile-time context
};
// a class that contains at least .dx and .dy public fields
requires requires(typename T::pec_result_t res) {
requires std::same_as<decltype(res.dx), typename T::coord_t>;
@ -202,25 +210,65 @@ concept mcc_mount_pec_c = requires(T t, const T t_const) {
/* MOUNT STATE TELEMETRY */
// a class that contains at least celestial (equatorial and horizontal) coordinates
template <typename T>
concept mcc_mount_telemetry_data_c = requires(T telemetry) {
typename T::coord_t;
requires std::same_as<decltype(telemetry.mntRA), typename T::coord_t>; // apparent RA
requires std::same_as<decltype(telemetry.mntDEC), typename T::coord_t>; // apparent DEC
requires std::same_as<decltype(telemetry.mntHA), typename T::coord_t>; // hour angle
requires std::same_as<decltype(telemetry.mntAZ), typename T::coord_t>; // azimuth
requires std::same_as<decltype(telemetry.mntALT), typename T::coord_t>; // altitude
};
template <typename T>
concept mcc_mount_telemetry_c = requires(T t, const T t_const) {
typename T::error_t;
// a class that at least contains celestial (equatorial and horizontal) coordinates
requires requires(typename T::mount_telemetry_data_t telemetry) {
typename T::mount_telemetry_data_t::coord_t;
requires std::same_as<decltype(telemetry.mntRA), typename T::mount_telemetry_data_t::coord_t>; // apparent RA
requires std::same_as<decltype(telemetry.mntDEC), typename T::mount_telemetry_data_t::coord_t>; // apparent DEC
requires std::same_as<decltype(telemetry.mntHA), typename T::mount_telemetry_data_t::coord_t>; // hour angle
requires std::same_as<decltype(telemetry.mntAZ), typename T::mount_telemetry_data_t::coord_t>; // azimuth
requires std::same_as<decltype(telemetry.mntALT), typename T::mount_telemetry_data_t::coord_t>; // altitude
};
// // a class that at least contains celestial (equatorial and horizontal) coordinates
// requires requires(typename T::mount_telemetry_data_t telemetry) {
// typename T::mount_telemetry_data_t::coord_t;
// requires std::same_as<decltype(telemetry.mntRA), typename T::mount_telemetry_data_t::coord_t>; // apparent
// RA requires std::same_as<decltype(telemetry.mntDEC), typename T::mount_telemetry_data_t::coord_t>; //
// apparent DEC requires std::same_as<decltype(telemetry.mntHA), typename T::mount_telemetry_data_t::coord_t>;
// // hour angle requires std::same_as<decltype(telemetry.mntAZ), typename T::mount_telemetry_data_t::coord_t>;
// // azimuth requires std::same_as<decltype(telemetry.mntALT), typename T::mount_telemetry_data_t::coord_t>; //
// altitude
// };
requires mcc_mount_telemetry_data_c<typename T::mount_telemetry_data_t>;
{ t_const.errorString(std::declval<typename T::error_t>()) } -> mcc_formattable;
{ t.update() } -> std::same_as<typename T::error_t>;
{ t.data() } -> std::same_as<typename T::mount_telemetry_data_t>;
{ t.data(std::declval<typename T::mount_telemetry_data_t&>()) } -> std::same_as<typename T::error_t>;
};
/* SLEW PARAMETERS */
template <typename T>
concept mcc_slew_params_c = std::movable<T> && requires(T t) {
// input coordinates pair type (e.g. IRCS RA,DEC, Az,Alt and so on)
requires std::same_as<decltype(t.coordPairKind), MccCoordPairKind>;
typename T::coord_t;
// co-longitude (e.g. RA or Az)
requires std::same_as<decltype(t.x), typename T::coord_t>;
// co-latitude (e.g. DEC or ZD)
requires std::same_as<decltype(t.y), typename T::coord_t>;
// stop after slewing
requires std::convertible_to<decltype(t.stop), bool>;
requires requires(typename T::slew_model_t t) {
{ t.slew(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>()) };
};
};
@ -265,6 +313,12 @@ concept mcc_prohibited_zone_c = std::movable<T> && requires(T t, const T t_const
t.timeFrom(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>(),
std::declval<typename T::time_point_t>())
} -> mcc_time_duration_c;
// requires for the methods above with the first argument of type 'const
// mcc_mount_telemetry_c::mcc_mount_telemetry_data_t&' (const lvalue reference)
//
// something like this:
requires mcc_mount_telemetry_data_c<mcc_func_arg1_t<decltype(T::inZone)>>;
};