This commit is contained in:
2026-05-21 12:20:55 +03:00
parent a6dee0e27f
commit 9e43516657

View File

@@ -4,10 +4,15 @@
#include <mcc/mcc_keyvalue.h> #include <mcc/mcc_keyvalue.h>
#include <mcc/mcc_pcm.h> #include <mcc/mcc_pcm.h>
#include <filesystem> #include <filesystem>
#include "mcc/mcc_pzone.h"
namespace asibfm700 namespace asibfm700
{ {
static constexpr double SAORAS_LATITUDE = 43.646711_degs;
static constexpr double SAORAS_LONGITUDE = 41.440732_degs;
template <mcc::impl::mcc_variant_valid_type_c T> template <mcc::impl::mcc_variant_valid_type_c T>
struct config_record_t : mcc::impl::mcc_simple_kv_record_t<T> { struct config_record_t : mcc::impl::mcc_simple_kv_record_t<T> {
std::vector<std::string_view> head_comment; std::vector<std::string_view> head_comment;
@@ -31,8 +36,8 @@ static auto Asibfm700MountConfigurationDefaults = std::make_tuple(
/* geographic coordinates of the observation site */ /* geographic coordinates of the observation site */
make_config_record("siteLatitude", mcc::impl::MccAngle(43.646711_degs), {"site latitude in degrees"}), make_config_record("siteLatitude", mcc::impl::MccAngle(SAORAS_LATITUDE), {"site latitude in degrees"}),
make_config_record("siteLongitude", mcc::impl::MccAngle(41.440732_degs), {"site longitude in degrees"}), make_config_record("siteLongitude", mcc::impl::MccAngle(SAORAS_LONGITUDE), {"site longitude in degrees"}),
make_config_record("siteElevation", 2070.0, {"site elevation in meters"}), make_config_record("siteElevation", 2070.0, {"site elevation in meters"}),
/* celestial coordinate transformation */ /* celestial coordinate transformation */
@@ -62,19 +67,18 @@ static auto Asibfm700MountConfigurationDefaults = std::make_tuple(
// NOTE: The first and last values are interpretated as border knots!!! // NOTE: The first and last values are interpretated as border knots!!!
// Thus the array length must be equal to or greater than 2! // Thus the array length must be equal to or greater than 2!
make_config_record("pcmBsplineXknots", make_config_record("pcmBsplineXknots",
std::vector<double>{0.0, 0.6981317, 1.3962634, 2.0943951, 2.7925268, 3.4906585, 4.1887902, mcc::impl::mccGenerateBsplineKnots(0.0, 360.0_degs, 8),
4.88692191, 5.58505361, 6.28318531},
{"PCM B-spline knots along X-axis (HA-angle or azimuth). By default from 0 to 2*PI radians", {"PCM B-spline knots along X-axis (HA-angle or azimuth). By default from 0 to 2*PI radians",
"NOTE: The first and last values are interpretated as border knots!!!", "NOTE: The first and last values are interpretated as border knots!!!",
" Thus the array length must be equal to or greater than 2!"}), " Thus the array length must be equal to or greater than 2!"}),
// PCM B-spline knots along Y-axis (declination or zenithal distance). By default from -PI/6 to PI/2 radians // PCM B-spline knots along Y-axis (declination or zenithal distance).
// By default from -SAORAS-latitude to PI/2 radians
// NOTE: The first and last values are interpretated as border knots!!! // NOTE: The first and last values are interpretated as border knots!!!
// Thus the array length must be equal to or greater than 2! // Thus the array length must be equal to or greater than 2!
make_config_record( make_config_record(
"pcmBsplineYknots", "pcmBsplineYknots",
std::vector<double>{-0.52359878, -0.29088821, -0.05817764, 0.17453293, 0.40724349, 0.63995406, 0.87266463, mcc::impl::mccGenerateBsplineKnots(-SAORAS_LATITUDE, 90.0_degs, 8),
1.10537519, 1.33808576, 1.57079633},
{"PCM B-spline knots along Y-axis (declination or zenithal distance). By default from -PI/6 to PI/2 radians", {"PCM B-spline knots along Y-axis (declination or zenithal distance). By default from -PI/6 to PI/2 radians",
"NOTE: The first and last values are interpretated as border knots!!!", "NOTE: The first and last values are interpretated as border knots!!!",
" Thus the array length must be equal to or greater than 2!"}), " Thus the array length must be equal to or greater than 2!"}),
@@ -85,7 +89,136 @@ static auto Asibfm700MountConfigurationDefaults = std::make_tuple(
// PCM B-spline coeffs for along Y-axis (declination or zenithal distance) // PCM B-spline coeffs for along Y-axis (declination or zenithal distance)
make_config_record("pcmBsplineYcoeffs", make_config_record("pcmBsplineYcoeffs",
std::vector<double>{}, std::vector<double>{},
{"PCM B-spline coeffs for along Y-axis (declination angle)"})); {"PCM B-spline coeffs for along Y-axis (declination angle)"}),
// inverse PCM B-spline coeffs for along X-axis (HA-angle or azimuth)
make_config_record("pcmInverseBsplineXcoeffs",
std::vector<double>{},
{"Inverse PCM B-spline coeffs for along X-axis (HA-angle)"}),
// inverse PCM B-spline coeffs for along Y-axis (declination or zenithal distance)
make_config_record("pcmInverseBsplineYcoeffs",
std::vector<double>{},
{"Inverse PCM B-spline coeffs for along Y-axis (declination angle)"}),
/* prohibited zones */
// minimal altitude (default: 10.0 degrees and SAO RAS latitude)
make_config_record("altLimPZ",
mcc::impl::MccAltLimitPZ<mcc::impl::MccAltLimitKind::MIN_ALT_LIMIT>{10.0_degs, SAORAS_LATITUDE},
{"minimal altitude prohibited zone"}),
// HA-axis limit switch
make_config_record(
"axisLimitSwitchHA",
mcc::impl::MccAxisLimitSwitchPZ<mcc::impl::MccCoordKind::COORDS_KIND_HA_OBS>{-170.0_degs, 170.0_degs, nullptr},
{"HA-axis limit switch stop angles"}),
// DEC-axis limit switch
make_config_record(
"axisLimitSwitchDEC",
mcc::impl::MccAxisLimitSwitchPZ<mcc::impl::MccCoordKind::COORDS_KIND_DEC_OBS>{-90.0_degs, 90.0_degs, nullptr},
{"DEC-axis limit switch stop angles"}),
/* hardware-related */
// hardware mode: 1 - model mode, otherwise real mode
make_config_record("RunModel", 0, {"hardware mode: 1 - model mode, otherwise real mode"}),
// mount serial device paths
make_config_record("MountDevPath", std::string("/dev/ttyUSB0"), {"mount serial device paths"}),
// mount serial device speed
make_config_record("MountDevSpeed", 19200, {"mount serial device speed"}),
// motor encoders serial device path
make_config_record("EncoderDevPath", std::string(""), {"motor encoders serial device path"}),
// X-axis encoder serial device path
make_config_record("EncoderXDevPath", std::string("/dev/encoder_X0"), {"X-axis encoder serial device path"}),
// Y-axis encoder serial device path
make_config_record("EncoderYDevPath", std::string("/dev/encoder_Y0"), {"Y-axis encoder serial device path"}),
// encoders serial device speed
make_config_record("EncoderDevSpeed", 153000, {"encoders serial device speed"}),
// ==1 if encoder works as separate serial device, ==2 if there's new version with two devices
make_config_record("SepEncoder",
2,
{"==1 if encoder works as separate serial device, ==2 if there's new version with two devices"}),
// mount polling interval in millisecs
make_config_record("MountReqInterval", std::chrono::milliseconds(100), {"mount polling interval in millisecs"}),
// encoders polling interval in millisecs
make_config_record("EncoderReqInterval", std::chrono::milliseconds(1), {"encoders polling interval in millisecs"}),
// mount axes rate calculation interval in millisecs
make_config_record("EncoderSpeedInterval",
std::chrono::milliseconds(50),
{"mount axes rate calculation interval in millisecs"}),
make_config_record("PIDMaxDt",
std::chrono::milliseconds(1000),
{"maximal PID refresh time interval in millisecs",
"NOTE: if PID data will be refreshed with interval longer than this value (e.g. user polls "
"encoder data too rarely)",
"then the PID 'expired' data will be cleared and new computing loop is started"}),
make_config_record("PIDRefreshDt", std::chrono::milliseconds(100), {"PID refresh interval"}),
make_config_record("PIDCycleDt",
std::chrono::milliseconds(5000),
{"PID I cycle time (analog of 'RC' for PID on opamps)"}),
// X-axis coordinate PID P,I,D-params
make_config_record("XPIDC", std::vector<double>{0.5, 0.1, 0.2}, {"X-axis coordinate PID P,I,D-params"}),
// X-axis rate PID P,I,D-params
make_config_record("XPIDV", std::vector<double>{0.09, 0.0, 0.05}, {"X-axis rate PID P,I,D-params"}),
// Y-axis coordinate PID P, I, D-params
make_config_record("YPIDC", std::vector<double>{0.5, 0.1, 0.2}, {"Y-axis coordinate PID P, I, D-params"}),
// Y-axis rate PID P,I,D-params
make_config_record("YPIDV", std::vector<double>{0.09, 0.0, 0.05}, {"Y-axis rate PID P,I,D-params"}),
// maximal moving rate (degrees per second) along HA-axis (Y-axis of Sidereal servo microcontroller)
make_config_record(
"hwMaxRateHA",
mcc::impl::MccAngle(8.0_degs),
{"maximal moving rate (degrees per second) along HA-axis (Y-axis of Sidereal servo microcontroller)"}),
// maximal moving rate (degrees per second) along DEC-axis (X-axis of Sidereal servo microcontroller)
make_config_record(
"hwMaxRateDEC",
mcc::impl::MccAngle(10.0_degs),
{"maximal moving rate (degrees per second) along DEC-axis (X-axis of Sidereal servo microcontroller)"}),
make_config_record("MaxPointingErr",
mcc::impl::MccAngle(8.0_degs),
{"slewing-to-pointing mode angular limit in degrees"}),
make_config_record("MaxFinePointingErr",
mcc::impl::MccAngle(1.5_degs),
{"pointing-to-guiding mode angular limit in degrees"}),
make_config_record("MaxGuidingErr",
mcc::impl::MccAngle(0.5_arcsecs),
{"guiding 'good'-flag error cirle radius (mount-to-target distance) in degrees"}),
make_config_record("XEncZero", (int64_t)0, {"X-axis encoder zero-point in ticks"}),
make_config_record("YEncZero", (int64_t)0, {"Y-axis encoder zero-point in ticks"})
);
class Asibfm700MountConfiguration : public mcc::impl::MccKeyValueHolder<decltype(Asibfm700MountConfigurationDefaults)> class Asibfm700MountConfiguration : public mcc::impl::MccKeyValueHolder<decltype(Asibfm700MountConfigurationDefaults)>
{ {