This commit is contained in:
Timur A. Fatkhullin 2025-01-20 23:55:39 +03:00
parent b391b537b0
commit 6ec503ff04
4 changed files with 332 additions and 0 deletions

15
CMakeLists.txt Normal file
View File

@ -0,0 +1,15 @@
cmake_minimum_required(VERSION 3.14)
#**********************************************
# Astrosib(c) BM-700 mount control software *
#**********************************************
project(ASIB_BM700 LANGUAGES C CXX)
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
#
# ******* C++ PART OF THE PROJECT *******
add_subdirectory(cxx)

89
cxx/.gitignore vendored Normal file
View File

@ -0,0 +1,89 @@
# ---> C
# Prerequisites
*.d
# Object files
*.o
*.ko
*.obj
*.elf
# Linker output
*.ilk
*.map
*.exp
# Precompiled Headers
*.gch
*.pch
# Libraries
*.lib
*.a
*.la
*.lo
# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib
# Executables
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex
# Debug files
*.dSYM/
*.su
*.idb
*.pdb
# Kernel Module Compile Results
*.mod*
*.cmd
.tmp_versions/
modules.order
Module.symvers
Mkfile.old
dkms.conf
# ---> C++
# Prerequisites
*.d
# Compiled Object files
*.slo
*.lo
*.o
*.obj
# Precompiled Headers
*.gch
*.pch
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
# Fortran module files
*.mod
*.smod
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.exe
*.out
*.app
CMakeLists.txt.user

11
cxx/CMakeLists.txt Normal file
View File

@ -0,0 +1,11 @@
cmake_minimum_required(VERSION 3.14)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# Mount client-to-server communication protocol
# (extended LX200 protocol)
#
set(COMM_PROTO_LIB_SRC comm_proto.h)

217
cxx/comm_proto.h Normal file
View File

@ -0,0 +1,217 @@
#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#"
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