...
This commit is contained in:
parent
646b0bde50
commit
d663f6b54a
@ -12,7 +12,8 @@
|
|||||||
#include "mcc_astrom_iers.h"
|
#include "mcc_astrom_iers.h"
|
||||||
#include "mcc_mount_coord.h"
|
#include "mcc_mount_coord.h"
|
||||||
|
|
||||||
#include "mcc_mount_astrom.h"
|
// #include "mcc_mount_astrom.h"
|
||||||
|
#include "mcc_mount_concepts.h"
|
||||||
|
|
||||||
namespace mcc::astrom::erfa
|
namespace mcc::astrom::erfa
|
||||||
{
|
{
|
||||||
@ -77,12 +78,9 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
typedef MccAngle coord_t;
|
typedef MccAngle coord_t;
|
||||||
typedef MccAngle prop_motion_t;
|
|
||||||
typedef double parallax_t;
|
|
||||||
|
|
||||||
typedef MccAngle gst_t;
|
typedef MccAngle sideral_time_t;
|
||||||
typedef MccAngle pa_t;
|
typedef MccAngle pa_t;
|
||||||
typedef double eo_t;
|
|
||||||
|
|
||||||
struct refract_result_t {
|
struct refract_result_t {
|
||||||
double refa, refb;
|
double refa, refb;
|
||||||
@ -158,7 +156,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
engine_err_t apparentSiderTime(juldate_t juldate, gst_t& gst, bool islocal = false)
|
engine_err_t apparentSiderTime(juldate_t juldate, sideral_time_t& gst, bool islocal = false)
|
||||||
{
|
{
|
||||||
std::lock_guard lock{_stateMutex};
|
std::lock_guard lock{_stateMutex};
|
||||||
|
|
||||||
@ -211,16 +209,12 @@ public:
|
|||||||
|
|
||||||
engine_err_t icrs2obs(coord_t ra,
|
engine_err_t icrs2obs(coord_t ra,
|
||||||
coord_t dec,
|
coord_t dec,
|
||||||
prop_motion_t pm_ra,
|
|
||||||
prop_motion_t pm_dec,
|
|
||||||
parallax_t parallax,
|
|
||||||
juldate_t juldate,
|
juldate_t juldate,
|
||||||
coord_t& ra_app,
|
coord_t& ra_app,
|
||||||
coord_t& dec_app,
|
coord_t& dec_app,
|
||||||
coord_t& ha,
|
coord_t& ha,
|
||||||
coord_t& az,
|
coord_t& az,
|
||||||
coord_t& alt,
|
coord_t& alt)
|
||||||
eo_t& eo)
|
|
||||||
{
|
{
|
||||||
std::lock_guard lock{_stateMutex};
|
std::lock_guard lock{_stateMutex};
|
||||||
|
|
||||||
@ -238,12 +232,12 @@ public:
|
|||||||
pol_pos->x *= arcsec2rad;
|
pol_pos->x *= arcsec2rad;
|
||||||
pol_pos->y *= arcsec2rad;
|
pol_pos->y *= arcsec2rad;
|
||||||
|
|
||||||
double oaz, ozd, oha, odec, ora;
|
double oaz, ozd, oha, odec, ora, eo;
|
||||||
|
|
||||||
int ret = eraAtco13(ra, dec, pm_ra, pm_dec, parallax, 0.0, juldate.MJD0, juldate.mjd, dut1->count(),
|
int ret = eraAtco13(ra, dec, 0.0, 0.0, 0.0, 0.0, juldate.MJD0, juldate.mjd, dut1->count(), _currentState.lon,
|
||||||
_currentState.lon, _currentState.lat, _currentState.elev, pol_pos->x, pol_pos->y,
|
_currentState.lat, _currentState.elev, pol_pos->x, pol_pos->y, _currentState.meteo.pressure,
|
||||||
_currentState.meteo.pressure, _currentState.meteo.temperature, _currentState.meteo.humidity,
|
_currentState.meteo.temperature, _currentState.meteo.humidity, _currentState.wavelength,
|
||||||
_currentState.wavelength, &oaz, &ozd, &oha, &odec, &ora, &eo);
|
&oaz, &ozd, &oha, &odec, &ora, &eo);
|
||||||
|
|
||||||
if (ret == 1) {
|
if (ret == 1) {
|
||||||
return ERROR_DUBIOUS_YEAR;
|
return ERROR_DUBIOUS_YEAR;
|
||||||
|
|||||||
@ -38,14 +38,11 @@ concept mcc_astrom_engine_c = requires(T t, const T t_const) {
|
|||||||
typename T::engine_state_t;
|
typename T::engine_state_t;
|
||||||
requires std::movable<typename T::engine_state_t>;
|
requires std::movable<typename T::engine_state_t>;
|
||||||
|
|
||||||
typename T::coord_t;
|
typename T::coord_t; // type for coordinates representation
|
||||||
typename T::prop_motion_t;
|
typename T::time_point_t; // type to represent UTC time point
|
||||||
typename T::parallax_t;
|
typename T::juldate_t; // type to represent Julian date
|
||||||
typename T::time_point_t;
|
typename T::sideral_time_t; // type to represent sideral time
|
||||||
typename T::juldate_t;
|
typename T::pa_t; // type to represent parallactic angle
|
||||||
typename T::gst_t;
|
|
||||||
typename T::pa_t;
|
|
||||||
typename T::eo_t;
|
|
||||||
|
|
||||||
typename T::refract_result_t;
|
typename T::refract_result_t;
|
||||||
|
|
||||||
@ -58,14 +55,12 @@ concept mcc_astrom_engine_c = requires(T t, const T t_const) {
|
|||||||
|
|
||||||
/* coordinates conversional methods */
|
/* coordinates conversional methods */
|
||||||
|
|
||||||
// ICRS RA and DEC to observed place: icrs2obs(ra, dec, pra, pdec, plx, jd, ra_app, dec_app, ha, az, alt, eo)
|
// ICRS RA and DEC to observed place: icrs2obs(ra, dec, jd, ra_app, dec_app, ha, az, alt)
|
||||||
{
|
{
|
||||||
t.icrs2obs(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>(),
|
t.icrs2obs(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>(),
|
||||||
std::declval<typename T::prop_motion_t>(), std::declval<typename T::prop_motion_t>(),
|
std::declval<typename T::juldate_t>(), std::declval<typename T::coord_t&>(),
|
||||||
std::declval<typename T::parallax_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::coord_t&>())
|
||||||
std::declval<typename T::coord_t&>(), std::declval<typename T::eo_t&>())
|
|
||||||
} -> std::same_as<typename T::engine_err_t>;
|
} -> std::same_as<typename T::engine_err_t>;
|
||||||
|
|
||||||
// compute hour angle and declination from azimuth and altitude: hadec2azalt(ha, dec, az, alt)
|
// compute hour angle and declination from azimuth and altitude: hadec2azalt(ha, dec, az, alt)
|
||||||
@ -80,7 +75,7 @@ concept mcc_astrom_engine_c = requires(T t, const T t_const) {
|
|||||||
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::same_as<typename T::engine_err_t>;
|
} -> std::same_as<typename T::engine_err_t>;
|
||||||
|
|
||||||
// compute paralactic angle: hadec2pa(ha, dec, pa)
|
// compute parallactic angle: hadec2pa(ha, dec, pa)
|
||||||
{
|
{
|
||||||
t.hadec2pa(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>(),
|
t.hadec2pa(std::declval<typename T::coord_t>(), std::declval<typename T::coord_t>(),
|
||||||
std::declval<typename T::pa_t&>())
|
std::declval<typename T::pa_t&>())
|
||||||
@ -93,12 +88,11 @@ concept mcc_astrom_engine_c = requires(T t, const T t_const) {
|
|||||||
{
|
{
|
||||||
t.greg2jul(std::declval<typename T::time_point_t>(), std::declval<typename T::juldate_t&>())
|
t.greg2jul(std::declval<typename T::time_point_t>(), std::declval<typename T::juldate_t&>())
|
||||||
} -> std::same_as<typename T::engine_err_t>;
|
} -> std::same_as<typename T::engine_err_t>;
|
||||||
// requires mcc_systime_c<mcc_func_arg1_t<decltype(&T::greg2jul)>>;
|
|
||||||
// requires mcc_output_arg_c<mcc_func_argN_t<decltype(&T::greg2jul), 2>, typename T::juldate_t>;
|
|
||||||
|
|
||||||
// apparent sideral time: apparentSiderTime(jd, gst, islocal)
|
// apparent sideral time: apparentSiderTime(jd, gst, islocal)
|
||||||
|
// if islocal == false then the method must return the Greenwich apparent sideral time, otherwise - local one
|
||||||
{
|
{
|
||||||
t.apparentSiderTime(std::declval<typename T::juldate_t>(), std::declval<typename T::gst_t&>(),
|
t.apparentSiderTime(std::declval<typename T::juldate_t>(), std::declval<typename T::sideral_time_t&>(),
|
||||||
std::declval<bool>())
|
std::declval<bool>())
|
||||||
} -> std::same_as<typename T::engine_err_t>;
|
} -> std::same_as<typename T::engine_err_t>;
|
||||||
|
|
||||||
@ -120,14 +114,12 @@ concept mcc_hw_encoder_c = requires(T t, const T t_const) {
|
|||||||
typename T::coord_t;
|
typename T::coord_t;
|
||||||
typename T::speed_t;
|
typename T::speed_t;
|
||||||
typename T::accel_t;
|
typename T::accel_t;
|
||||||
// typename T::high_order_deriv_t;
|
|
||||||
|
|
||||||
requires requires(typename T::state_t st) {
|
requires requires(typename T::state_t st) {
|
||||||
std::same_as<decltype(st.time), typename T::time_point_t>;
|
requires std::same_as<decltype(st.time), typename T::time_point_t>;
|
||||||
std::same_as<decltype(st.pos), typename T::coord_t>;
|
requires std::same_as<decltype(st.pos), typename T::coord_t>;
|
||||||
std::same_as<decltype(st.speed), typename T::speed_t>;
|
requires std::same_as<decltype(st.speed), typename T::speed_t>;
|
||||||
std::same_as<decltype(st.accel), typename T::accel_t>;
|
requires std::same_as<decltype(st.accel), typename T::accel_t>;
|
||||||
// std::same_as<decltype(st.high_order), typename T::high_order_deriv_t>;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
{ t_const.errorString(std::declval<typename T::error_t>()) } -> mcc_formattable;
|
{ t_const.errorString(std::declval<typename T::error_t>()) } -> mcc_formattable;
|
||||||
@ -147,9 +139,9 @@ concept mcc_hw_motor_c = requires(T t, const T t_const) {
|
|||||||
typename T::accel_t;
|
typename T::accel_t;
|
||||||
|
|
||||||
requires requires(typename T::pos_t st) {
|
requires requires(typename T::pos_t st) {
|
||||||
std::same_as<decltype(st.pos), typename T::coord_t>;
|
requires std::same_as<decltype(st.pos), typename T::coord_t>;
|
||||||
std::same_as<decltype(st.speed), typename T::speed_t>; // means maximal allowed speed
|
requires std::same_as<decltype(st.speed), typename T::speed_t>; // means maximal allowed speed
|
||||||
std::same_as<decltype(st.accel), typename T::accel_t>; // means a maximal allowed acceleration (jerk)
|
requires std::same_as<decltype(st.accel), typename T::accel_t>; // means a maximal allowed acceleration (jerk)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -157,7 +149,7 @@ concept mcc_hw_motor_c = requires(T t, const T t_const) {
|
|||||||
|
|
||||||
{ t_const.id() } -> mcc_formattable;
|
{ t_const.id() } -> mcc_formattable;
|
||||||
|
|
||||||
{ t.rotate(std::declval<typename T::pos_t>()) } -> std::same_as<typename T::error_t>;
|
{ t.toPos(std::declval<typename T::pos_t>()) } -> std::same_as<typename T::error_t>;
|
||||||
|
|
||||||
{ t.stop() } -> std::same_as<typename T::error_t>;
|
{ t.stop() } -> std::same_as<typename T::error_t>;
|
||||||
};
|
};
|
||||||
|
|||||||
@ -8,28 +8,29 @@
|
|||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
#include "mcc_mount_config.h"
|
// #include "mcc_mount_config.h"
|
||||||
|
#include "mcc_mount_concepts.h"
|
||||||
|
|
||||||
namespace mcc
|
namespace mcc
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
namespace traits
|
// namespace traits
|
||||||
{
|
// {
|
||||||
|
|
||||||
template <typename T>
|
// template <typename T>
|
||||||
concept mcc_mount_telemetry_c = requires(T t, const T t_const) {
|
// concept mcc_mount_telemetry_c = requires(T t, const T t_const) {
|
||||||
typename T::error_t;
|
// typename T::error_t;
|
||||||
typename T::mount_telemetry_data_t;
|
// typename T::mount_telemetry_data_t;
|
||||||
|
|
||||||
{ t_const.errorString(std::declval<typename T::error_t>()) } -> mcc_formattable;
|
// { t_const.errorString(std::declval<typename T::error_t>()) } -> mcc_formattable;
|
||||||
|
|
||||||
{ t.update() } -> std::same_as<typename T::error_t>;
|
// { t.update() } -> std::same_as<typename T::error_t>;
|
||||||
|
|
||||||
{ t_const.data() } -> std::same_as<typename T::mount_telemetry_data_t>;
|
// { t_const.data() } -> std::same_as<typename T::mount_telemetry_data_t>;
|
||||||
};
|
// };
|
||||||
|
|
||||||
} // namespace traits
|
// } // namespace traits
|
||||||
|
|
||||||
|
|
||||||
class MccMountTelemetry
|
class MccMountTelemetry
|
||||||
|
|||||||
@ -153,6 +153,8 @@ int main(int argc, char* argv[])
|
|||||||
|
|
||||||
state.meteo = {10.0, 0.5, 1010.0};
|
state.meteo = {10.0, 0.5, 1010.0};
|
||||||
|
|
||||||
|
std::cout << "LON = " << state.lon.sexagesimal() << "\n";
|
||||||
|
std::cout << "LAT = " << state.lat.sexagesimal() << "\n\n";
|
||||||
|
|
||||||
mcc::astrom::erfa::MccMountAstromEngineERFA erfa(state);
|
mcc::astrom::erfa::MccMountAstromEngineERFA erfa(state);
|
||||||
mcc::astrom::erfa::MccMountAstromEngineERFA::juldate_t jd{60861.72};
|
mcc::astrom::erfa::MccMountAstromEngineERFA::juldate_t jd{60861.72};
|
||||||
@ -161,14 +163,23 @@ int main(int argc, char* argv[])
|
|||||||
erfa.greg2jul(now, jd);
|
erfa.greg2jul(now, jd);
|
||||||
std::cout << "MJD(" << now << ") = " << jd.mjd << "\n";
|
std::cout << "MJD(" << now << ") = " << jd.mjd << "\n";
|
||||||
|
|
||||||
|
mcc::MccAngle gst;
|
||||||
|
erfa.apparentSiderTime(jd, gst, true);
|
||||||
|
std::cout << "GST(MJD = " << jd.mjd << ") = " << gst.sexagesimal(true) << "\n\n";
|
||||||
|
|
||||||
|
|
||||||
mcc::MccAngle ra1{"10:00:00", mcc::mcc_hms}, dec1{"68:25:10.43"}, ra_o, dec_o, ha1, az1, alt1;
|
mcc::MccAngle ra1{"10:00:00", mcc::mcc_hms}, dec1{"68:25:10.43"}, ra_o, dec_o, ha1, az1, alt1;
|
||||||
|
|
||||||
std::cout << "RA = " << ra1.sexagesimal(true) << ", DEC = " << dec1.sexagesimal() << "\n";
|
std::cout << "RA = " << ra1.sexagesimal(true) << ", DEC = " << dec1.sexagesimal() << "\n";
|
||||||
auto res = erfa.icrs2obs(ra1, dec1, 0, 0, 0, jd, ra_o, dec_o, ha1, az1, alt1, eo);
|
|
||||||
|
auto res = erfa.icrs2obs(ra1, dec1, jd, ra_o, dec_o, ha1, az1, alt1);
|
||||||
|
|
||||||
std::cout << "ret code (icrs2obs) = " << erfa.errorString(res) << "\n";
|
std::cout << "ret code (icrs2obs) = " << erfa.errorString(res) << "\n";
|
||||||
std::cout << "alt = " << alt1.sexagesimal() << "\n";
|
std::cout << "alt = " << alt1.sexagesimal() << "\n";
|
||||||
std::cout << "az = " << az1.sexagesimal() << "\n";
|
std::cout << "az = " << az1.sexagesimal() << "\n";
|
||||||
|
|
||||||
|
std::cout << "RA_app = " << ra_o.sexagesimal(true) << "\n";
|
||||||
|
std::cout << "DEC_app = " << dec_o.sexagesimal() << "\n";
|
||||||
|
|
||||||
|
|
||||||
return ecode;
|
return ecode;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user