mountcontrol/cxx/asibfm700_slew_model.cpp
2025-07-19 19:52:30 +03:00

111 lines
3.6 KiB
C++

#include "asibfm700_slew_model.h"
namespace asibfm700
{
/* error category implementation */
const char* AsibFM700SlewModelErrorCategory::name() const noexcept
{
return "ASTROSIB FM700 MOUNT SLEW MODEL ERROR CATEGORY";
}
std::string AsibFM700SlewModelErrorCategory::message(int ec) const
{
AsibFM700SlewModelErrorCode code = static_cast<AsibFM700SlewModelErrorCode>(ec);
std::string msg;
switch (code) {
case AsibFM700SlewModelErrorCode::ERROR_OK:
msg = "OK";
default:
msg = "UNKNOWN ERROR";
}
return msg;
}
const AsibFM700SlewModelErrorCategory& AsibFM700SlewModelErrorCategory::get()
{
static const AsibFM700SlewModelErrorCategory constInst;
return constInst;
}
AsibFM700SlewModel::AsibFM700SlewModel(AsibFM700Hardware& hw_control, AsibFM700AstromEngine& astrom_engine)
: _hwControl(hw_control), _astromEngine(astrom_engine)
{
}
AsibFM700SlewModel::error_t AsibFM700SlewModel::slew(const slew_params_t& slew_pars, AsibFM700Telemetry& telemetry)
{
using astrom_t = std::remove_reference_t<decltype(_astromEngine)>;
using coord_t = typename astrom_t::coord_t;
using jd_t = typename astrom_t::juldate_t;
AsibFM700SlewModel::error_t res_err = AsibFM700SlewModelErrorCode::ERROR_OK;
AsibFM700Hardware::axes_pos_t ax_pos;
if (slew_pars.coordPairKind == mcc::MccCoordPairKind::COORDS_KIND_XY) {
// trivial case (the pair is interpretated as raw encoder coordinates)
ax_pos.x = slew_pars.x;
ax_pos.y = slew_pars.y;
} else if (slew_pars.coordPairKind == mcc::MccCoordPairKind::COORDS_KIND_RADEC_ICRS) { // catalog coordinates
jd_t jd;
coord_t ra_app, dec_app, ha, az, alt;
typename astrom_t::eo_t eo;
auto err = _astromEngine.greg2jul(std::chrono::system_clock::now(), jd);
if (!err) {
err = _astromEngine.icrs2obs(slew_pars.x, slew_pars.y, jd, ra_app, dec_app, ha, az, alt, eo);
if (!err) {
res_err = slew({.coordPairKind = mcc::MccCoordPairKind::COORDS_KIND_HADEC_APP,
.x = ha,
.y = dec_app,
.stop = slew_pars.stop},
telemetry);
}
}
} else if (slew_pars.coordPairKind == mcc::MccCoordPairKind::COORDS_KIND_RADEC_APP) { // apparent
jd_t jd;
typename astrom_t::eo_t eo;
auto err = _astromEngine.greg2jul(std::chrono::system_clock::now(), jd);
if (!err) {
typename astrom_t::sideral_time_t lst;
err = _astromEngine.apparentSiderTime(jd, lst, true);
if (!err) {
err = _astromEngine.eqOrigins(jd, eo);
if (!err) {
res_err = slew({.coordPairKind = mcc::MccCoordPairKind::COORDS_KIND_HADEC_APP,
.x = lst - slew_pars.x + eo, // HA = LST - RA_APP + EO
.y = slew_pars.y,
.stop = slew_pars.stop},
telemetry);
}
}
}
} else if (slew_pars.coordPairKind == mcc::MccCoordPairKind::COORDS_KIND_HADEC_APP) { // apparent
// compute encoders coordinates
} else if (slew_pars.coordPairKind == mcc::MccCoordPairKind::COORDS_KIND_AZALT) {
} else if (slew_pars.coordPairKind == mcc::MccCoordPairKind::COORDS_KIND_AZZD) {
}
auto err = _hwControl.setPos(std::move(ax_pos));
while (true) {
}
return res_err;
}
} // namespace asibfm700