From 9e43516657dcf326a214a9cfb1fb68cac5251943 Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Thu, 21 May 2026 12:20:55 +0300 Subject: [PATCH] ... --- asibfm700_config.h | 149 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 141 insertions(+), 8 deletions(-) diff --git a/asibfm700_config.h b/asibfm700_config.h index 8de6841..cbe5be1 100644 --- a/asibfm700_config.h +++ b/asibfm700_config.h @@ -4,10 +4,15 @@ #include #include #include +#include "mcc/mcc_pzone.h" namespace asibfm700 { +static constexpr double SAORAS_LATITUDE = 43.646711_degs; +static constexpr double SAORAS_LONGITUDE = 41.440732_degs; + + template struct config_record_t : mcc::impl::mcc_simple_kv_record_t { std::vector head_comment; @@ -31,8 +36,8 @@ static auto Asibfm700MountConfigurationDefaults = std::make_tuple( /* geographic coordinates of the observation site */ - make_config_record("siteLatitude", mcc::impl::MccAngle(43.646711_degs), {"site latitude in degrees"}), - make_config_record("siteLongitude", mcc::impl::MccAngle(41.440732_degs), {"site longitude in degrees"}), + make_config_record("siteLatitude", mcc::impl::MccAngle(SAORAS_LATITUDE), {"site latitude 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"}), /* celestial coordinate transformation */ @@ -62,19 +67,18 @@ static auto Asibfm700MountConfigurationDefaults = std::make_tuple( // NOTE: The first and last values are interpretated as border knots!!! // Thus the array length must be equal to or greater than 2! make_config_record("pcmBsplineXknots", - std::vector{0.0, 0.6981317, 1.3962634, 2.0943951, 2.7925268, 3.4906585, 4.1887902, - 4.88692191, 5.58505361, 6.28318531}, + mcc::impl::mccGenerateBsplineKnots(0.0, 360.0_degs, 8), {"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!!!", " 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!!! // Thus the array length must be equal to or greater than 2! make_config_record( "pcmBsplineYknots", - std::vector{-0.52359878, -0.29088821, -0.05817764, 0.17453293, 0.40724349, 0.63995406, 0.87266463, - 1.10537519, 1.33808576, 1.57079633}, + mcc::impl::mccGenerateBsplineKnots(-SAORAS_LATITUDE, 90.0_degs, 8), {"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!!!", " 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) make_config_record("pcmBsplineYcoeffs", std::vector{}, - {"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{}, + {"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{}, + {"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{10.0_degs, SAORAS_LATITUDE}, + {"minimal altitude prohibited zone"}), + + // HA-axis limit switch + make_config_record( + "axisLimitSwitchHA", + mcc::impl::MccAxisLimitSwitchPZ{-170.0_degs, 170.0_degs, nullptr}, + {"HA-axis limit switch stop angles"}), + + // DEC-axis limit switch + make_config_record( + "axisLimitSwitchDEC", + mcc::impl::MccAxisLimitSwitchPZ{-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{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{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{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{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 {