This commit is contained in:
2026-02-20 12:08:21 +03:00
parent 099c6056d7
commit e6004a6c8a
7 changed files with 101 additions and 71 deletions

View File

@@ -834,16 +834,19 @@ struct mcc_telemetry_interface_t {
}; };
template <typename T> template <typename T>
concept mcc_telemetry_c = std::derived_from<T, mcc_telemetry_interface_t<typename T::error_t>> && requires(T t) { concept mcc_telemetry_c =
// error type std::derived_from<T, mcc_telemetry_interface_t<typename T::error_t>> && requires(T t, const T t_const) {
requires mcc_error_c<typename T::error_t>; // error type
requires mcc_error_c<typename T::error_t>;
// telemetry data type definition // telemetry data type definition
requires mcc_telemetry_data_c<typename T::telemetry_data_t>; requires mcc_telemetry_data_c<typename T::telemetry_data_t>;
// get telemetry data // get telemetry data
{ t.telemetryData(std::declval<typename T::telemetry_data_t*>()) } -> std::same_as<typename T::error_t>; { t.telemetryData(std::declval<typename T::telemetry_data_t*>()) } -> std::same_as<typename T::error_t>;
};
{ t_const.getPointingTarget() } -> mcc_skypoint_c;
};

View File

@@ -279,14 +279,18 @@ struct MccDeserializer<VT> : MccDeserializerBase {
{ {
auto pars = params; auto pars = params;
// valid format: X<elem-delim>Y[<elem-delim>TIME-POINT<elem-delim>PAIR-KIND] // valid format: X<elem-delim>Y[<elem-delim>TIME-POINT<elem-delim>PAIR-KIND]
// X<elem-delim>Y (assumed RADEC_ICRS and J2000.0 epoch) // X<elem-delim>Y (assumed RADEC_ICRS and J2000.0 epoch)
// valid format: X<elem-delim>Y<elem-delim>PAIRKIND<elem-delim>EPOCH
// X<elem-delim>Y<elem-delim>PAIRKIND (assumed epoch is NOW, or J2000.0 if PAIRKIND == RADEC-ICRS)
// X<elem-delim>Y (assumed RADEC-ICRS and J2000.0 epoch)
bool empty; bool empty;
auto elems = MccDeserializerBase::splitValueIntoElements(input, params, 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; return MccDeserializerErrorCode::ERROR_INVALID_SERIALIZED_VALUE;
} }
@@ -298,20 +302,30 @@ struct MccDeserializer<VT> : MccDeserializerBase {
typename MccDeserializer<MccAngle>::error_t dsr_err; typename MccDeserializer<MccAngle>::error_t dsr_err;
if (elems.size() > 3) { // full format if (elems.size() > 2) { // no epoch
// deserialize pair kind string // deserialize pair kind string
pair_kind = MccCoordStrToPairKind(elems[3]); pair_kind = MccCoordStrToPairKind(elems[2]);
if (pair_kind == MccCoordPairKind::COORDS_KIND_UNKNOWN) { if (pair_kind == MccCoordPairKind::COORDS_KIND_UNKNOWN) {
return MccDeserializerErrorCode::ERROR_INVALID_SERIALIZED_VALUE; return MccDeserializerErrorCode::ERROR_INVALID_SERIALIZED_VALUE;
} }
// epoch if (pair_kind != MccCoordPairKind::COORDS_KIND_RADEC_ICRS) {
bool ok = epoch.fromCharRange(elems[2]); epoch = MccCelestialCoordEpoch::now();
if (!ok) {
return MccDeserializerErrorCode::ERROR_INVALID_SERIALIZED_VALUE;
} }
} }
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 // deserialize X and Y
if (params.coordpair_format == MccSerializedCoordPairFormat::MCC_SERIALIZED_FORMAT_SXGM_HOURDEG) { if (params.coordpair_format == MccSerializedCoordPairFormat::MCC_SERIALIZED_FORMAT_SXGM_HOURDEG) {
pars.angle_format = MccSerializedAngleFormat::MCC_SERIALIZED_FORMAT_SXGM_HOURS; pars.angle_format = MccSerializedAngleFormat::MCC_SERIALIZED_FORMAT_SXGM_HOURS;
@@ -375,10 +389,9 @@ struct MccDeserializer<MccCoordPairKind> : MccDeserializerBase {
static constexpr std::string_view deserializerName{"MCC-COORDPAIR-DESERIALIZER"}; static constexpr std::string_view deserializerName{"MCC-COORDPAIR-DESERIALIZER"};
template <mcc_serialization_params_c ParamsT = mcc_serialization_params_t> template <mcc_serialization_params_c ParamsT = mcc_serialization_params_t>
error_t operator ()( error_t operator()(traits::mcc_input_char_range auto const& input,
traits::mcc_input_char_range auto const& input, MccCoordPairKind& value,
MccCoordPairKind& value, ParamsT const& params = mcc_serialization_params_t{})
ParamsT const& params = mcc_serialization_params_t{})
{ {
value = MccCoordStrToPairKind(input); value = MccCoordStrToPairKind(input);
@@ -396,10 +409,9 @@ struct MccDeserializer<MccSerializedAngleFormatPrec> : MccDeserializerBase {
static constexpr std::string_view deserializerName{"MCC-ANGLE-FORMAT-PREC-DESERIALIZER"}; static constexpr std::string_view deserializerName{"MCC-ANGLE-FORMAT-PREC-DESERIALIZER"};
template <mcc_serialization_params_c ParamsT = mcc_serialization_params_t> template <mcc_serialization_params_c ParamsT = mcc_serialization_params_t>
error_t operator ()( error_t operator()(traits::mcc_input_char_range auto const& input,
traits::mcc_input_char_range auto const& input, MccSerializedAngleFormatPrec& value,
MccSerializedAngleFormatPrec& value, ParamsT const& params = mcc_serialization_params_t{})
ParamsT const& params = mcc_serialization_params_t{})
{ {
// valid format: hour_prec[<params.elem_delim>deg_prec<params.elem_delim>decimals] // valid format: hour_prec[<params.elem_delim>deg_prec<params.elem_delim>decimals]
@@ -433,10 +445,9 @@ struct MccDeserializer<MccSerializedCoordPairFormat> : MccDeserializerBase {
static constexpr std::string_view deserializerName{"MCC-COORDPAIR-FORMAT-DESERIALIZER"}; static constexpr std::string_view deserializerName{"MCC-COORDPAIR-FORMAT-DESERIALIZER"};
template <mcc_serialization_params_c ParamsT = mcc_serialization_params_t> template <mcc_serialization_params_c ParamsT = mcc_serialization_params_t>
error_t operator ()( error_t operator()(traits::mcc_input_char_range auto const& input,
traits::mcc_input_char_range auto const& input, MccSerializedCoordPairFormat& value,
MccSerializedCoordPairFormat& value, ParamsT const& params = mcc_serialization_params_t{})
ParamsT const& params = mcc_serialization_params_t{})
{ {
value = MccSerializedCoordPairFormatStrToValue(input); value = MccSerializedCoordPairFormatStrToValue(input);

View File

@@ -672,21 +672,21 @@ public:
if (slew_and_stop) { // just wait until the mount stops if (slew_and_stop) { // just wait until the mount stops
if (tdata.hwState.movementState == HARDWARE_T::hardware_movement_state_t::HW_MOVE_STOPPED) { if (tdata.hwState.movementState == HARDWARE_T::hardware_movement_state_t::HW_MOVE_STOPPED) {
if (std::get<2>(dist) > _currentParams.slewToleranceRadius) { // if (std::get<2>(dist) > _currentParams.slewToleranceRadius) {
// resend new position since target coordinates are changed in time // // resend new position since target coordinates are changed in time
hw_state.movementState = HARDWARE_T::hardware_movement_state_t::HW_MOVE_SLEWING; // hw_state.movementState = HARDWARE_T::hardware_movement_state_t::HW_MOVE_SLEWING;
hw_state.XY.setX(tdata.targetXY.x()); // hw_state.XY.setX(tdata.targetXY.x());
hw_state.XY.setY(tdata.targetXY.y()); // hw_state.XY.setY(tdata.targetXY.y());
hw_state.XY.setEpoch(ep_t::now()); // hw_state.XY.setEpoch(ep_t::now());
*_lastError = send_to_hardware(hw_state); // *_lastError = send_to_hardware(hw_state);
if (_lastError->load()) { // if (_lastError->load()) {
break; // break;
} // }
} else { // } else {
logger->logInfo("mount movement state is STOPPED! Exit from slewing process!"); logger->logInfo("mount movement state is STOPPED! Exit from slewing process!");
break; break;
} // }
} }
} else { } else {
if (last_hw_time == tdata.hwState.XY.epoch().UTC()) { if (last_hw_time == tdata.hwState.XY.epoch().UTC()) {

View File

@@ -1111,7 +1111,7 @@ protected:
impl::MccCoordPairKind pair_kind = impl::MccCoordPairKind::COORDS_KIND_UNKNOWN; impl::MccCoordPairKind pair_kind = impl::MccCoordPairKind::COORDS_KIND_UNKNOWN;
impl::MccSkyPoint sp; 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<impl::MccCoordPairKind>(0); auto vp = input_msg.template paramValue<impl::MccCoordPairKind>(0);
if (vp) { // coordinate pair kind is given if (vp) { // coordinate pair kind is given
pair_kind = vp.value(); 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)) { } else if (input_msg.withKey(MCC_COMMPROTO_KEYWORD_TELEMETRY_STR)) {
typename MountT::telemetry_data_t tdata; 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_XY: // interpretated as encoder coordinates
case impl::MccCoordPairKind::COORDS_KIND_GENERIC: { // interpretated as encoder coordinates case impl::MccCoordPairKind::COORDS_KIND_GENERIC: { // interpretated as encoder coordinates
if (target) { if (target) {
// WARNING: STILL NOT IMPLEMENTED!!! sp.from(tdata.targetXY);
} else { } else {
sp.from(tdata.hwState.XY); sp.from(tdata.hwState.XY);
} }

View File

@@ -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"; 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"; static constexpr std::string_view MCC_COMMPROTO_KEYWORD_TELEMETRY_STR = "TELEMETRY";
// init mount // 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"; static constexpr std::string_view MCC_COMMPROTO_KEYWORD_STATUS_STR = "STATUS";
// valid keywords // valid keywords
static constexpr std::array MCC_COMMPROTO_VALID_KEYS = { // 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_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_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_ENTEREDTAG_STR, MCC_COMMPROTO_KEYWORD_TELEMETRY_STR, MCC_COMMPROTO_KEYWORD_INIT_STR,
MCC_COMMPROTO_KEYWORD_SLEW_STR, MCC_COMMPROTO_KEYWORD_MOVE_STR, MCC_COMMPROTO_KEYWORD_TRACK_STR, // MCC_COMMPROTO_KEYWORD_STOP_STR, MCC_COMMPROTO_KEYWORD_SLEW_STR, MCC_COMMPROTO_KEYWORD_MOVE_STR,
MCC_COMMPROTO_KEYWORD_STATUS_STR}; // MCC_COMMPROTO_KEYWORD_TRACK_STR, MCC_COMMPROTO_KEYWORD_STATUS_STR};
// hashes of valid keywords // // hashes of valid keywords
static constexpr std::array MCC_COMMPROTO_VALID_KEYS_HASH = []<size_t... Is>(std::index_sequence<Is...>) { // static constexpr std::array MCC_COMMPROTO_VALID_KEYS_HASH = []<size_t... Is>(std::index_sequence<Is...>) {
return std::array{mcc::utils::FNV1aHash(MCC_COMMPROTO_VALID_KEYS[Is])...}; // return std::array{mcc::utils::FNV1aHash(MCC_COMMPROTO_VALID_KEYS[Is])...};
}(std::make_index_sequence<MCC_COMMPROTO_VALID_KEYS.size()>()); // }(std::make_index_sequence<MCC_COMMPROTO_VALID_KEYS.size()>());
@@ -213,10 +217,10 @@ struct MccNetMessageValidKeywords {
MCC_COMMPROTO_KEYWORD_SERVER_ACK_STR, MCC_COMMPROTO_KEYWORD_SERVER_ERROR_STR, 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_COORDFMT_STR, MCC_COMMPROTO_KEYWORD_COORDPREC_STR,
MCC_COMMPROTO_KEYWORD_TARGET_STR, MCC_COMMPROTO_KEYWORD_MOUNT_STR, MCC_COMMPROTO_KEYWORD_TARGET_STR, MCC_COMMPROTO_KEYWORD_MOUNT_STR,
MCC_COMMPROTO_KEYWORD_TELEMETRY_STR, MCC_COMMPROTO_KEYWORD_INIT_STR, MCC_COMMPROTO_KEYWORD_ENTEREDTAG_STR, MCC_COMMPROTO_KEYWORD_TELEMETRY_STR,
MCC_COMMPROTO_KEYWORD_STOP_STR, MCC_COMMPROTO_KEYWORD_SLEW_STR, MCC_COMMPROTO_KEYWORD_INIT_STR, MCC_COMMPROTO_KEYWORD_STOP_STR,
MCC_COMMPROTO_KEYWORD_MOVE_STR, MCC_COMMPROTO_KEYWORD_TRACK_STR, MCC_COMMPROTO_KEYWORD_SLEW_STR, MCC_COMMPROTO_KEYWORD_MOVE_STR,
MCC_COMMPROTO_KEYWORD_STATUS_STR}; MCC_COMMPROTO_KEYWORD_TRACK_STR, MCC_COMMPROTO_KEYWORD_STATUS_STR};
// hashes of valid keywords // hashes of valid keywords

View File

@@ -115,8 +115,10 @@ protected:
PAIRKIND == MccCoordPairKind::COORDS_KIND_XY || PAIRKIND == MccCoordPairKind::COORDS_KIND_XY ||
PAIRKIND == MccCoordPairKind::COORDS_KIND_GENERIC) { // azimuth is in degrees PAIRKIND == MccCoordPairKind::COORDS_KIND_GENERIC) { // azimuth is in degrees
pars.angle_format = MccSerializedAngleFormat::MCC_SERIALIZED_FORMAT_SXGM_DEGS; pars.angle_format = MccSerializedAngleFormat::MCC_SERIALIZED_FORMAT_SXGM_DEGS;
pars.norm_sxgm = true;
} else { // RA or HA } else { // RA or HA
pars.angle_format = MccSerializedAngleFormat::MCC_SERIALIZED_FORMAT_SXGM_HOURS; pars.angle_format = MccSerializedAngleFormat::MCC_SERIALIZED_FORMAT_SXGM_HOURS;
pars.norm_sxgm = true;
} }
} else { } else {
// !!!!!!!!!!!!!!!!!! // !!!!!!!!!!!!!!!!!!
@@ -348,10 +350,10 @@ struct MccSerializer<VT> : MccSerializerBase {
VT const& value, VT const& value,
ParamsT const& params = mcc_serialization_params_t{}) ParamsT const& params = mcc_serialization_params_t{})
{ {
// format: X<elem-delim>Y<elem-delim>PAIRKIND<elem-delim>EPOCH
auto pars = params; auto pars = params;
// pars.norm_sxgm = true;
// pars.coordpair_format = MccSerializedCoordPairFormat::MCC_SERIALIZED_FORMAT_SXGM_HOURDEG;
// X-coordinate // X-coordinate
MccSerializerBase::angleFormatFromCoordPairType<VT::pairKind, MccSerializerBase::CO_LON>(pars); MccSerializerBase::angleFormatFromCoordPairType<VT::pairKind, MccSerializerBase::CO_LON>(pars);
@@ -363,7 +365,7 @@ struct MccSerializer<VT> : MccSerializerBase {
MccSerializerBase::addElemDelimiter(output, params); 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 // Y-coordinate
MccSerializerBase::angleFormatFromCoordPairType<VT::pairKind, MccSerializerBase::CO_LAT>(pars); MccSerializerBase::angleFormatFromCoordPairType<VT::pairKind, MccSerializerBase::CO_LAT>(pars);
@@ -375,6 +377,14 @@ struct MccSerializer<VT> : MccSerializerBase {
MccSerializerBase::addElemDelimiter(output, params); MccSerializerBase::addElemDelimiter(output, params);
// pair kind
auto pk_err = MccSerializer<std::string_view>{}(output, MccCoordPairKindToStr(VT::pairKind), params);
if (pk_err) {
return mcc_deduced_err(pk_err, MccSerializerErrorCode::ERROR_UNDERLYING_SERIALIZER);
}
MccSerializerBase::addElemDelimiter(output, params);
// epoch // epoch
auto ep = value.epoch(); auto ep = value.epoch();
auto ep_err = MccSerializer<decltype(ep)>{}(output, ep, params); auto ep_err = MccSerializer<decltype(ep)>{}(output, ep, params);
@@ -383,14 +393,6 @@ struct MccSerializer<VT> : MccSerializerBase {
} }
MccSerializerBase::addElemDelimiter(output, params);
// pair kind
auto pk_err = MccSerializer<std::string_view>{}(output, MccCoordPairKindToStr(VT::pairKind), params);
if (pk_err) {
return mcc_deduced_err(pk_err, MccSerializerErrorCode::ERROR_UNDERLYING_SERIALIZER);
}
return MccSerializerErrorCode::ERROR_OK; return MccSerializerErrorCode::ERROR_OK;
} }
}; };
@@ -406,7 +408,7 @@ struct MccSerializer<VT> : MccSerializerBase {
ParamsT const& params = mcc_serialization_params_t{}) ParamsT const& params = mcc_serialization_params_t{})
{ {
auto serialize_cpair = [&]<typename T>(T& cp) -> error_t { auto serialize_cpair = [&]<typename T>(T& cp) -> error_t {
auto ccte_err = value.to(cp); auto ccte_err = value.toAtSameEpoch(cp);
if (ccte_err) { if (ccte_err) {
return mcc_deduced_err(ccte_err, MccSerializerErrorCode::ERROR_COORD_TRANSFORM); return mcc_deduced_err(ccte_err, MccSerializerErrorCode::ERROR_COORD_TRANSFORM);
} }

View File

@@ -324,6 +324,12 @@ public:
} }
auto getPointingTarget() const
{
return _enteredTargetPos;
}
error_t getPointingTarget(mcc_skypoint_c auto* sp) error_t getPointingTarget(mcc_skypoint_c auto* sp)
{ {
sp = _enteredTargetPos; sp = _enteredTargetPos;