...
This commit is contained in:
@@ -85,11 +85,19 @@ concept mcc_fp_type_like_c =
|
||||
|
||||
template <typename T>
|
||||
concept mcc_angle_c = mcc_fp_type_like_c<T> && requires(T v, double vd) {
|
||||
// mandatory arithmetic operations
|
||||
{ v + v } -> std::same_as<T>;
|
||||
{ v - v } -> std::same_as<T>;
|
||||
{ v += v } -> std::same_as<T&>;
|
||||
{ v -= v } -> std::same_as<T&>;
|
||||
|
||||
{ vd + v } -> std::same_as<T>;
|
||||
{ vd - v } -> std::same_as<T>;
|
||||
{ v + vd } -> std::same_as<T>;
|
||||
{ v - vd } -> std::same_as<T>;
|
||||
{ v += vd } -> std::same_as<T&>;
|
||||
{ v -= vd } -> std::same_as<T&>;
|
||||
|
||||
{ v * vd } -> std::same_as<T>;
|
||||
{ v / vd } -> std::same_as<T>;
|
||||
};
|
||||
@@ -101,7 +109,8 @@ concept mcc_angle_c = mcc_fp_type_like_c<T> && requires(T v, double vd) {
|
||||
* USE OF STL std::chrono::time_point
|
||||
*/
|
||||
template <typename T>
|
||||
concept mcc_time_point_c = requires(T t) { []<typename CT, typename DT>(std::chrono::time_point<CT, DT>) {}(t); };
|
||||
concept mcc_time_point_c = traits::mcc_systime_c<T>;
|
||||
// concept mcc_time_point_c = requires(T t) { []<typename CT, typename DT>(std::chrono::time_point<CT, DT>) {}(t); };
|
||||
|
||||
|
||||
/* JULIAN DAY CLASS CONCEPT */
|
||||
@@ -123,6 +132,16 @@ concept mcc_error_c = std::convertible_to<T, bool> || requires(const T t) {
|
||||
};
|
||||
|
||||
|
||||
template <mcc_error_c ErrT, typename DErrT>
|
||||
static constexpr ErrT mcc_deduce_error(const DErrT& err, const ErrT& default_err)
|
||||
{
|
||||
if constexpr (std::same_as<ErrT, DErrT>) {
|
||||
return err;
|
||||
} else {
|
||||
return default_err;
|
||||
}
|
||||
}
|
||||
|
||||
/* ATMOSPHERIC REFRACTION MODEL CLASS CONCEPT */
|
||||
|
||||
template <typename T>
|
||||
@@ -144,6 +163,27 @@ concept mcc_celestial_point_c = requires(T t) {
|
||||
};
|
||||
|
||||
|
||||
static constexpr void mcc_copy_celestial_point(mcc_celestial_point_c auto const& from_pt,
|
||||
mcc_celestial_point_c auto* to_pt)
|
||||
{
|
||||
if (to_pt == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
using from_pt_t = std::remove_cvref_t<decltype(from_pt)>;
|
||||
using to_pt_t = std::remove_cvref_t<decltype(*to_pt)>;
|
||||
|
||||
if constexpr (std::derived_from<to_pt_t, from_pt_t> && std::copyable<to_pt_t>) {
|
||||
*to_pt = from_pt;
|
||||
return;
|
||||
}
|
||||
|
||||
to_pt->pair_kind = from_pt.pair_kind;
|
||||
to_pt->time_point = std::chrono::time_point_cast<typename decltype(to_pt->time_point)::duration>(from_pt);
|
||||
to_pt->X = (double)from_pt.X;
|
||||
to_pt->Y = (double)from_pt.Y;
|
||||
}
|
||||
|
||||
|
||||
/* CELESTIAL POINT WITH APPARENT EQUATORIAL AND HORIZONTAL CLASS CONCEPT */
|
||||
|
||||
@@ -159,6 +199,34 @@ concept mcc_eqt_hrz_coord_c = mcc_celestial_point_c<T> && requires(T t) {
|
||||
};
|
||||
|
||||
|
||||
static constexpr void mcc_copy_eqt_hrz_coord(mcc_eqt_hrz_coord_c auto const& from_pt, mcc_eqt_hrz_coord_c auto* to_pt)
|
||||
{
|
||||
if (to_pt == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
using from_pt_t = std::remove_cvref_t<decltype(from_pt)>;
|
||||
using to_pt_t = std::remove_cvref_t<decltype(*to_pt)>;
|
||||
|
||||
if constexpr (std::derived_from<to_pt_t, from_pt_t> && std::copyable<to_pt_t>) {
|
||||
*to_pt = from_pt;
|
||||
return;
|
||||
}
|
||||
|
||||
to_pt->pair_kind = from_pt.pair_kind;
|
||||
to_pt->time_point = std::chrono::time_point_cast<typename decltype(to_pt->time_point)::duration>(from_pt);
|
||||
to_pt->X = (double)from_pt.X;
|
||||
to_pt->Y = (double)from_pt.Y;
|
||||
|
||||
to_pt->RA_APP = (double)from_pt.RA_APP;
|
||||
to_pt->DEC_APP = (double)from_pt.DEC_APP;
|
||||
|
||||
to_pt->HA = (double)from_pt.HA;
|
||||
to_pt->AZ = (double)from_pt.AZ;
|
||||
to_pt->ZD = (double)from_pt.ZD;
|
||||
to_pt->ALT = (double)from_pt.ALT;
|
||||
}
|
||||
|
||||
|
||||
/* CELESTIAL COORDINATES TRANSFORMATION ENGINE */
|
||||
|
||||
@@ -180,6 +248,12 @@ struct mcc_CCTE_interface_t {
|
||||
return std::forward<SelfT>(self).timepointToAppSideral(std::move(tp), st, islocal);
|
||||
}
|
||||
|
||||
template <std::derived_from<mcc_CCTE_interface_t> SelfT>
|
||||
RetT juldayToAppSideral(this SelfT&& self, mcc_julday_c auto jd, mcc_angle_c auto* st, bool islocal = false)
|
||||
{
|
||||
return std::forward<SelfT>(self).timepointToAppSideral(std::move(jd), st, islocal);
|
||||
}
|
||||
|
||||
// NOTE: ASSUMING THE AZINUTH IS COUNTED FROM THE SOUTH THROUGH THE WEST!!!
|
||||
template <std::derived_from<mcc_CCTE_interface_t> SelfT>
|
||||
RetT transformCoordinates(this SelfT&& self, mcc_celestial_point_c auto from_pt, mcc_celestial_point_c auto* to_pt)
|
||||
@@ -230,8 +304,43 @@ concept mcc_pointing_target_coord_c = mcc_eqt_hrz_coord_c<T> && requires(T t) {
|
||||
requires mcc_angle_c<decltype(t.DEC_ICRS)>; // ICRS declination
|
||||
};
|
||||
|
||||
|
||||
static constexpr void mcc_copy_pointing_target_coord(mcc_pointing_target_coord_c auto const& from_pt,
|
||||
mcc_pointing_target_coord_c auto* to_pt)
|
||||
{
|
||||
if (to_pt == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
using from_pt_t = std::remove_cvref_t<decltype(from_pt)>;
|
||||
using to_pt_t = std::remove_cvref_t<decltype(*to_pt)>;
|
||||
|
||||
if constexpr (std::derived_from<to_pt_t, from_pt_t> && std::copyable<to_pt_t>) {
|
||||
*to_pt = from_pt;
|
||||
return;
|
||||
}
|
||||
|
||||
to_pt->pair_kind = from_pt.pair_kind;
|
||||
to_pt->time_point = std::chrono::time_point_cast<typename decltype(to_pt->time_point)::duration>(from_pt);
|
||||
to_pt->X = (double)from_pt.X;
|
||||
to_pt->Y = (double)from_pt.Y;
|
||||
|
||||
to_pt->RA_ICRS = (double)from_pt.RA_ICRS;
|
||||
to_pt->DEC_ICRS = (double)from_pt.DEC_ICRS;
|
||||
|
||||
to_pt->RA_APP = (double)from_pt.RA_APP;
|
||||
to_pt->DEC_APP = (double)from_pt.DEC_APP;
|
||||
|
||||
to_pt->HA = (double)from_pt.HA;
|
||||
to_pt->AZ = (double)from_pt.AZ;
|
||||
to_pt->ZD = (double)from_pt.ZD;
|
||||
to_pt->ALT = (double)from_pt.ALT;
|
||||
}
|
||||
|
||||
|
||||
|
||||
template <typename T>
|
||||
concept mcc_telemetry_data_c = mcc_eqt_hrz_coord_c<T> && requires(T t) {
|
||||
concept mcc_telemetry_data_c = mcc_eqt_hrz_coord_c<T> && std::default_initializable<T> && requires(T t) {
|
||||
// target target coordinates
|
||||
requires mcc_pointing_target_coord_c<decltype(t.target)>;
|
||||
|
||||
@@ -249,6 +358,46 @@ concept mcc_telemetry_data_c = mcc_eqt_hrz_coord_c<T> && requires(T t) {
|
||||
};
|
||||
|
||||
|
||||
static constexpr void mcc_copy_telemetry_data(mcc_telemetry_data_c auto const& from_pt,
|
||||
mcc_telemetry_data_c auto* to_pt)
|
||||
{
|
||||
if (to_pt == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
using from_pt_t = std::remove_cvref_t<decltype(from_pt)>;
|
||||
using to_pt_t = std::remove_cvref_t<decltype(*to_pt)>;
|
||||
|
||||
if constexpr (std::derived_from<to_pt_t, from_pt_t> && std::copyable<to_pt_t>) {
|
||||
*to_pt = from_pt;
|
||||
return;
|
||||
}
|
||||
|
||||
to_pt->pair_kind = from_pt.pair_kind;
|
||||
to_pt->time_point = std::chrono::time_point_cast<typename decltype(to_pt->time_point)::duration>(from_pt);
|
||||
|
||||
to_pt->X = (double)from_pt.X;
|
||||
to_pt->Y = (double)from_pt.Y;
|
||||
to_pt->speedX = (double)from_pt.speedX;
|
||||
to_pt->speedY = (double)from_pt.speedY;
|
||||
|
||||
to_pt->RA_APP = (double)from_pt.RA_APP;
|
||||
to_pt->DEC_APP = (double)from_pt.DEC_APP;
|
||||
|
||||
to_pt->HA = (double)from_pt.HA;
|
||||
to_pt->AZ = (double)from_pt.AZ;
|
||||
to_pt->ZD = (double)from_pt.ZD;
|
||||
to_pt->ALT = (double)from_pt.ALT;
|
||||
|
||||
to_pt->pcmX = (double)from_pt.pcmX;
|
||||
to_pt->pcmY = (double)from_pt.pcmY;
|
||||
|
||||
to_pt->refCorr = (double)from_pt.refCorr;
|
||||
|
||||
mcc_copy_pointing_target_coord(from_pt.target, &to_pt->target);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* MOUNT TELEMETRY MANAGER CLASS CONCEPT */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user