This commit is contained in:
Timur A. Fatkhullin 2025-11-18 18:51:01 +03:00
parent 14e583a244
commit 273f239abb
5 changed files with 93 additions and 15 deletions

View File

@ -503,7 +503,8 @@ public:
// first, compute HA from CIO-based RA!!!
lst_eo();
if (!ret) {
ha = MccAngle(lst - from_pt.X + eo).normalize<MccAngle::NORM_KIND_0_360>();
// ha = MccAngle(lst - from_pt.X + eo).normalize<MccAngle::NORM_KIND_0_360>();
ha = MccAngle(lst - from_pt.X - eo).normalize<MccAngle::NORM_KIND_0_360>();
} else {
return ret;
}
@ -530,7 +531,8 @@ public:
} else if (to_pt->pair_kind == MccCoordPairKind::COORDS_KIND_RADEC_APP) {
lst_eo();
if (!ret) {
to_pt->X = MccAngle(lst - from_pt.X + eo).normalize<MccAngle::NORM_KIND_0_360>();
// to_pt->X = MccAngle(lst - from_pt.X + eo).normalize<MccAngle::NORM_KIND_0_360>();
to_pt->X = MccAngle(lst - from_pt.X - eo).normalize<MccAngle::NORM_KIND_0_360>();
to_pt->Y = from_pt.Y;
} else {
return ret;
@ -554,7 +556,8 @@ public:
azalt2hadec(from_pt, to_pt);
lst_eo();
if (!ret) {
to_pt->X = MccAngle(lst - to_pt->X + eo).normalize<MccAngle::NORM_KIND_0_360>();
// to_pt->X = MccAngle(lst - to_pt->X + eo).normalize<MccAngle::NORM_KIND_0_360>();
to_pt->X = MccAngle(lst - to_pt->X - eo).normalize<MccAngle::NORM_KIND_0_360>();
}
} else {
ret = MccCCTE_ERFAErrorCode::ERROR_UNSUPPORTED_COORD_PAIR;

View File

@ -1121,14 +1121,18 @@ public:
static MccPointingTargetSerializer pt_ser;
// output format: <mount data>, speedX, speedY, pcmX, pcmY, refCorr (in arcsecs), <target data>
// RA-APP_mnt, DEC-APP_mnt, HA_mnt, AZ_mnt, ZD_mnt, ALT_mnt, X_mnt, Y_mnt, COO-PAIR_mnt, TIME-POINT_mnt,
// LST, SPEED_X_mnt, SPEED_Y_mnt, PCM_X, PCM_Y, REFCORR,
// RA-ICRS_tag, DEC-ICRS_tag, RA-APP_tag, DEC-APP_tag, HA_tag, AZ_tag, ZD_tag, ALT_tag, X_tag, Y_tag,
// COO-PAIR_tag, TIME-POINT_tag
eqhrz_ser.setFormat(_currentFormat);
eqhrz_ser.setPrecision(_currentPrec);
eqhrz_ser(value, bytes);
std::format_to(std::back_inserter(bytes), "{}", _delimiter);
// toSexagesimalHour(bytes, value.LST);
// std::format_to(std::back_inserter(bytes), "{}", _delimiter);
toSexagesimalHour(bytes, value.LST);
std::format_to(std::back_inserter(bytes), "{}", _delimiter);
// '*3600.0' to express refraction correction in arcseconds!
toDegrees(bytes, value.speedX, value.speedY, value.pcmX, value.pcmY, value.refCorr * 3600.0);
@ -1152,43 +1156,50 @@ public:
// valid format: <mount data>, speedX, speedY, pcmX, pcmY, refCorr, <target data>
auto els = splitToElements(std::forward<IR>(bytes));
if (els.size() < 12) {
if (els.size() < 28) {
// return std::make_error_code(std::errc::invalid_argument);
return MccCoordinateConvErrorCode::ERROR_ARG_LEN;
}
MccTelemetryData tdata;
auto err = MccEqtHrzCoordsDeserializer{}(std::string_view{els[0].begin(), els[11].end()}, tdata);
auto err = MccEqtHrzCoordsDeserializer{}(std::string_view{els[0].begin(), els[9].end()}, tdata);
if (err) {
return err;
}
err = parseDegreeRepr(els[5], tdata.speedX);
size_t idx = 10;
err = parseHourRepr(els[idx++], tdata.LST);
if (err) {
return err;
}
err = parseDegreeRepr(els[5], tdata.speedY);
err = parseDegreeRepr(els[idx++], tdata.speedX);
if (err) {
return err;
}
err = parseDegreeRepr(els[5], tdata.pcmX);
err = parseDegreeRepr(els[idx++], tdata.speedY);
if (err) {
return err;
}
err = parseDegreeRepr(els[5], tdata.pcmY);
err = parseDegreeRepr(els[idx++], tdata.pcmX);
if (err) {
return err;
}
err = parseDegreeRepr(els[5], tdata.refCorr);
err = parseDegreeRepr(els[idx++], tdata.pcmY);
if (err) {
return err;
}
err = MccPointingTargetDeserializer{}(std::string_view{els[0].begin(), els[11].end()}, tdata.target);
err = parseDegreeRepr(els[idx++], tdata.refCorr);
if (err) {
return err;
}
err = MccPointingTargetDeserializer{}(std::string_view{els[idx].begin(), els.back().end()}, tdata.target);
if (err) {
return err;
}

View File

@ -9,6 +9,7 @@
#include <mutex>
#include "bsplines/mcc_bsplines.h"
#include "mcc_defaults.h"
#include "mcc_generics.h"
namespace mcc
@ -300,7 +301,19 @@ public:
requires(mcc_celestial_point_c<T> || mcc_eqt_hrz_coord_c<T>)
{
// for small corrections only!!!
auto ret = computePCM(std::move(app_pt), result, hw_pt);
if constexpr (mcc_eqt_hrz_coord_c<T>) {
if constexpr (mcc_is_equatorial_mount<MOUNT_TYPE>) {
app_pt.X = app_pt.HA;
app_pt.Y = app_pt.DEC_APP;
} else if constexpr (mcc_is_altaz_mount<MOUNT_TYPE>) {
app_pt.X = app_pt.AZ;
app_pt.Y = app_pt.ZD;
}
}
MccCelestialPoint cp;
auto ret = computePCM(app_pt, result, &cp);
// auto ret = computePCM(std::move(app_pt), result, hw_pt);
if (ret) {
return ret;
}

View File

@ -111,6 +111,7 @@ public:
MccTelemetry(CONTROLS_T* controls)
: _isDataUpdated(new std::atomic_bool()),
_data(),
_userTarget(),
_internalUpdating(new std::atomic_bool),
_currentUpdateInterval(defaultUpdateInterval),
_currentUpdateIntervalMutex(new std::mutex),
@ -647,6 +648,9 @@ public:
std::lock_guard lock{*_updateMutex};
mcc_copy_celestial_point(pt, &_userTarget);
_data.target.pair_kind = pt.pair_kind;
if (pt.pair_kind == MccCoordPairKind::COORDS_KIND_AZALT) {
_data.target.AZ = pt.X;
@ -725,6 +729,8 @@ protected:
std::unique_ptr<std::atomic_bool> _isDataUpdated;
MccTelemetryData _data;
MccCelestialPoint _userTarget{};
std::unique_ptr<std::atomic_bool> _internalUpdating;
std::chrono::nanoseconds _currentUpdateInterval{std::chrono::milliseconds(100)};
std::unique_ptr<std::mutex> _currentUpdateIntervalMutex;

View File

@ -20,7 +20,7 @@ int main()
auto now = std::chrono::system_clock::now();
mcc::MccCelestialPoint cp{
.pair_kind = mcc::MccCoordPairKind::COORDS_KIND_RADEC_ICRS, .X = "10:20:30.44"_hms, .Y = "20:30:40.55"_dms};
.pair_kind = mcc::MccCoordPairKind::COORDS_KIND_RADEC_ICRS, .X = "17:20:30.44"_hms, .Y = "20:30:40.55"_dms};
mcc::MccEqtHrzCoords eqhrz;
eqhrz.time_point = now;
@ -156,5 +156,50 @@ int main()
std::cout << a1.sexagesimal() << "\n" << a2.sexagesimal() << "\n";
std::cout << "\n\n";
std::memset(&eqhrz, 0, sizeof(eqhrz));
eqhrz.X = "12:13:10.08"_hms;
eqhrz.Y = "0:07:39.5"_dms;
eqhrz.X = "00:00:0.0"_hms;
eqhrz.Y = "00:00:00.0"_dms;
// eqhrz.pair_kind = mcc::MccCoordPairKind::COORDS_KIND_RADEC_APP;
// eqhrz.pair_kind = mcc::MccCoordPairKind::COORDS_KIND_RADEC_ICRS;
eqhrz.pair_kind = mcc::MccCoordPairKind::COORDS_KIND_AZZD;
eqhrz.time_point = std::chrono::system_clock::now();
erfa.transformCoordinates(eqhrz, &eqhrz);
// std::cout << "RA_ICRS = " << mcc::MccAngle(cp.X).sexagesimal(true) << "\n";
// std::cout << "DEC_ICRS = " << mcc::MccAngle(cp.Y).sexagesimal() << "\n\n";
std::cout << "time point = " << eqhrz.time_point << "\n";
std::cout << "RA_APP = " << mcc::MccAngle(eqhrz.RA_APP).sexagesimal(true) << "\n";
std::cout << "DEC_APP = " << mcc::MccAngle(eqhrz.DEC_APP).sexagesimal() << "\n";
std::cout << "HA = " << mcc::MccAngle(eqhrz.HA).sexagesimal(true) << "\n";
std::cout << "AZ = " << mcc::MccAngle(eqhrz.AZ).sexagesimal() << "\n";
std::cout << "ZD = " << mcc::MccAngle(eqhrz.ZD).sexagesimal() << "\n";
std::cout << "ALT = " << mcc::MccAngle(eqhrz.ALT).sexagesimal() << "\n";
// std::cout << "\n";
// std::cout << "\n";
// state.meteo = {10.0, 0.5, 0.0}; // refraction must be 0!!!
// erfa.setStateERFA(state);
// eqhrz.X = "00:00:0.0"_hms;
// eqhrz.Y = "60:00:00.0"_dms;
// // restore useful quantities
// state.meteo = {10.0, 0.5, 1010.0};
// erfa.setStateERFA(state);
return 0;
}