mountcontrol/cxx/comm_proto.h
2025-01-21 17:52:19 +03:00

341 lines
21 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#pragma once
/*
* Astrosib BM-700 mount client-to-server communication protocol
* (extended by 10Micron LX200 protocol)
*/
#include <algorithm>
#include <array>
#include <cstddef>
#include <ranges>
#include <string_view>
namespace BM700
{
namespace details
{
// FVN-1a hash function
static constexpr size_t FNV1aHash(const std::string_view& r)
{
static_assert(sizeof(size_t) == 8 || sizeof(size_t) == 4, "ONLY FOR 32 or 64-bit size_t!!!");
size_t hash = 0, prime = 0;
if constexpr (sizeof(size_t) == 8) { // 64-bit
prime = 1099511628211UL;
hash = 14695981039346656037UL;
} else if constexpr (sizeof(size_t) == 4) { // 32-bit
prime = 16777619;
hash = 2166136261;
}
for (const char& ch : r) {
hash ^= ch;
hash *= prime;
}
return hash;
}
} // namespace details
enum PROTO_COMMAND_TYPE : int { PROTO_COMMAND_TYPE_ALIGN, PROTO_COMMAND_TYPE_GETTER, PROTO_COMMAND_TYPE_SETTER };
static constexpr std::string_view PROTO_COMMAND_STR_ACK = "\x06";
static constexpr std::string_view PROTO_COMMAND_STR_TRACK_STOP = "AL";
static constexpr std::string_view PROTO_COMMAND_STR_TRACK_START = "AP";
static constexpr std::string_view PROTO_COMMAND_STR_TEL_ALT = "GA";
static constexpr std::string_view PROTO_COMMAND_STR_TAG_ALT = "Ga";
static constexpr std::string_view PROTO_COMMAND_STR_GET_CURR_DATE = "GC";
static constexpr std::string_view PROTO_COMMAND_STR_GET_TEL_DEC = "GD";
static constexpr std::string_view PROTO_COMMAND_STR_GET_TAG_DEC = "Gd";
static constexpr std::string_view PROTO_COMMAND_STR_GET_CURR_SITE_ELEV = "Gev";
static constexpr std::string_view PROTO_COMMAND_STR_GET_UTC_OFFSET = "GG";
static constexpr std::string_view PROTO_COMMAND_STR_GET_CURR_SITE_LONG = "Gg";
static constexpr std::string_view PROTO_COMMAND_STR_GET_HIGHEST_ALT = "Gh";
static constexpr std::string_view PROTO_COMMAND_STR_GINFO = "Ginfo";
static constexpr std::string_view PROTO_COMMAND_STR_GINQ = "GINQ";
static constexpr std::string_view PROTO_COMMAND_STR_GET_MOUNT_IP_ADDR = "GIP";
static constexpr std::string_view PROTO_COMMAND_STR_MOUNT_WIRELESS_IP_ADDR = "GIPW";
static constexpr std::string_view PROTO_COMMAND_STR_MOUNT_MAC_ADDR = "GMAC";
static constexpr std::string_view PROTO_COMMAND_STR_GET_MOUNT_WIRELESS_MAC_ADDR = "GMACW";
static constexpr std::string_view PROTO_COMMAND_STR_GET_CURR_JULDATE = "GJD";
static constexpr std::string_view PROTO_COMMAND_STR_GET_CURR_JULDATE_EXTPREC = "GJD1";
static constexpr std::string_view PROTO_COMMAND_STR_GET_CURR_JULDATE_EXTPREC_LEAP_SEC = "GJD2";
static constexpr std::string_view PROTO_COMMAND_STR_GET_LOCAL_TIME = "GL";
static constexpr std::string_view PROTO_COMMAND_STR_GET_LOCAL_DATE_TIME = "GLDT";
static constexpr std::string_view PROTO_COMMAND_STR_GET_UTC_DATE_TIME = "GUDT";
static constexpr std::string_view PROTO_COMMAND_STR_GET_UTC_UT1_DIFF = "GDUT";
static constexpr std::string_view PROTO_COMMAND_STR_GET_GPS_UTC_DIFF = "GDGPS";
static constexpr std::string_view PROTO_COMMAND_STR_GET_NEXT_LEAP_SEC = "GULEAP";
static constexpr std::string_view PROTO_COMMAND_STR_GET_MERIDIAN_BEHAV = "GMF";
static constexpr std::string_view PROTO_COMMAND_STR_GET_LOWEST_ALT = "Go";
static constexpr std::string_view PROTO_COMMAND_STR_GET_PA = "GPA";
static constexpr std::string_view PROTO_COMMAND_STR_GET_PA_SPEED = "GPAS";
static constexpr std::string_view PROTO_COMMAND_STR_GET_PA_ZENITH = "GPAZ";
static constexpr std::string_view PROTO_COMMAND_STR_GET_PA_ZENITH_SPEED = "GPASZ";
static constexpr std::string_view PROTO_COMMAND_STR_GET_GUIDING_STATUS = "Gpgc";
static constexpr std::string_view PROTO_COMMAND_STR_GET_TEL_RA = "GR";
static constexpr std::string_view PROTO_COMMAND_STR_GET_TAG_RA = "Gr";
static constexpr std::string_view PROTO_COMMAND_STR_GET_ATM_PRES = "GRPRS";
static constexpr std::string_view PROTO_COMMAND_STR_GET_ATM_TEMP = "GRTMP";
static constexpr std::string_view PROTO_COMMAND_STR_GET_SIDERAL_TIME = "GS";
static constexpr std::string_view PROTO_COMMAND_STR_GET_REFRACT_CORR_STATUS = "GREF";
static constexpr std::string_view PROTO_COMMAND_STR_GET_SPEED_CORR_STATUS = "GSC";
static constexpr std::string_view PROTO_COMMAND_STR_GSTAT = "Gstat";
static constexpr std::string_view PROTO_COMMAND_STR_GET_SETTLE_TIME = "Gstm";
static constexpr std::string_view PROTO_COMMAND_STR_GET_TRACK_MERIDIAN_LIMIT = "Glmt";
static constexpr std::string_view PROTO_COMMAND_STR_GET_SLEW_MERIDIAN_LIMIT = "Glms";
static constexpr std::string_view PROTO_COMMAND_STR_GET_EST_TRACK_TIME = "Gmte";
static constexpr std::string_view PROTO_COMMAND_STR_GET_UNATTEND_FLIP_SETTING = "Guaf";
static constexpr std::string_view PROTO_COMMAND_STR_GET_TRACK_RATE = "GT";
static constexpr std::string_view PROTO_COMMAND_STR_GET_CURR_SITE_LAT = "Gt";
static constexpr std::string_view PROTO_COMMAND_STR_GET_MOUNT_TRACK_STATUS = "GTRK";
static constexpr std::string_view PROTO_COMMAND_STR_GET_TAG_TRACK_STATUS = "GTTRK";
static constexpr std::string_view PROTO_COMMAND_STR_GET_TAG_DEST_SIDE = "GTsid";
static constexpr std::string_view PROTO_COMMAND_STR_GET_FWR_DATE = "GVD";
static constexpr std::string_view PROTO_COMMAND_STR_GET_FWR_NUM = "GVN";
static constexpr std::string_view PROTO_COMMAND_STR_GET_PROD_NAME = "GVP"; // "Asib BM700"?
static constexpr std::string_view PROTO_COMMAND_STR_GET_FWR_TIME = "GVT";
static constexpr std::string_view PROTO_COMMAND_STR_GET_HWR_VERSION = "GVZ";
static constexpr std::string_view PROTO_COMMAND_STR_GET_WOL_CONF = "GWOL";
static constexpr std::string_view PROTO_COMMAND_STR_WLAN_AVAIL = "GWAV"; // always "0#"?
static constexpr std::string_view PROTO_COMMAND_STR_GET_TEL_AZ = "GZ";
static constexpr std::string_view PROTO_COMMAND_STR_GET_TAG_AZ = "Gz";
static constexpr std::string_view PROTO_COMMAND_STR_GET_POINT_STATE = "pS"; // "side of the pier"
static constexpr std::string_view PROTO_COMMAND_STR_GET_EMUL_FWR_REV = "V"; // always returns "G#"
static constexpr std::string_view PROTO_COMMAND_STR_HOME_SEEK_AND_STORE = "hS";
static constexpr std::string_view PROTO_COMMAND_STR_HOME_SEEK_AND_ALIGN = "hF";
static constexpr std::string_view PROTO_COMMAND_STR_SLEW_TO_PARK_hS = "hS";
static constexpr std::string_view PROTO_COMMAND_STR_SLEW_TO_PARK_KA = "KA";
static constexpr std::string_view PROTO_COMMAND_STR_UNPARK = "PO";
static constexpr std::string_view PROTO_COMMAND_STR_QUERY_HOME_STATUS = "h?";
static constexpr std::string_view PROTO_COMMAND_STR_SLEW_TO_AZ = "MA";
static constexpr std::string_view PROTO_COMMAND_STR_MOVE_EAST = "Me";
static constexpr std::string_view PROTO_COMMAND_STR_MOVE_NORTH = "Mn";
static constexpr std::string_view PROTO_COMMAND_STR_MOVE_SOUTH = "Ms";
static constexpr std::string_view PROTO_COMMAND_STR_MOVE_WEST = "Mw";
static constexpr std::string_view PROTO_COMMAND_STR_CORR_EAST = "Mge";
static constexpr std::string_view PROTO_COMMAND_STR_CORR_NORTH = "Mgn";
static constexpr std::string_view PROTO_COMMAND_STR_CORR_SOUTH = "Mgs";
static constexpr std::string_view PROTO_COMMAND_STR_CORR_WEST = "Mgw";
static constexpr std::string_view PROTO_COMMAND_STR_SLEW_TO_TAG = "MS";
static constexpr std::string_view PROTO_COMMAND_STR_SLEW_TO_TAG_SIDE = "MSfs";
static constexpr std::string_view PROTO_COMMAND_STR_SLEW_TO_TAG_DISREG_FINE_MOVE = "MSnf";
static constexpr std::string_view PROTO_COMMAND_STR_SWAP_EAST_WEST = "EW";
static constexpr std::string_view PROTO_COMMAND_STR_SWAP_NORTH_SOUTH = "NS";
static constexpr std::string_view PROTO_COMMAND_STR_HALT_ALL = "Q";
static constexpr std::string_view PROTO_COMMAND_STR_HALT_EASTWARD = "Qe";
static constexpr std::string_view PROTO_COMMAND_STR_HALT_NORTHWARD = "Qn";
static constexpr std::string_view PROTO_COMMAND_STR_HALT_SOUTHWARD = "Qs";
static constexpr std::string_view PROTO_COMMAND_STR_HALT_WESTWARD = "Qw";
static constexpr std::string_view PROTO_COMMAND_STR_FLIP = "FLIP"; // ???????????
static constexpr std::string_view PROTO_COMMAND_STR_SLEW_PROGRESS_STRING = "D";
static constexpr std::string_view PROTO_COMMAND_STR_NUDGE = "NUDGE";
static constexpr std::string_view PROTO_COMMAND_STR_SLEW_TO_CENTERING_RATE = "RC";
static constexpr std::string_view PROTO_COMMAND_STR_SLEW_TO_GUIDING_RATE = "RG";
static constexpr std::string_view PROTO_COMMAND_STR_SLEW_TO_FIND_RATE = "RM";
static constexpr std::string_view PROTO_COMMAND_STR_SLEW_TO_MAX_RATE = "RS";
static constexpr std::string_view PROTO_COMMAND_STR_SET_SLEW_RA_RATE = "RA";
static constexpr std::string_view PROTO_COMMAND_STR_SET_SLEW_DEC_RATE = "RE";
static constexpr std::string_view PROTO_COMMAND_STR_SET_GUIDING_RATE = "Rg";
static constexpr std::string_view PROTO_COMMAND_STR_SET_CENTERING_RATE = "Rc";
static constexpr std::string_view PROTO_COMMAND_STR_SET_SLEW_RATE = "Rs"; // multiple of sideral rate
static constexpr std::string_view PROTO_COMMAND_STR_SET_SLEW_ABS_RATE = "RMs"; // in degs/s
static constexpr std::string_view PROTO_COMMAND_STR_GET_SLEW_ABS_RATE = "GMs"; // in degs/s
static constexpr std::string_view PROTO_COMMAND_STR_GET_MIN_SLEW_ABS_RATE = "GMsa"; // in degs/s
static constexpr std::string_view PROTO_COMMAND_STR_GET_MAX_SLEW_ABS_RATE = "GMsb"; // in degs/s
static constexpr std::string_view PROTO_COMMAND_STR_GET_GUIDING_RATE = "Ggui"; // in arcsec/s
static constexpr std::string_view PROTO_COMMAND_STR_SET_DEC_BACKLASH = "Bd";
static constexpr std::string_view PROTO_COMMAND_STR_SET_RA_BACKLASH = "Br";
static constexpr std::string_view PROTO_COMMAND_STR_SET_TAG_ALT = "Sa";
static constexpr std::string_view PROTO_COMMAND_STR_SET_BAUD_RATE = "SB";
static constexpr std::string_view PROTO_COMMAND_STR_SET_LOCAL_DATE = "SC";
static constexpr std::string_view PROTO_COMMAND_STR_SET_TAG_DEC = "Sd";
static constexpr std::string_view PROTO_COMMAND_STR_SET_CURR_SITE_LONG = "Sg";
static constexpr std::string_view PROTO_COMMAND_STR_SET_UTC_OFFSET = "SG"; // = UTC-LOCAL (hours)
static constexpr std::string_view PROTO_COMMAND_STR_SET_HIGHEST_ALT = "Sh";
static constexpr std::string_view PROTO_COMMAND_STR_SET_CURR_JULDATE = "SJD";
static constexpr std::string_view PROTO_COMMAND_STR_SET_LOCAL_TIME = "SL";
static constexpr std::string_view PROTO_COMMAND_STR_SET_LOCAL_DATE_TIME = "SLDT";
static constexpr std::string_view PROTO_COMMAND_STR_SET_UTC_DATE_TIME = "SUDT";
static constexpr std::string_view PROTO_COMMAND_STR_SET_MERIDIAN_BEHAV = "SMF";
static constexpr std::string_view PROTO_COMMAND_STR_SET_LOWEST_ALT = "So";
static constexpr std::string_view PROTO_COMMAND_STR_SET_TAG_RA = "Sr";
static constexpr std::string_view PROTO_COMMAND_STR_SET_REFRACT_CORR_STATUS = "SREF";
static constexpr std::string_view PROTO_COMMAND_STR_SET_ATM_PRES = "SRPRS";
static constexpr std::string_view PROTO_COMMAND_STR_SET_ATM_TEMP = "SRTMP";
static constexpr std::string_view PROTO_COMMAND_STR_SET_SPEED_CORR_STATUS = "SSC";
static constexpr std::string_view PROTO_COMMAND_STR_SET_SETTLE_TIME = "Sstm";
static constexpr std::string_view PROTO_COMMAND_STR_SET_TRACK_MERIDIAN_LIMIT = "Slmt";
static constexpr std::string_view PROTO_COMMAND_STR_SET_SLEW_MERIDIAN_LIMIT = "Slms";
static constexpr std::string_view PROTO_COMMAND_STR_SET_UNATTEND_FLIP_SETTING = "Suaf";
static constexpr std::string_view PROTO_COMMAND_STR_SET_CURR_SITE_LAT = "St";
static constexpr std::string_view PROTO_COMMAND_STR_STOP = "STOP";
static constexpr std::string_view PROTO_COMMAND_STR_SET_MAX_SLEW_ABS_RATE = "Sw"; // in degs/s
static constexpr std::string_view PROTO_COMMAND_STR_SET_WOL_CONF = "SWOL";
static constexpr std::string_view PROTO_COMMAND_STR_SET_MOUNT_IP_ADDR = "SIP";
static constexpr std::string_view PROTO_COMMAND_STR_SET_TAG_AZ = "Sz";
static constexpr std::string_view PROTO_COMMAND_STR_TOGGLE_PEC = "$Q";
static constexpr std::string_view PROTO_COMMAND_STR_PEC_OFF = "p";
static constexpr std::string_view PROTO_COMMAND_STR_PEC_ON = "pP";
static constexpr std::string_view PROTO_COMMAND_STR_INC_CUSTOM_TRACK_RATE = "T+"; // ++0.025 "/s
static constexpr std::string_view PROTO_COMMAND_STR_DEC_CUSTOM_TRACK_RATE = "T-"; // --0.025 "/s
static constexpr std::string_view PROTO_COMMAND_STR_LUNAR_TRACK_RATE = "TL";
static constexpr std::string_view PROTO_COMMAND_STR_SOLAR_TRACK_RATE = "TSOLAR";
static constexpr std::string_view PROTO_COMMAND_STR_CUSTOM_TRACK_RATE_ON = "TM"; // turn on custom tracking rate
static constexpr std::string_view PROTO_COMMAND_STR_SIDERAL_TRACK_RATE_ON = "TQ"; // turn on sideral tracking rate
static constexpr std::string_view PROTO_COMMAND_STR_SET_CUSTOM_TRACK_RATE = "T"; // see "GT"
static constexpr std::string_view PROTO_COMMAND_STR_SET_TRACK_RATE = "ST"; // see "GT"
static constexpr std::string_view PROTO_COMMAND_STR_LUNAR_TRACK_RATE_EXT = "RT0";
static constexpr std::string_view PROTO_COMMAND_STR_SOLAR_TRACK_RATE_EXT = "RT1";
static constexpr std::string_view PROTO_COMMAND_STR_SIDERAL_TRACK_RATE_ON_EXT = "RT2"; // turn on sideral tracking rate
static constexpr std::string_view PROTO_COMMAND_STR_STOP_TRACK = "RT9";
static constexpr std::string_view PROTO_COMMAND_STR_SET_RA_TRACK_RATE = "RR";
static constexpr std::string_view PROTO_COMMAND_STR_SET_DEC_TRACK_RATE = "RD";
static constexpr std::string_view PROTO_COMMAND_STR_DUAL_TRACK_CONF = "Sdat";
static constexpr std::string_view PROTO_COMMAND_STR_DUAL_TRACK_STATUS = "Gdat";
static constexpr std::string_view PROTO_COMMAND_STR_SET_PREC_MODE = "U"; // just for compability (do nothing)
static constexpr std::string_view PROTO_COMMAND_STR_SET_PREC_MODE_0 = "U0"; // just for compability (do nothing)
static constexpr std::string_view PROTO_COMMAND_STR_SET_PREC_MODE_1 = "U1"; // just for compability (do nothing)
static constexpr std::string_view PROTO_COMMAND_STR_SET_PREC_MODE_2 = "U2"; // just for compability (do nothing)
static constexpr std::string_view PROTO_COMMAND_STR_SET_FINAL_APP_TC = "SFAtc"; // time constant
static constexpr std::string_view PROTO_COMMAND_STR_GET_FINAL_APP_TC = "GFAtc";
static constexpr std::string_view PROTO_COMMAND_STR_SET_FINAL_APP_DL = "SFAlm"; // distance limit
static constexpr std::string_view PROTO_COMMAND_STR_GET_FINAL_APP_DL = "GFAlm";
static constexpr std::string_view PROTO_COMMAND_STR_SET_FINAL_APP_MODE = "SFAmd"; // set final approach mode
static constexpr std::string_view PROTO_COMMAND_STR_GET_FINAL_APP_MODE = "GFAmd";
static constexpr std::string_view PROTO_COMMAND_STR_GET_ANG_RA_POS = "GaXa";
static constexpr std::string_view PROTO_COMMAND_STR_GET_ANG_DEC_POS = "GaXb";
static constexpr std::string_view PROTO_COMMAND_STR_SET_ANG_TAG_RA_POS = "SaXa";
static constexpr std::string_view PROTO_COMMAND_STR_SET_ANG_TAG_DEC_POS = "SaXb";
static constexpr std::string_view PROTO_COMMAND_STR_GET_ANG_TAG_RA_POS = "QaXa";
static constexpr std::string_view PROTO_COMMAND_STR_GET_ANG_TAG_DEC_POS = "QaXb";
static constexpr std::string_view PROTO_COMMAND_STR_SLEW_TO_ANG_TAG = "MaX"; // slew and stop
static constexpr std::string_view PROTO_COMMAND_STR_SLEW_TO_ANG_TAG_PARK = "PaX"; // slew and park
static constexpr std::string_view PROTO_COMMAND_STR_PARK_IN_CURR_POS = "PiP";
static constexpr std::string_view PROTO_COMMAND_STR_SLEW_TO_PARK_ANG_POS = "PsX";
static constexpr std::string_view PROTO_COMMAND_STR_SAVE_PARK_ANG_POS = "PyX";
enum PROTO_COMMAND_ID : size_t {
PROTO_COMMAND_ID_ACK = details::FNV1aHash(PROTO_COMMAND_STR_ACK),
PROTO_COMMAND_ID_TRACK_STOP = details::FNV1aHash(PROTO_COMMAND_STR_TRACK_STOP),
PROTO_COMMAND_ID_TRACK_START = details::FNV1aHash(PROTO_COMMAND_STR_TRACK_START),
PROTO_COMMAND_ID_GET_TEL_ALT = details::FNV1aHash(PROTO_COMMAND_STR_TEL_ALT),
PROTO_COMMAND_ID_GET_TAG_ALT = details::FNV1aHash(PROTO_COMMAND_STR_TAG_ALT),
PROTO_COMMAND_ID_GET_CURR_DATE = details::FNV1aHash(PROTO_COMMAND_STR_GET_CURR_DATE),
PROTO_COMMAND_ID_GET_TEL_DEC = details::FNV1aHash(PROTO_COMMAND_STR_GET_TEL_DEC),
PROTO_COMMAND_ID_GET_TAG_DEC = details::FNV1aHash(PROTO_COMMAND_STR_GET_TAG_DEC),
PROTO_COMMAND_ID_GET_CURR_SITE_ELEV = details::FNV1aHash(PROTO_COMMAND_STR_GET_CURR_SITE_ELEV),
PROTO_COMMAND_ID_GET_UTC_OFFSET = details::FNV1aHash(PROTO_COMMAND_STR_GET_UTC_OFFSET),
PROTO_COMMAND_ID_GET_CURR_SITE_LONG = details::FNV1aHash(PROTO_COMMAND_STR_GET_CURR_SITE_LONG),
PROTO_COMMAND_ID_GET_HIGHEST_ALT = details::FNV1aHash(PROTO_COMMAND_STR_GET_HIGHEST_ALT),
PROTO_COMMAND_ID_GINFO = details::FNV1aHash(PROTO_COMMAND_STR_GINFO),
PROTO_COMMAND_ID_GINQ = details::FNV1aHash(PROTO_COMMAND_STR_GINQ),
PROTO_COMMAND_ID_GET_MOUNT_IP_ADDR = details::FNV1aHash(PROTO_COMMAND_STR_GET_MOUNT_IP_ADDR),
PROTO_COMMAND_ID_GET_MOUNT_WIRELESS_IP_ADDR = details::FNV1aHash(PROTO_COMMAND_STR_MOUNT_WIRELESS_IP_ADDR),
PROTO_COMMAND_ID_GET_MOUNT_MAC_ADDR = details::FNV1aHash(PROTO_COMMAND_STR_MOUNT_MAC_ADDR),
PROTO_COMMAND_ID_GET_MOUNT_WIRELESS_MAC_ADDR = details::FNV1aHash(PROTO_COMMAND_STR_GET_MOUNT_WIRELESS_MAC_ADDR),
PROTO_COMMAND_ID_GET_CURR_JULDATE = details::FNV1aHash(PROTO_COMMAND_STR_GET_CURR_JULDATE),
PROTO_COMMAND_ID_GET_CURR_JULDATE_EXTPREC = details::FNV1aHash(PROTO_COMMAND_STR_GET_CURR_JULDATE_EXTPREC),
PROTO_COMMAND_ID_GET_CURR_JULDATE_EXTPREC_LEAP_SEC =
details::FNV1aHash(PROTO_COMMAND_STR_GET_CURR_JULDATE_EXTPREC_LEAP_SEC),
PROTO_COMMAND_ID_GET_LOCAL_TIME = details::FNV1aHash(PROTO_COMMAND_STR_GET_LOCAL_TIME),
PROTO_COMMAND_ID_GET_LOCAL_DATE_TIME = details::FNV1aHash(PROTO_COMMAND_STR_GET_LOCAL_DATE_TIME),
PROTO_COMMAND_ID_GET_UTC_DATE_TIME = details::FNV1aHash(PROTO_COMMAND_STR_GET_UTC_DATE_TIME),
PROTO_COMMAND_ID_GET_UTC_UT1_DIFF = details::FNV1aHash(PROTO_COMMAND_STR_GET_UTC_UT1_DIFF),
PROTO_COMMAND_ID_GET_GPS_UTC_DIFF = details::FNV1aHash(PROTO_COMMAND_STR_GET_GPS_UTC_DIFF),
PROTO_COMMAND_ID_GET_NEXT_LEAP_SEC = details::FNV1aHash(PROTO_COMMAND_STR_GET_NEXT_LEAP_SEC),
PROTO_COMMAND_ID_GET_MERIDIAN_BEHAV = details::FNV1aHash(PROTO_COMMAND_STR_GET_MERIDIAN_BEHAV),
PROTO_COMMAND_ID_GET_LOWEST_ALT = details::FNV1aHash(PROTO_COMMAND_STR_GET_LOWEST_ALT),
PROTO_COMMAND_ID_GET_PA = details::FNV1aHash(PROTO_COMMAND_STR_GET_PA),
PROTO_COMMAND_ID_GET_PA_SPEED = details::FNV1aHash(PROTO_COMMAND_STR_GET_PA_SPEED),
PROTO_COMMAND_ID_GET_PA_ZENITH = details::FNV1aHash(PROTO_COMMAND_STR_GET_PA_ZENITH),
PROTO_COMMAND_ID_GET_PA_ZENITH_SPEED = details::FNV1aHash(PROTO_COMMAND_STR_GET_PA_ZENITH_SPEED),
PROTO_COMMAND_ID_GET_GUIDING_STATUS = details::FNV1aHash(PROTO_COMMAND_STR_GET_GUIDING_STATUS),
PROTO_COMMAND_ID_GET_TEL_RA = details::FNV1aHash(PROTO_COMMAND_STR_GET_TEL_RA),
PROTO_COMMAND_ID_GET_TAG_RA = details::FNV1aHash(PROTO_COMMAND_STR_GET_TAG_RA),
PROTO_COMMAND_ID_GET_ATM_PRES = details::FNV1aHash(PROTO_COMMAND_STR_GET_ATM_PRES),
PROTO_COMMAND_ID_GET_ATM_TEMP = details::FNV1aHash(PROTO_COMMAND_STR_GET_ATM_TEMP),
PROTO_COMMAND_ID_GET_SIDERAL_TIME = details::FNV1aHash(PROTO_COMMAND_STR_GET_SIDERAL_TIME),
PROTO_COMMAND_ID_GET_REFRACT_CORR_STATUS = details::FNV1aHash(PROTO_COMMAND_STR_GET_REFRACT_CORR_STATUS),
PROTO_COMMAND_ID_GET_SPEED_CORR_STATUS = details::FNV1aHash(PROTO_COMMAND_STR_GET_SPEED_CORR_STATUS),
PROTO_COMMAND_ID_GSTAT = details::FNV1aHash(PROTO_COMMAND_STR_GSTAT),
};
using namespace std::literals;
static constexpr std::array PROTO_COMMAND_STRING = {
"\x06"sv, // <ACK>
"AL"sv, // stop tracking
"AP"sv, // start tracking
"GA"sv, // Get telescope altitude
"Ga"sv, // Get current target altitude
"GC"sv, // Get current date
"GD"sv, // Get telescope declination
"Gd"sv // Get current target declination
"Gev"sv, // Get the current site elevation
"GG"sv, // Get UTC offset time
"Gg"sv, // Get current site longitude
"Gh"sv, // Get the highest altitude above the horizon
"Ginfo"sv, // Get multiple information
"GINQ"sv, // Get the type of connection
"GIP"sv, // Get mount IP address
"GIPW"sv, // Get mount wireless IP address
"GMAC"sv, // Get mount MAC address
"GMACW"sv, // Get mount wireless MAC address
"GJD"sv, // Get the current Julian Date
"GJD1"sv, // Get the current Julian Date with extended precision
"GJD2"sv, // Get the current Julian Date with extended precision and leap second flag
"GL"sv, // Get local time
"GLDT"sv, // Get local date and time
"GUDT"sv, // Get UTC date and time
"GDUT"sv, // Get the current UTC UT1 difference in seconds and decimals
"GDGPS"sv, // Get the current GPS UTC difference in seconds
"GULEAP"sv, // Gets the date of the next leap second that will be accounted for
"GMF"sv, // Get meridian side behaviour
"Go"sv, // Get the lowest altitude above the horizon
"GPA"sv, // Get parallactic angle with respect to actual mount orientation
"GPAS"sv, // Get parallactic speed with respect to actual mount orientation
"GPAZ"sv, // Get parallactic angle with respect to zenith
"GPASZ"sv, // Get parallactic speed with respect to zenith
"Gpgc"sv, // Get guiding status
"GR"sv, // Get telescope right ascension
"Gr"sv, // Get target right ascension
"GRPRS"sv, // Get the atmospheric pressure used in the refraction model
"GRTMP"sv, // Get the temperature used in the refraction model
"GS"sv, // Get the sidereal time
"GREF"sv, // Gets the current status of the refraction correction
"GSC"sv, // Gets the current status of the speed correction flag
"Gstat"sv, // Gets the status of the mount
};
class ControlCommandParser
{
public:
static constexpr char COMM_START_SYMBOL = ':';
static constexpr char COMM_STOP_SYMBOL = '#';
static constexpr char COMM_ACK_SYMBOL = 0x06;
};
} // namespace BM700