From e6004a6c8a04db8c06cf83b3bc93e006445da681 Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Fri, 20 Feb 2026 12:08:21 +0300 Subject: [PATCH] ... --- include/mcc/mcc_concepts.h | 19 ++++++----- include/mcc/mcc_deserializer.h | 53 +++++++++++++++++------------ include/mcc/mcc_movement_controls.h | 28 +++++++-------- include/mcc/mcc_netserver.h | 8 +++-- include/mcc/mcc_netserver_proto.h | 32 +++++++++-------- include/mcc/mcc_serializer.h | 26 +++++++------- include/mcc/mcc_telemetry.h | 6 ++++ 7 files changed, 101 insertions(+), 71 deletions(-) diff --git a/include/mcc/mcc_concepts.h b/include/mcc/mcc_concepts.h index ba4df47..c1f83be 100644 --- a/include/mcc/mcc_concepts.h +++ b/include/mcc/mcc_concepts.h @@ -834,16 +834,19 @@ struct mcc_telemetry_interface_t { }; template -concept mcc_telemetry_c = std::derived_from> && requires(T t) { - // error type - requires mcc_error_c; +concept mcc_telemetry_c = + std::derived_from> && requires(T t, const T t_const) { + // error type + requires mcc_error_c; - // telemetry data type definition - requires mcc_telemetry_data_c; + // telemetry data type definition + requires mcc_telemetry_data_c; - // get telemetry data - { t.telemetryData(std::declval()) } -> std::same_as; -}; + // get telemetry data + { t.telemetryData(std::declval()) } -> std::same_as; + + { t_const.getPointingTarget() } -> mcc_skypoint_c; + }; diff --git a/include/mcc/mcc_deserializer.h b/include/mcc/mcc_deserializer.h index c372c7e..e556af4 100644 --- a/include/mcc/mcc_deserializer.h +++ b/include/mcc/mcc_deserializer.h @@ -279,14 +279,18 @@ struct MccDeserializer : MccDeserializerBase { { auto pars = params; - // valid format: XY[TIME-POINTPAIR-KIND] - // XY (assumed RADEC_ICRS and J2000.0 epoch) + // valid format: XY[TIME-POINTPAIR-KIND] + // XY (assumed RADEC_ICRS and J2000.0 epoch) + + // valid format: XYPAIRKINDEPOCH + // XYPAIRKIND (assumed epoch is NOW, or J2000.0 if PAIRKIND == RADEC-ICRS) + // XY (assumed RADEC-ICRS and J2000.0 epoch) bool empty; auto elems = MccDeserializerBase::splitValueIntoElements(input, params, empty); - if (empty || (elems.size() < 2) || (elems.size() == 3)) { + if (empty || (elems.size() < 2)) { return MccDeserializerErrorCode::ERROR_INVALID_SERIALIZED_VALUE; } @@ -298,20 +302,30 @@ struct MccDeserializer : MccDeserializerBase { typename MccDeserializer::error_t dsr_err; - if (elems.size() > 3) { // full format + if (elems.size() > 2) { // no epoch // deserialize pair kind string - pair_kind = MccCoordStrToPairKind(elems[3]); + pair_kind = MccCoordStrToPairKind(elems[2]); if (pair_kind == MccCoordPairKind::COORDS_KIND_UNKNOWN) { return MccDeserializerErrorCode::ERROR_INVALID_SERIALIZED_VALUE; } - // epoch - bool ok = epoch.fromCharRange(elems[2]); - if (!ok) { - return MccDeserializerErrorCode::ERROR_INVALID_SERIALIZED_VALUE; + if (pair_kind != MccCoordPairKind::COORDS_KIND_RADEC_ICRS) { + epoch = MccCelestialCoordEpoch::now(); } } + if (elems.size() > 3) { // full format + // epoch + if (pair_kind != MccCoordPairKind::COORDS_KIND_RADEC_ICRS) { // ignore epoch if PAIRKIND == RADEC-ICRS + bool ok = epoch.fromCharRange(elems[3]); + if (!ok) { + return MccDeserializerErrorCode::ERROR_INVALID_SERIALIZED_VALUE; + } + } + } + + + // deserialize X and Y if (params.coordpair_format == MccSerializedCoordPairFormat::MCC_SERIALIZED_FORMAT_SXGM_HOURDEG) { pars.angle_format = MccSerializedAngleFormat::MCC_SERIALIZED_FORMAT_SXGM_HOURS; @@ -375,10 +389,9 @@ struct MccDeserializer : MccDeserializerBase { static constexpr std::string_view deserializerName{"MCC-COORDPAIR-DESERIALIZER"}; template - error_t operator ()( - traits::mcc_input_char_range auto const& input, - MccCoordPairKind& value, - ParamsT const& params = mcc_serialization_params_t{}) + error_t operator()(traits::mcc_input_char_range auto const& input, + MccCoordPairKind& value, + ParamsT const& params = mcc_serialization_params_t{}) { value = MccCoordStrToPairKind(input); @@ -396,10 +409,9 @@ struct MccDeserializer : MccDeserializerBase { static constexpr std::string_view deserializerName{"MCC-ANGLE-FORMAT-PREC-DESERIALIZER"}; template - error_t operator ()( - traits::mcc_input_char_range auto const& input, - MccSerializedAngleFormatPrec& value, - ParamsT const& params = mcc_serialization_params_t{}) + error_t operator()(traits::mcc_input_char_range auto const& input, + MccSerializedAngleFormatPrec& value, + ParamsT const& params = mcc_serialization_params_t{}) { // valid format: hour_prec[deg_precdecimals] @@ -433,10 +445,9 @@ struct MccDeserializer : MccDeserializerBase { static constexpr std::string_view deserializerName{"MCC-COORDPAIR-FORMAT-DESERIALIZER"}; template - error_t operator ()( - traits::mcc_input_char_range auto const& input, - MccSerializedCoordPairFormat& value, - ParamsT const& params = mcc_serialization_params_t{}) + error_t operator()(traits::mcc_input_char_range auto const& input, + MccSerializedCoordPairFormat& value, + ParamsT const& params = mcc_serialization_params_t{}) { value = MccSerializedCoordPairFormatStrToValue(input); diff --git a/include/mcc/mcc_movement_controls.h b/include/mcc/mcc_movement_controls.h index 14f945b..996af43 100644 --- a/include/mcc/mcc_movement_controls.h +++ b/include/mcc/mcc_movement_controls.h @@ -672,21 +672,21 @@ public: if (slew_and_stop) { // just wait until the mount stops if (tdata.hwState.movementState == HARDWARE_T::hardware_movement_state_t::HW_MOVE_STOPPED) { - if (std::get<2>(dist) > _currentParams.slewToleranceRadius) { - // resend new position since target coordinates are changed in time - hw_state.movementState = HARDWARE_T::hardware_movement_state_t::HW_MOVE_SLEWING; - hw_state.XY.setX(tdata.targetXY.x()); - hw_state.XY.setY(tdata.targetXY.y()); - hw_state.XY.setEpoch(ep_t::now()); + // if (std::get<2>(dist) > _currentParams.slewToleranceRadius) { + // // resend new position since target coordinates are changed in time + // hw_state.movementState = HARDWARE_T::hardware_movement_state_t::HW_MOVE_SLEWING; + // hw_state.XY.setX(tdata.targetXY.x()); + // hw_state.XY.setY(tdata.targetXY.y()); + // hw_state.XY.setEpoch(ep_t::now()); - *_lastError = send_to_hardware(hw_state); - if (_lastError->load()) { - break; - } - } else { - logger->logInfo("mount movement state is STOPPED! Exit from slewing process!"); - break; - } + // *_lastError = send_to_hardware(hw_state); + // if (_lastError->load()) { + // break; + // } + // } else { + logger->logInfo("mount movement state is STOPPED! Exit from slewing process!"); + break; + // } } } else { if (last_hw_time == tdata.hwState.XY.epoch().UTC()) { diff --git a/include/mcc/mcc_netserver.h b/include/mcc/mcc_netserver.h index f00a7f5..83a7a49 100644 --- a/include/mcc/mcc_netserver.h +++ b/include/mcc/mcc_netserver.h @@ -1111,7 +1111,7 @@ protected: impl::MccCoordPairKind pair_kind = impl::MccCoordPairKind::COORDS_KIND_UNKNOWN; impl::MccSkyPoint sp; - if (input_msg.paramSize()) { // ccordinate pair kind is given + if (input_msg.paramSize()) { // cordinate pair kind is given auto vp = input_msg.template paramValue(0); if (vp) { // coordinate pair kind is given pair_kind = vp.value(); @@ -1128,6 +1128,10 @@ protected: } } + } else if (input_msg.withKey(MCC_COMMPROTO_KEYWORD_ENTEREDTAG_STR)) { + output_msg.construct(MCC_COMMPROTO_KEYWORD_SERVER_ACK_STR, MCC_COMMPROTO_KEYWORD_ENTEREDTAG_STR, + _coordFormat, _coordPrec, mount_ptr->getPointingTarget()); + } else if (input_msg.withKey(MCC_COMMPROTO_KEYWORD_TELEMETRY_STR)) { typename MountT::telemetry_data_t tdata; @@ -1240,7 +1244,7 @@ protected: case impl::MccCoordPairKind::COORDS_KIND_XY: // interpretated as encoder coordinates case impl::MccCoordPairKind::COORDS_KIND_GENERIC: { // interpretated as encoder coordinates if (target) { - // WARNING: STILL NOT IMPLEMENTED!!! + sp.from(tdata.targetXY); } else { sp.from(tdata.hwState.XY); } diff --git a/include/mcc/mcc_netserver_proto.h b/include/mcc/mcc_netserver_proto.h index f2709cd..49ed216 100644 --- a/include/mcc/mcc_netserver_proto.h +++ b/include/mcc/mcc_netserver_proto.h @@ -146,6 +146,10 @@ static constexpr std::string_view MCC_COMMPROTO_KEYWORD_TARGET_STR = "TARGET"; static constexpr std::string_view MCC_COMMPROTO_KEYWORD_MOUNT_STR = "MOUNT"; +// get entered target coordinates: +static constexpr std::string_view MCC_COMMPROTO_KEYWORD_ENTEREDTAG_STR = "ENTEREDTAG"; + + static constexpr std::string_view MCC_COMMPROTO_KEYWORD_TELEMETRY_STR = "TELEMETRY"; // init mount @@ -173,18 +177,18 @@ static constexpr std::string_view MCC_COMMPROTO_KEYWORD_TRACK_STR = "TRACK"; static constexpr std::string_view MCC_COMMPROTO_KEYWORD_STATUS_STR = "STATUS"; // valid keywords -static constexpr std::array MCC_COMMPROTO_VALID_KEYS = { - MCC_COMMPROTO_KEYWORD_SERVER_ACK_STR, MCC_COMMPROTO_KEYWORD_SERVER_ERROR_STR, MCC_COMMPROTO_KEYWORD_COORDFMT_STR, - MCC_COMMPROTO_KEYWORD_COORDPREC_STR, MCC_COMMPROTO_KEYWORD_TARGET_STR, MCC_COMMPROTO_KEYWORD_MOUNT_STR, - MCC_COMMPROTO_KEYWORD_TELEMETRY_STR, MCC_COMMPROTO_KEYWORD_INIT_STR, MCC_COMMPROTO_KEYWORD_STOP_STR, - MCC_COMMPROTO_KEYWORD_SLEW_STR, MCC_COMMPROTO_KEYWORD_MOVE_STR, MCC_COMMPROTO_KEYWORD_TRACK_STR, - MCC_COMMPROTO_KEYWORD_STATUS_STR}; +// static constexpr std::array MCC_COMMPROTO_VALID_KEYS = { +// MCC_COMMPROTO_KEYWORD_SERVER_ACK_STR, MCC_COMMPROTO_KEYWORD_SERVER_ERROR_STR, MCC_COMMPROTO_KEYWORD_COORDFMT_STR, +// MCC_COMMPROTO_KEYWORD_COORDPREC_STR, MCC_COMMPROTO_KEYWORD_TARGET_STR, MCC_COMMPROTO_KEYWORD_MOUNT_STR, +// MCC_COMMPROTO_KEYWORD_ENTEREDTAG_STR, MCC_COMMPROTO_KEYWORD_TELEMETRY_STR, MCC_COMMPROTO_KEYWORD_INIT_STR, +// MCC_COMMPROTO_KEYWORD_STOP_STR, MCC_COMMPROTO_KEYWORD_SLEW_STR, MCC_COMMPROTO_KEYWORD_MOVE_STR, +// MCC_COMMPROTO_KEYWORD_TRACK_STR, MCC_COMMPROTO_KEYWORD_STATUS_STR}; -// hashes of valid keywords -static constexpr std::array MCC_COMMPROTO_VALID_KEYS_HASH = [](std::index_sequence) { - return std::array{mcc::utils::FNV1aHash(MCC_COMMPROTO_VALID_KEYS[Is])...}; -}(std::make_index_sequence()); +// // hashes of valid keywords +// static constexpr std::array MCC_COMMPROTO_VALID_KEYS_HASH = [](std::index_sequence) { +// return std::array{mcc::utils::FNV1aHash(MCC_COMMPROTO_VALID_KEYS[Is])...}; +// }(std::make_index_sequence()); @@ -213,10 +217,10 @@ struct MccNetMessageValidKeywords { MCC_COMMPROTO_KEYWORD_SERVER_ACK_STR, MCC_COMMPROTO_KEYWORD_SERVER_ERROR_STR, MCC_COMMPROTO_KEYWORD_COORDFMT_STR, MCC_COMMPROTO_KEYWORD_COORDPREC_STR, MCC_COMMPROTO_KEYWORD_TARGET_STR, MCC_COMMPROTO_KEYWORD_MOUNT_STR, - MCC_COMMPROTO_KEYWORD_TELEMETRY_STR, MCC_COMMPROTO_KEYWORD_INIT_STR, - MCC_COMMPROTO_KEYWORD_STOP_STR, MCC_COMMPROTO_KEYWORD_SLEW_STR, - MCC_COMMPROTO_KEYWORD_MOVE_STR, MCC_COMMPROTO_KEYWORD_TRACK_STR, - MCC_COMMPROTO_KEYWORD_STATUS_STR}; + MCC_COMMPROTO_KEYWORD_ENTEREDTAG_STR, MCC_COMMPROTO_KEYWORD_TELEMETRY_STR, + MCC_COMMPROTO_KEYWORD_INIT_STR, MCC_COMMPROTO_KEYWORD_STOP_STR, + MCC_COMMPROTO_KEYWORD_SLEW_STR, MCC_COMMPROTO_KEYWORD_MOVE_STR, + MCC_COMMPROTO_KEYWORD_TRACK_STR, MCC_COMMPROTO_KEYWORD_STATUS_STR}; // hashes of valid keywords diff --git a/include/mcc/mcc_serializer.h b/include/mcc/mcc_serializer.h index 71d321f..3bd3640 100644 --- a/include/mcc/mcc_serializer.h +++ b/include/mcc/mcc_serializer.h @@ -115,8 +115,10 @@ protected: PAIRKIND == MccCoordPairKind::COORDS_KIND_XY || PAIRKIND == MccCoordPairKind::COORDS_KIND_GENERIC) { // azimuth is in degrees pars.angle_format = MccSerializedAngleFormat::MCC_SERIALIZED_FORMAT_SXGM_DEGS; + pars.norm_sxgm = true; } else { // RA or HA pars.angle_format = MccSerializedAngleFormat::MCC_SERIALIZED_FORMAT_SXGM_HOURS; + pars.norm_sxgm = true; } } else { // !!!!!!!!!!!!!!!!!! @@ -348,10 +350,10 @@ struct MccSerializer : MccSerializerBase { VT const& value, ParamsT const& params = mcc_serialization_params_t{}) { + // format: XYPAIRKINDEPOCH + auto pars = params; - // pars.norm_sxgm = true; - // pars.coordpair_format = MccSerializedCoordPairFormat::MCC_SERIALIZED_FORMAT_SXGM_HOURDEG; // X-coordinate MccSerializerBase::angleFormatFromCoordPairType(pars); @@ -363,7 +365,7 @@ struct MccSerializer : MccSerializerBase { MccSerializerBase::addElemDelimiter(output, params); - pars.norm_sxgm = false; // do not normalize co-latitude angle + // pars.norm_sxgm = false; // do not normalize co-latitude angle // Y-coordinate MccSerializerBase::angleFormatFromCoordPairType(pars); @@ -375,6 +377,14 @@ struct MccSerializer : MccSerializerBase { MccSerializerBase::addElemDelimiter(output, params); + // pair kind + auto pk_err = MccSerializer{}(output, MccCoordPairKindToStr(VT::pairKind), params); + if (pk_err) { + return mcc_deduced_err(pk_err, MccSerializerErrorCode::ERROR_UNDERLYING_SERIALIZER); + } + + MccSerializerBase::addElemDelimiter(output, params); + // epoch auto ep = value.epoch(); auto ep_err = MccSerializer{}(output, ep, params); @@ -383,14 +393,6 @@ struct MccSerializer : MccSerializerBase { } - MccSerializerBase::addElemDelimiter(output, params); - - // pair kind - auto pk_err = MccSerializer{}(output, MccCoordPairKindToStr(VT::pairKind), params); - if (pk_err) { - return mcc_deduced_err(pk_err, MccSerializerErrorCode::ERROR_UNDERLYING_SERIALIZER); - } - return MccSerializerErrorCode::ERROR_OK; } }; @@ -406,7 +408,7 @@ struct MccSerializer : MccSerializerBase { ParamsT const& params = mcc_serialization_params_t{}) { auto serialize_cpair = [&](T& cp) -> error_t { - auto ccte_err = value.to(cp); + auto ccte_err = value.toAtSameEpoch(cp); if (ccte_err) { return mcc_deduced_err(ccte_err, MccSerializerErrorCode::ERROR_COORD_TRANSFORM); } diff --git a/include/mcc/mcc_telemetry.h b/include/mcc/mcc_telemetry.h index 6684b82..badb119 100644 --- a/include/mcc/mcc_telemetry.h +++ b/include/mcc/mcc_telemetry.h @@ -324,6 +324,12 @@ public: } + auto getPointingTarget() const + { + return _enteredTargetPos; + } + + error_t getPointingTarget(mcc_skypoint_c auto* sp) { sp = _enteredTargetPos;