From d8fae31406b4dc5e5807c74770f9ac88f54022dd Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Thu, 25 Sep 2025 17:12:12 +0300 Subject: [PATCH] ... --- mcc/mcc_netserver_proto.h | 46 ++++++++++++++++++++++++++++++++++++--- mcc/tests/ccte_test.cpp | 18 +++++++++++++++ 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/mcc/mcc_netserver_proto.h b/mcc/mcc_netserver_proto.h index 6631b34..d80ca55 100644 --- a/mcc/mcc_netserver_proto.h +++ b/mcc/mcc_netserver_proto.h @@ -5,6 +5,7 @@ /* BASIC NETWORK PROTOCOL DEFINITIONS */ + #include #include #include "mcc_angle.h" @@ -15,14 +16,26 @@ namespace mcc::network { /* + * The network protocol is the ASCII-based, case-sensitive textual protocol. + * The "client-server" communication is performed through messages. + * The message is a minimal unit of this communication. + * The model of network communication is a simple "client-server" one, i.e., + * client asks - server responds. + * * network communication message format: - * [[]param1[param-param-delim][param2]...] + * [[][][]...] + * + * where + * - mandatory message keyword (one or more ASCII symbols) + * + * * e.g. * "TARGET 12:23:45.56 00:32:21.978\n" */ -/* message */ +/* low-level network message format definitions */ + static constexpr std::string_view MCC_COMMPROTO_STOP_SEQ = "\n"; static constexpr std::string_view MCC_COMMPROTO_KEYPARAM_DELIM_SEQ = " "; static constexpr std::string_view MCC_COMMPROTO_PARAMPARAM_DELIM_SEQ = " "; @@ -60,6 +73,10 @@ static constexpr std::string_view MCC_COMMPROTO_COORD_KIND_XY = "XY"; template static constexpr MccCoordPairKind mcc_str2pairkind(R&& spair) { + if constexpr (std::is_pointer_v>) { + return mcc_str2pairkind(std::string_view{spair}); + } + const auto hash = mcc::utils::FNV1aHash(std::forward(spair)); return hash == mcc::utils::FNV1aHash(MCC_COMMPROTO_COORD_KIND_RADEC_ICRS) ? MccCoordPairKind::COORDS_KIND_RADEC_ICRS @@ -71,6 +88,12 @@ static constexpr MccCoordPairKind mcc_str2pairkind(R&& spair) : MccCoordPairKind::COORDS_KIND_GENERIC; } +// static constexpr MccCoordPairKind mcc_str2pairkind(const char* spair) +// { +// return mcc_str2pairkind(std::string_view{spair}); +// } + + static constexpr std::string_view mcc_pairkind2str(MccCoordPairKind kind) { return kind == MccCoordPairKind::COORDS_KIND_RADEC_ICRS ? MCC_COMMPROTO_COORD_KIND_RADEC_ICRS @@ -162,6 +185,7 @@ static constexpr std::string_view MCC_COMMPROTO_KEYWORD_TARGET_STR = "TARGET"; // "MOUNT AZAL\n" -> "ERROR INVPAR\n" (invalid parameter of coordinates pair kind) // "MOUNT\n" -> "ACK MOUNT 1.2332325 54.23321312 AZZD\n" for alt-azimuthal mount // "MOUNT\n" -> "ACK MOUNT 1.2332325 54.23321312 HADEC\n" for equathorial mount + static constexpr std::string_view MCC_COMMPROTO_KEYWORD_MOUNT_STR = "MOUNT"; @@ -187,12 +211,17 @@ static constexpr std::string_view MCC_COMMPROTO_KEYWORD_MOVE_STR = "MOVE"; // "TRACK\n" static constexpr std::string_view MCC_COMMPROTO_KEYWORD_TRACK_STR = "TRACK"; +// get mount status +// "STATUS\n" +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_SLEW_STR, MCC_COMMPROTO_KEYWORD_MOVE_STR, MCC_COMMPROTO_KEYWORD_TRACK_STR, + MCC_COMMPROTO_KEYWORD_STATUS_STR}; // hashes valid keywords @@ -350,7 +379,18 @@ bool mcc_netmsg_get_cpoint(mcc_netmsg_parse_result_c auto const& parse_res, return false; } + if (kind != mcc::MccCoordPairKind::COORDS_KIND_RADEC_ICRS) { + mcc_tp2tp(std::chrono::system_clock::now(), cpoint.time_point); + } else { + // J2000.0: 11:58:55.816 1 January 2000 UTC + auto tp = std::chrono::sys_days(std::chrono::year_month_day(std::chrono::January / std::chrono::day(1) / + std::chrono::year(2000))) + + std::chrono::hours(11) + std::chrono::minutes(58) + std::chrono::milliseconds(55816); + mcc_tp2tp(tp, cpoint.time_point); + } + cpoint.pair_kind = kind; + cpoint.X = MccAngle(ang1.value(), mcc::MccDegreeTag{}); // to radians cpoint.Y = MccAngle(ang2.value(), mcc::MccDegreeTag{}); // to radians diff --git a/mcc/tests/ccte_test.cpp b/mcc/tests/ccte_test.cpp index 492998d..522fb30 100644 --- a/mcc/tests/ccte_test.cpp +++ b/mcc/tests/ccte_test.cpp @@ -197,5 +197,23 @@ int main() std::cout << "\nNETMSG: [" << sm << "] (" << mr << ")\n"; + auto tp = std::chrono::sys_days( + std::chrono::year_month_day(std::chrono::January / std::chrono::day(1) / std::chrono::year(2000))) + // + std::chrono::hours(11) + std::chrono::minutes(58) + std::chrono::duration(55.816); + + std::chrono::hours(11) + std::chrono::minutes(58) + std::chrono::milliseconds(55816); + + std::cout << tp << "\n"; + // std::cout << std::chrono::system_clock::now() << "\n"; + + + constexpr std::string_view stv{"RADEC"}; + constexpr char ccv[] = "RADEC"; + + // const auto pk = mcc::network::mcc_str2pairkind(stv); + // const auto pk = mcc::network::mcc_str2pairkind(std::string_view{"RADEC"}); + // const auto pk = mcc::network::mcc_str2pairkind("RADEC"); + const auto pk = mcc::network::mcc_str2pairkind(ccv); + static_assert(pk == mcc::MccCoordPairKind::COORDS_KIND_RADEC_APP); + return 0; }