...
This commit is contained in:
219
mcc_netserver.h
219
mcc_netserver.h
@@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user