From 34c3ecb0f4028926b174246d4ab53d5d399f6662 Mon Sep 17 00:00:00 2001 From: "Timur A. Fatkhullin" Date: Tue, 3 Mar 2026 14:18:03 +0300 Subject: [PATCH] rewrite Asibfm700Mount::initMount --- asibfm700_mount.cpp | 164 ++++++++++++++++++++++++++------------------ 1 file changed, 98 insertions(+), 66 deletions(-) diff --git a/asibfm700_mount.cpp b/asibfm700_mount.cpp index 0718da7..fad05c6 100644 --- a/asibfm700_mount.cpp +++ b/asibfm700_mount.cpp @@ -60,8 +60,47 @@ Asibfm700Mount::error_t Asibfm700Mount::initMount() logInfo(" leap seconds filename: {}", _mountConfig.leapSecondFilename()); logInfo(" IERS Bulletin A filename: {}", _mountConfig.bulletinAFilename()); + logInfo("{:-^80}", "Initializing ERFA-engine with values above:"); + auto ccte_state = mcc::impl::MccSkyPoint::cctEngine.getStateERFA(); + mcc::impl::MccSkyPoint::cctEngine.setStateERFA({.meteo = ccte_state.meteo, // just use of previous values + .wavelength = _mountConfig.refractWavelength(), + .lat = _mountConfig.siteLatitude(), + .lon = _mountConfig.siteLongitude(), + .elev = _mountConfig.siteElevation()}); + + if (_mountConfig.leapSecondFilename().size()) { // load leap seconds file + logInfo("Loading leap second file: '{}' ...", _mountConfig.leapSecondFilename()); + bool ok = ccte_state._leapSeconds.load(_mountConfig.leapSecondFilename()); + if (ok) { + logInfo("Leap second file was loaded successfully (expire date: {})", ccte_state._leapSeconds.expireDate()); + } else { + logError("Leap second file loading failed! Using hardcoded defauls (expire date: {})", + ccte_state._leapSeconds.expireDate()); + } + } else { + logInfo("Using hardcoded leap seconds defauls (expire date: {})", ccte_state._leapSeconds.expireDate()); + } + + if (_mountConfig.bulletinAFilename().size()) { // load IERS Bulletin A file + logInfo("Loading IERS Bulletin A file: '{}' ...", _mountConfig.bulletinAFilename()); + bool ok = ccte_state._bulletinA.load(_mountConfig.bulletinAFilename()); + if (ok) { + logInfo("IERS Bulletin A file was loaded successfully (date range: {} - {})", + ccte_state._bulletinA.dateRange().begin, ccte_state._bulletinA.dateRange().end); + } else { + logError("IERS Bulletin A file loading failed! Using hardcoded defauls (date range: {} - {})", + ccte_state._bulletinA.dateRange().begin, ccte_state._bulletinA.dateRange().end); + } + } else { + logInfo("Using hardcoded IERS Bulletin A defauls (date range: {} - {})", + ccte_state._bulletinA.dateRange().begin, ccte_state._bulletinA.dateRange().end); + } + + logInfo("{:-^80}", "ERFA-engine was initialized"); + + logInfo(""); - logDebug("Delete previously defined prohobited zones"); + logDebug("Delete previously defined prohibited zones"); clearPZones(); logInfo("Add prohibited zones ..."); @@ -88,9 +127,11 @@ Asibfm700Mount::error_t Asibfm700Mount::initMount() }; auto hw_cfg = _mountConfig.servoControllerConfig(); + auto eeprom_cfg = hw_cfg.hwConfig; + logInfo(""); logInfo("Hardware initialization ..."); - logInfo(" set hardware configuration:"); + logInfo(" set encoder device paths, PIDs configuration and rough encoder zero-points:"); logInfo(" RunModel: {}", hw_cfg.devConfig.RunModel == 1 ? "MODEL-MODE" : "REAL-MODE"); logInfo(" mount dev path: {}", hw_cfg.MountDevPath); logInfo(" encoder dev path: {}", hw_cfg.EncoderDevPath); @@ -117,13 +158,21 @@ Asibfm700Mount::error_t Asibfm700Mount::initMount() logInfo(" XEncZero: {}", hw_cfg.devConfig.XEncZero); logInfo(" YEncZero: {}", hw_cfg.devConfig.YEncZero); - // actually, only set this->_hardwareConfig.devConfig part and paths!!! - // this->_hardwareConfig = hw_cfg; + // actually, only set _servolController._hardwareConfig.devConfig part and paths!!! _servolController.hardwareUpdateConfig(hw_cfg.devConfig); - logInfo(""); - logInfo(" EEPROM data:"); + auto hw_ini_err = _servolController.hardwareInit(); + if (hw_ini_err) { + errorLogging(" cannot initialize hardware (paths, PIDs, zeros): ", hw_ini_err); + return hw_ini_err; + } + logInfo(" paths, PIDs, zeros were initialized successfully!"); + + logInfo(""); + logInfo(" current hardware EEPROM data:"); + + mcc::impl::MccAngle ang; if (hw_cfg.devConfig.RunModel != 1) { // load EEPROM only in REAL HARDWARE mode // load EEPROM part auto cfg_err = _servolController.hardwareUpdateConfig(); @@ -134,7 +183,7 @@ Asibfm700Mount::error_t Asibfm700Mount::initMount() hw_cfg = _servolController.getHardwareConfig(); - mcc::impl::MccAngle ang{hw_cfg.hwConfig.Yconf.accel}; // Sidereal defines HA-axis as Y-axis + ang = hw_cfg.hwConfig.Yconf.accel; // Sidereal defines HA-axis as Y-axis logInfo(" HA-axis accel: {} degs/s^2", ang.degrees()); ang = hw_cfg.hwConfig.Xconf.accel; // Sidereal defines DEC-axis as X-axis @@ -159,13 +208,52 @@ Asibfm700Mount::error_t Asibfm700Mount::initMount() logWarn(" MODEL-MODE, no EEPROM data!"); } + logInfo(""); + logInfo(" new hardware EEPROM data:"); + + + eeprom_cfg.Xslewrate = _mountConfig.getValue("hwMaxRateDEC").value_or(0.0); + eeprom_cfg.Yslewrate = _mountConfig.getValue("hwMaxRateHA").value_or(0.0); + + ang = eeprom_cfg.Yconf.accel; // Sidereal defines HA-axis as Y-axis + + logInfo(" HA-axis accel: {} degs/s^2", ang.degrees()); + ang = eeprom_cfg.Xconf.accel; // Sidereal defines DEC-axis as X-axis + logInfo(" DEC-axis accel: {} degs/s^2", ang.degrees()); + logInfo(" HA-axis backlash: {}", (double)eeprom_cfg.Yconf.backlash); + logInfo(" DEC-axis backlash: {}", (double)eeprom_cfg.Xconf.backlash); + + logInfo(" HA-axis encoder ticks per revolution: {}", + eeprom_cfg.Ysetpr); // Sidereal defines HA-axis as Y-axis + logInfo(" DEC-axis encoder ticks per revolution: {}", + eeprom_cfg.Xsetpr); // Sidereal defines DEC-axis as X-axis + logInfo(" HA-motor encoder ticks per revolution: {}", + eeprom_cfg.Ymetpr); // Sidereal defines HA-axis as Y-axis + logInfo(" DEC-motor encoder ticks per revolution: {}", + eeprom_cfg.Xmetpr); // Sidereal defines DEC-axis as X-axis + + ang = eeprom_cfg.Yslewrate; // Sidereal defines HA-axis as Y-axis + logInfo(" HA-axis slew rate: {} degs/s", ang.degrees()); + ang = eeprom_cfg.Xslewrate; // Sidereal defines DEC-axis as X-axis + logInfo(" DEC-axis slew rate: {} degs/s", ang.degrees()); + + // 03.03.2026: still do not save EEPROM!!! + // hw_ini_err = _servolController.hardwareUpdateConfig(eeprom_cfg); + // if (hw_ini_err) { + // errorLogging(" cannot initialize hardware (EEPROM data)!"); + + // return hw_ini_err; + // } + + logInfo("{:-^80}", "Hardware initialization was performed successfully!"); + logInfo(""); logInfo("Setup slewing and tracking parameters ..."); mpars.slewRateX = _mountConfig.getValue("hwMaxRateHA").value_or(0.0); mpars.slewRateY = _mountConfig.getValue("hwMaxRateDEC").value_or(0.0); if (hw_cfg.devConfig.RunModel != 1) { - mpars.brakingAccelX = hw_cfg.hwConfig.Yconf.accel; // Sidereal defines HA-axis as Y-axis - mpars.brakingAccelY = hw_cfg.hwConfig.Xconf.accel; // Sidereal defines DEC-axis as X-axis + mpars.brakingAccelX = eeprom_cfg.Yconf.accel; // Sidereal defines HA-axis as Y-axis + mpars.brakingAccelY = eeprom_cfg.Xconf.accel; // Sidereal defines DEC-axis as X-axis // } else { // set model's default values mpars.brakingAccelX = 0.165806; // Sidereal defines HA-axis as Y-axis @@ -236,15 +324,10 @@ Asibfm700Mount::error_t Asibfm700Mount::initMount() logInfo("Slewing and tracking parameters have been set successfully"); - // update Eddy's LibSidServo internal config - _servolController.hardwareUpdateConfig(hw_cfg.hwConfig); - coordpair_t cp; Mount.getMaxSpeed(&cp); logInfo("Check mount max speed: {} {}", cp.Y, cp.X); - _servolController.hardwareInit(); - // call base class initMount method auto hw_err = gm_class_t::initMount(); // auto hw_err = base_gm_class_t::initMount(); @@ -255,63 +338,12 @@ Asibfm700Mount::error_t Asibfm700Mount::initMount() logInfo("Hardware initialization was performed sucessfully!"); } - logInfo("ERFA engine initialization ..."); - - - auto ccte_state = mcc::impl::MccSkyPoint::cctEngine.getStateERFA(); - mcc::impl::MccSkyPoint::cctEngine.setStateERFA({.meteo = ccte_state.meteo, // just use of previous values - .wavelength = _mountConfig.refractWavelength(), - .lat = _mountConfig.siteLatitude(), - .lon = _mountConfig.siteLongitude(), - .elev = _mountConfig.siteElevation()}); - - // set ERFA state - // Asibfm700CCTE::engine_state_t ccte_state{ - // .meteo = Asibfm700CCTE::_currentState.meteo, // just use of previous values - // .wavelength = _mountConfig.refractWavelength(), - // .lat = _mountConfig.siteLatitude(), - // .lon = _mountConfig.siteLongitude(), - // .elev = _mountConfig.siteElevation()}; - - - if (_mountConfig.leapSecondFilename().size()) { // load leap seconds file - logInfo("Loading leap second file: '{}' ...", _mountConfig.leapSecondFilename()); - bool ok = ccte_state._leapSeconds.load(_mountConfig.leapSecondFilename()); - if (ok) { - logInfo("Leap second file was loaded successfully (expire date: {})", ccte_state._leapSeconds.expireDate()); - } else { - logError("Leap second file loading failed! Using hardcoded defauls (expire date: {})", - ccte_state._leapSeconds.expireDate()); - } - } else { - logInfo("Using hardcoded leap seconds defauls (expire date: {})", ccte_state._leapSeconds.expireDate()); - } - - if (_mountConfig.bulletinAFilename().size()) { // load IERS Bulletin A file - logInfo("Loading IERS Bulletin A file: '{}' ...", _mountConfig.bulletinAFilename()); - bool ok = ccte_state._bulletinA.load(_mountConfig.bulletinAFilename()); - if (ok) { - logInfo("IERS Bulletin A file was loaded successfully (date range: {} - {})", - ccte_state._bulletinA.dateRange().begin, ccte_state._bulletinA.dateRange().end); - } else { - logError("IERS Bulletin A file loading failed! Using hardcoded defauls (date range: {} - {})", - ccte_state._bulletinA.dateRange().begin, ccte_state._bulletinA.dateRange().end); - } - } else { - logInfo("Using hardcoded IERS Bulletin A defauls (date range: {} - {})", - ccte_state._bulletinA.dateRange().begin, ccte_state._bulletinA.dateRange().end); - } - - - // setTelemetryDataUpdateInterval(_mountConfig.hardwarePollingPeriod()); setTelemetryDataTimeout(_mountConfig.movingModelParams().telemetryTimeout); - // std::this_thread::sleep_for(std::chrono::milliseconds(100)); - telemetry_data_t tdata; auto t_err = telemetryData(&tdata); if (t_err) { - logError(gm_class_t::formatError(t_err, "Cannot update telemetry data: ")); + logError(gm_class_t::formatError(t_err, "Cannot get initial telemetry data: ")); return t_err; }