#pragma once #include #include #include namespace BM700 { /* CONTROL PROTOCOL DEFINITIONS */ // command: cmd-name[=arg1[,arg2[,...]]\n static constexpr std::string_view CONTROL_PROTO_STOP_SEQ = "\n"; static constexpr std::string_view CONTROL_PROTO_COMM_ARG_DELIM_SEQ = "="; static constexpr std::string_view CONTROL_PROTO_ARG_DELIM_SEQ = ","; /* CONTROL PROTOCOL COMMANDS */ // coordinates getter/setter static constexpr std::string_view CONTROL_PROTO_STR_TAG_AZ = "tagAZ"; static constexpr std::string_view CONTROL_PROTO_STR_TAG_ALT = "tagALT"; static constexpr std::string_view CONTROL_PROTO_STR_TAG_AZALT = "tagAZALT"; static constexpr std::string_view CONTROL_PROTO_STR_TAG_RA = "tagRA"; static constexpr std::string_view CONTROL_PROTO_STR_TAG_DEC = "tagDEC"; static constexpr std::string_view CONTROL_PROTO_STR_TAG_RADEC = "tagRADEC"; static constexpr std::string_view CONTROL_PROTO_STR_TEL_RA = "telRA"; static constexpr std::string_view CONTROL_PROTO_STR_TEL_DEC = "telDEC"; static constexpr std::string_view CONTROL_PROTO_STR_TEL_RADEC = "telRADEC"; // time/date static constexpr std::string_view CONTROL_PROTO_STR_UTC_DATE = "utcDate"; static constexpr std::string_view CONTROL_PROTO_STR_LOC_DATE = "locDate"; static constexpr std::string_view CONTROL_PROTO_STR_UTC_TIME = "utcTime"; static constexpr std::string_view CONTROL_PROTO_STR_LOC_TIME = "locTime"; static constexpr std::string_view CONTROL_PROTO_STR_UTC_DT = "utcDT"; // full date-time static constexpr std::string_view CONTROL_PROTO_STR_LOC_DT = "locDT"; // full date-time static constexpr std::string_view CONTROL_PROTO_STR_JDN = "julDN"; // Julian day number // target limits static constexpr std::string_view CONTROL_PROTO_STR_TAG_MINALT = "tagMINALT"; static constexpr std::string_view CONTROL_PROTO_STR_TAG_MAXALT = "tagMAXALT"; // moving static constexpr std::string_view CONTROL_PROTO_STR_SLEW_AZALT = "slewAZALT"; static constexpr std::string_view CONTROL_PROTO_STR_SLEW_RADEC = "slewRADEC"; static constexpr std::string_view CONTROL_PROTO_STR_SLEW_XVEL = "slewXVEL"; // velocity along Az/RA static constexpr std::string_view CONTROL_PROTO_STR_SLEW_YVEL = "slewYVEL"; // velocity along ALT/DEC static constexpr std::string_view CONTROL_PROTO_STR_TRACK_XVEL = "trackXVEL"; static constexpr std::string_view CONTROL_PROTO_STR_TRACK_YVEL = "trackYVEL"; static constexpr std::string_view CONTROL_PROTO_STR_STOP = "stop"; // site coordinates static constexpr std::string_view CONTROL_PROTO_STR_SITE_LON = "siteLON"; static constexpr std::string_view CONTROL_PROTO_STR_SITE_LAT = "siteLAT"; static constexpr std::array CONTROL_PROTO_VALID_COMMAND = {CONTROL_PROTO_STR_SLEW_AZALT, CONTROL_PROTO_STR_SLEW_RADEC}; class ControlProtoParser { public: typedef std::function)> user_func_t; // typedef std::pair> parse_result_t; struct parse_result_t { std::string_view cmd; std::vector args; }; ControlProtoParser(); virtual ~ControlProtoParser() = default; template FT> bool addUserFunc(std::string_view command, FT&& func) { if (auto res = _userFunc.find(command); res != _userFunc.end()) { *res = std::forward(func); return true; } else { return false; } } std::optional parse(std::string_view command); bool exec(std::string_view command); protected: static void generateCommMap(); inline static std::unordered_map _userFunc; }; } // namespace BM700