mountcontrol/cxx/control_proto.h
2025-01-27 17:58:39 +03:00

93 lines
3.6 KiB
C++

#pragma once
#include <functional>
#include <optional>
#include <string_view>
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<void(std::string_view, std::vector<std::string_view>)> user_func_t;
// typedef std::pair<std::string_view, std::vector<std::string_view>> parse_result_t;
struct parse_result_t {
std::string_view cmd;
std::vector<std::string_view> args;
};
ControlProtoParser();
virtual ~ControlProtoParser() = default;
template <std::convertible_to<user_func_t> FT>
bool addUserFunc(std::string_view command, FT&& func)
{
if (auto res = _userFunc.find(command); res != _userFunc.end()) {
*res = std::forward<FT>(func);
return true;
} else {
return false;
}
}
std::optional<parse_result_t> parse(std::string_view command);
bool exec(std::string_view command);
protected:
static void generateCommMap();
inline static std::unordered_map<std::string_view, user_func_t> _userFunc;
};
} // namespace BM700