Start
This commit is contained in:
parent
b391b537b0
commit
6ec503ff04
15
CMakeLists.txt
Normal file
15
CMakeLists.txt
Normal 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
89
cxx/.gitignore
vendored
Normal 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
11
cxx/CMakeLists.txt
Normal 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
217
cxx/comm_proto.h
Normal 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
|
||||
Loading…
x
Reference in New Issue
Block a user