This commit is contained in:
2026-02-11 18:22:06 +03:00
parent 652fbd0890
commit 4e08d985c9
8 changed files with 244 additions and 136 deletions

View File

@@ -37,7 +37,7 @@
#include "mcc_generics.h"
#include "mcc_concepts.h"
#include "mcc_netserver_endpoint.h"
#include "mcc_netserver_proto.h"
#include "mcc_traits.h"
@@ -52,9 +52,10 @@ enum class MccGenericMountNetworkServerErrorCode : int {
ERROR_MOUNT_STOP,
ERROR_MOUNT_SET_TARGET,
ERROR_MOUNT_GET_TELEMETRY,
ERROR_MOUNT_COORD_TRANSFORM,
ERROR_MOUNT_SLEW,
ERROR_MOUNT_MOVE,
ERROR_MOUNT_TRACK
ERROR_MOUNT_TRACK,
};
struct MccGenericMountNetworkServerErrorCategory : std::error_category {
@@ -78,6 +79,8 @@ struct MccGenericMountNetworkServerErrorCategory : std::error_category {
return "mount set target error";
case MccGenericMountNetworkServerErrorCode::ERROR_MOUNT_GET_TELEMETRY:
return "mount get telemetry error";
case MccGenericMountNetworkServerErrorCode::ERROR_MOUNT_COORD_TRANSFORM:
return "coordinate transformation error";
case MccGenericMountNetworkServerErrorCode::ERROR_MOUNT_SLEW:
return "mount slewing error";
case MccGenericMountNetworkServerErrorCode::ERROR_MOUNT_MOVE:
@@ -977,9 +980,9 @@ public:
}
protected:
MccCoordinateSerializer::SerializedCoordFormat _coordFormat{
MccCoordinateSerializer::SerializedCoordFormat::CFMT_SGM};
MccCoordinateSerializer::SexagesimalCoordPrec _coordPrec{2, 1};
MccSerializedCoordPairFormat _coordFormat{MccSerializedCoordPairFormat::MCC_SERIALIZED_FORMAT_SXGM_HOURDEG};
MccSerializedAngleFormatPrec _coordPrec{2, 1, 7};
std::function<void()> _stopMountFunc{};
@@ -1041,44 +1044,51 @@ protected:
output_msg.construct(MCC_COMMPROTO_KEYWORD_SERVER_ACK_STR, MCC_COMMPROTO_KEYWORD_TRACK_STR);
}
} else if (input_msg.withKey(MCC_COMMPROTO_KEYWORD_COORDFMT_STR)) {
auto v = input_msg.template paramValue<MccCoordinateSerializer::SerializedCoordFormat>(0);
if (v) {
_coordFormat = v.value();
output_msg.construct(MCC_COMMPROTO_KEYWORD_SERVER_ACK_STR, input_msg.byteRepr());
} else {
err = v.error();
if (input_msg.paramSize()) { // set operation
auto v = input_msg.template paramValue<MccSerializedCoordPairFormat>(0);
if (v) {
_coordFormat = v.value();
output_msg.construct(MCC_COMMPROTO_KEYWORD_SERVER_ACK_STR, input_msg.byteRepr());
} else {
err = v.error();
}
} else { // get operation
output_msg.construct(MCC_COMMPROTO_KEYWORD_SERVER_ACK_STR, MCC_COMMPROTO_KEYWORD_COORDFMT_STR,
_coordFormat);
}
} else if (input_msg.withKey(MCC_COMMPROTO_KEYWORD_COORDPREC_STR)) {
auto v = input_msg.template paramValue<MccCoordinateSerializer::SexagesimalCoordPrec>(0);
if (v) {
_coordPrec = v.value();
output_msg.construct(MCC_COMMPROTO_KEYWORD_SERVER_ACK_STR, input_msg.byteRepr());
} else {
err = v.error();
if (input_msg.paramSize()) { // set operation
auto v = input_msg.template paramValue<MccSerializedAngleFormatPrec>(0);
if (v) {
_coordPrec = v.value();
output_msg.construct(MCC_COMMPROTO_KEYWORD_SERVER_ACK_STR, input_msg.byteRepr());
} else {
err = v.error();
}
} else { // get operation
output_msg.construct(MCC_COMMPROTO_KEYWORD_SERVER_ACK_STR, MCC_COMMPROTO_KEYWORD_COORDPREC_STR,
_coordPrec);
}
} else if (input_msg.withKey(MCC_COMMPROTO_KEYWORD_TARGET_STR)) {
// by default return ICRS coordinates
MccCelestialPoint cp{.pair_kind = MccCoordPairKind::COORDS_KIND_RADEC_ICRS};
impl::MccCoordPairKind pair_kind = impl::MccCoordPairKind::COORDS_KIND_UNKNOWN;
impl::MccSkyPoint sp;
auto sz = input_msg.paramSize();
if (sz) { // set or get operation
auto vp = input_msg.template paramValue<MccCoordPairKind>(0); // is it get operation?
auto vp = input_msg.template paramValue<impl::MccCoordPairKind>(0); // is it get operation?
if (vp) { // coordinate pair kind is given, it is get operation
cp.pair_kind = vp.value();
err = coordsFromTelemetryData(*mount_ptr, true, cp);
pair_kind = vp.value();
err = coordsFromTelemetryData(mount_ptr, true, pair_kind, sp);
if (!err) {
output_msg.construct(MCC_COMMPROTO_KEYWORD_SERVER_ACK_STR, MCC_COMMPROTO_KEYWORD_TARGET_STR,
_coordFormat, _coordPrec, cp);
_coordFormat, _coordPrec, sp);
}
} else { // here a celestial point must be given
auto vc = input_msg.template paramValue<MccCelestialPoint>(0);
auto vc = input_msg.template paramValue<impl::MccSkyPoint>(0);
if (vc) { // set operation
auto m_err = mount_ptr->setPointingTarget(vc.value());
if (m_err) {
if (m_err) {
err = mcc_deduce_error_code(
m_err, MccGenericMountNetworkServerErrorCode::ERROR_MOUNT_SET_TARGET);
}
err = mcc_deduce_err(m_err, MccGenericMountNetworkServerErrorCode::ERROR_MOUNT_SET_TARGET);
} else {
output_msg.construct(MCC_COMMPROTO_KEYWORD_SERVER_ACK_STR, input_msg.byteRepr());
}
@@ -1087,42 +1097,38 @@ protected:
}
}
} else { // get operation
err = coordsFromTelemetryData(*mount_ptr, true, cp);
err = coordsFromTelemetryData(mount_ptr, true, pair_kind, sp);
if (!err) {
output_msg.construct(MCC_COMMPROTO_KEYWORD_SERVER_ACK_STR, MCC_COMMPROTO_KEYWORD_TARGET_STR,
_coordFormat, _coordPrec, cp);
_coordFormat, _coordPrec, sp);
}
}
} else if (input_msg.withKey(MCC_COMMPROTO_KEYWORD_MOUNT_STR)) {
// by default return ICRS coordinates
MccCelestialPoint cp{.pair_kind = MccCoordPairKind::COORDS_KIND_RADEC_ICRS};
impl::MccCoordPairKind pair_kind = impl::MccCoordPairKind::COORDS_KIND_UNKNOWN;
impl::MccSkyPoint sp;
if (input_msg.paramSize()) { // ccordinate pair kind is given
auto vp = input_msg.template paramValue<MccCoordPairKind>(0);
auto vp = input_msg.template paramValue<impl::MccCoordPairKind>(0);
if (vp) { // coordinate pair kind is given
cp.pair_kind = vp.value();
err = coordsFromTelemetryData(*mount_ptr, false, cp);
if (!err) {
output_msg.construct(MCC_COMMPROTO_KEYWORD_SERVER_ACK_STR, MCC_COMMPROTO_KEYWORD_MOUNT_STR,
_coordFormat, _coordPrec, cp);
}
pair_kind = vp.value();
} else { // invalid command!!!
err = vp.error();
}
}
} else {
err = coordsFromTelemetryData(*mount_ptr, false, cp);
if (!err) {
err = coordsFromTelemetryData(mount_ptr, false, pair_kind, sp);
if (!err) {
output_msg.construct(MCC_COMMPROTO_KEYWORD_SERVER_ACK_STR, MCC_COMMPROTO_KEYWORD_MOUNT_STR,
_coordFormat, _coordPrec, cp);
_coordFormat, _coordPrec, sp);
}
}
} else if (input_msg.withKey(MCC_COMMPROTO_KEYWORD_TELEMETRY_STR)) {
MccTelemetryData tdata;
// auto t_err = mount_ptr->telemetryData(&tdata);
auto t_err = mount_ptr->waitForTelemetryData(&tdata);
} else if (input_msg.withKey(MCC_COMMPROTO_KEYWORD_TELEMETRY_STR)) {
typename MountT::telemetry_data_t tdata;
auto t_err = mount_ptr->telemetryData(&tdata);
if (t_err) {
err = mcc_deduce_error_code(t_err, MccGenericMountNetworkServerErrorCode::ERROR_MOUNT_GET_TELEMETRY);
} else {
@@ -1166,79 +1172,90 @@ protected:
}
std::error_code coordsFromTelemetryData(mcc_generic_mount_c auto& mount,
template <mcc_generic_mount_c MountT>
std::error_code coordsFromTelemetryData(MountT* mount,
bool target, // true - target coordinates, false - mount coordinates
mcc_celestial_point_c auto& cp)
impl::MccCoordPairKind pair_kind,
mcc_skypoint_c auto& sp)
{
MccTelemetryData tdata;
typename MountT::telemetry_data_t tdata;
auto t_err = mount.waitForTelemetryData(&tdata);
// auto t_err = mount.telemetryData(&tdata);
auto t_err = mount->telemetryData(&tdata);
if (t_err) {
return mcc_deduce_error_code(t_err, MccGenericMountNetworkServerErrorCode::ERROR_MOUNT_GET_TELEMETRY);
return mcc_deduce_err(t_err, MccGenericMountNetworkServerErrorCode::ERROR_MOUNT_GET_TELEMETRY);
}
mcc_tp2tp(tdata.target.time_point, cp.time_point);
auto get_coords = [&]<mcc_coord_pair_c T>(T& cp) {
cp.setEpoch(tdata.mountPos.epoch());
switch (cp.pair_kind) {
case mcc::MccCoordPairKind::COORDS_KIND_RADEC_ICRS:
if (target) {
auto err = tdata.targetPos.to(cp);
if (err) {
return mcc_deduced_err(err, MccGenericMountNetworkServerErrorCode::ERROR_MOUNT_COORD_TRANSFORM);
}
} else {
auto err = tdata.mountPos.to(cp);
if (err) {
return mcc_deduced_err(err, MccGenericMountNetworkServerErrorCode::ERROR_MOUNT_COORD_TRANSFORM);
}
}
sp.from(cp);
return MccGenericMountNetworkServerErrorCode::ERROR_OK;
};
switch (pair_kind) {
case impl::MccCoordPairKind::COORDS_KIND_RADEC_ICRS: {
impl::MccSkyRADEC_ICRS cp;
return get_coords(cp);
} break;
case impl::MccCoordPairKind::COORDS_KIND_RADEC_OBS: {
impl::MccSkyRADEC_OBS cp;
return get_coords(cp);
} break;
case impl::MccCoordPairKind::COORDS_KIND_HADEC_OBS: {
impl::MccSkyHADEC_OBS cp;
return get_coords(cp);
} break;
case impl::MccCoordPairKind::COORDS_KIND_RADEC_APP: {
impl::MccSkyRADEC_APP cp;
return get_coords(cp);
} break;
case impl::MccCoordPairKind::COORDS_KIND_HADEC_APP: {
impl::MccSkyHADEC_APP cp;
return get_coords(cp);
} break;
case impl::MccCoordPairKind::COORDS_KIND_AZZD: {
impl::MccSkyAZZD cp;
return get_coords(cp);
} break;
case impl::MccCoordPairKind::COORDS_KIND_AZALT: {
impl::MccSkyAZALT cp;
return get_coords(cp);
} break;
case impl::MccCoordPairKind::COORDS_KIND_XY: // interpretated as encoder coordinates
case impl::MccCoordPairKind::COORDS_KIND_GENERIC: { // interpretated as encoder coordinates
if (target) {
cp.X = tdata.target.RA_ICRS;
cp.Y = tdata.target.DEC_ICRS;
mcc_tp2tp(MccCelestialCoordEpoch::J2000_UTC, cp.time_point);
} // ??!!!
break;
case mcc::MccCoordPairKind::COORDS_KIND_RADEC_APP:
if (target) {
cp.X = tdata.target.RA_APP;
cp.Y = tdata.target.DEC_APP;
// WARNING: STILL NOT IMPLEMENTED!!!
} else {
cp.X = tdata.RA_APP;
cp.Y = tdata.DEC_APP;
sp.from(tdata.hwState.XY);
}
break;
case mcc::MccCoordPairKind::COORDS_KIND_HADEC_APP:
return MccGenericMountNetworkServerErrorCode::ERROR_OK;
} break;
case impl::MccCoordPairKind::COORDS_KIND_UNKNOWN: { // interpretated as no transformation
if (target) {
cp.X = tdata.target.HA;
cp.Y = tdata.target.DEC_APP;
sp = tdata.targetPos;
} else {
cp.X = tdata.HA;
cp.Y = tdata.DEC_APP;
sp = tdata.mountPos;
}
break;
case mcc::MccCoordPairKind::COORDS_KIND_AZZD:
if (target) {
cp.X = tdata.target.AZ;
cp.Y = tdata.target.ZD;
} else {
cp.X = tdata.AZ;
cp.Y = tdata.ZD;
}
break;
case mcc::MccCoordPairKind::COORDS_KIND_AZALT:
if (target) {
cp.X = tdata.target.AZ;
cp.Y = tdata.target.ALT;
} else {
cp.X = tdata.AZ;
cp.Y = tdata.ALT;
}
break;
case mcc::MccCoordPairKind::COORDS_KIND_XY:
if (target) {
cp.X = tdata.target.X;
cp.Y = tdata.target.Y;
} else {
cp.X = tdata.X;
cp.Y = tdata.Y;
}
break;
}
default:
return std::make_error_code(std::errc::invalid_argument);
}
return {};
return MccGenericMountNetworkServerErrorCode::ERROR_OK;
}
};