This commit is contained in:
Timur A. Fatkhullin 2025-09-25 17:12:12 +03:00
parent 4a9ecf8639
commit d8fae31406
2 changed files with 61 additions and 3 deletions

View File

@ -5,6 +5,7 @@
/* BASIC NETWORK PROTOCOL DEFINITIONS */ /* BASIC NETWORK PROTOCOL DEFINITIONS */
#include <algorithm> #include <algorithm>
#include <string_view> #include <string_view>
#include "mcc_angle.h" #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: * network communication message format:
* <keyword>[[<key-param-delim>]param1[param-param-delim][param2]...]<stop-seq> * <keyword>[[<key-param-delim>]<param1>[<param-param-delim>][<param2>]...]<stop-seq>
*
* where
* <keyword> - mandatory message keyword (one or more ASCII symbols)
* <key-param-delim>
*
* e.g. * e.g.
* "TARGET 12:23:45.56 00:32:21.978\n" * "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_STOP_SEQ = "\n";
static constexpr std::string_view MCC_COMMPROTO_KEYPARAM_DELIM_SEQ = " "; static constexpr std::string_view MCC_COMMPROTO_KEYPARAM_DELIM_SEQ = " ";
static constexpr std::string_view MCC_COMMPROTO_PARAMPARAM_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 <mcc::traits::mcc_char_range R> template <mcc::traits::mcc_char_range R>
static constexpr MccCoordPairKind mcc_str2pairkind(R&& spair) static constexpr MccCoordPairKind mcc_str2pairkind(R&& spair)
{ {
if constexpr (std::is_pointer_v<std::decay_t<R>>) {
return mcc_str2pairkind(std::string_view{spair});
}
const auto hash = mcc::utils::FNV1aHash(std::forward<R>(spair)); const auto hash = mcc::utils::FNV1aHash(std::forward<R>(spair));
return hash == mcc::utils::FNV1aHash(MCC_COMMPROTO_COORD_KIND_RADEC_ICRS) ? MccCoordPairKind::COORDS_KIND_RADEC_ICRS 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; : 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) static constexpr std::string_view mcc_pairkind2str(MccCoordPairKind kind)
{ {
return kind == MccCoordPairKind::COORDS_KIND_RADEC_ICRS ? MCC_COMMPROTO_COORD_KIND_RADEC_ICRS 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 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 AZZD\n" for alt-azimuthal mount
// "MOUNT\n" -> "ACK MOUNT 1.2332325 54.23321312 HADEC\n" for equathorial 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"; 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" // "TRACK\n"
static constexpr std::string_view MCC_COMMPROTO_KEYWORD_TRACK_STR = "TRACK"; 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 // 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_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 // hashes valid keywords
@ -350,7 +379,18 @@ bool mcc_netmsg_get_cpoint(mcc_netmsg_parse_result_c auto const& parse_res,
return false; 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.pair_kind = kind;
cpoint.X = MccAngle(ang1.value(), mcc::MccDegreeTag{}); // to radians cpoint.X = MccAngle(ang1.value(), mcc::MccDegreeTag{}); // to radians
cpoint.Y = MccAngle(ang2.value(), mcc::MccDegreeTag{}); // to radians cpoint.Y = MccAngle(ang2.value(), mcc::MccDegreeTag{}); // to radians

View File

@ -197,5 +197,23 @@ int main()
std::cout << "\nNETMSG: [" << sm << "] (" << mr << ")\n"; 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<double>(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; return 0;
} }