diff --git a/mcc/mcc_slewing_model.h b/mcc/mcc_slewing_model.h index 84dd657..c95a8d5 100644 --- a/mcc/mcc_slewing_model.h +++ b/mcc/mcc_slewing_model.h @@ -204,7 +204,7 @@ public: mcc::MccAngle{tdata.target.ZD}.sexagesimal(), mcc::MccAngle{tdata.target.ALT}.sexagesimal())); - logger.logError(std::format(" X-enc, Y-enc: {}, {}", mcc::MccAngle{tdata.target.X}.sexagesimal(), + logger.logError(std::format(" hardware X, Y: {}, {}", mcc::MccAngle{tdata.target.X}.sexagesimal(), mcc::MccAngle{tdata.target.Y}.sexagesimal())); return MccSimpleSlewingModelErrorCode::ERROR_TARGET_IN_PZONE; diff --git a/mcc/mcc_tracking_model.h b/mcc/mcc_tracking_model.h index 8009e73..80d4d1e 100644 --- a/mcc/mcc_tracking_model.h +++ b/mcc/mcc_tracking_model.h @@ -22,6 +22,7 @@ enum class MccSimpleTrackingModelErrorCode : int { ERROR_DIST_TELEMETRY, ERROR_PZONE_CONTAINER_COMP, ERROR_NEAR_PZONE, + ERROR_IN_PZONE, ERROR_ALREADY_TRACK, ERROR_ALREADY_STOPPED, ERROR_STOPPED @@ -78,6 +79,8 @@ struct MccSimpleTrackingModelCategory : public std::error_category { return "pzone container computation error"; case MccSimpleTrackingModelErrorCode::ERROR_NEAR_PZONE: return "near prohibited zone"; + case MccSimpleTrackingModelErrorCode::ERROR_IN_PZONE: + return "in prohibited zone"; case MccSimpleTrackingModelErrorCode::ERROR_ALREADY_TRACK: return "already tracking"; case MccSimpleTrackingModelErrorCode::ERROR_ALREADY_STOPPED: @@ -121,7 +124,7 @@ public: *_stopTracking = true; - _trackingFunc = [logger = std::move(logger), controls, this]() -> error_t { + _trackingFunc = [logger = std::move(logger), controls, this]() mutable -> error_t { typename CONTROLS_T::hardware_state_t hw_state; MccTelemetryData tdata; @@ -133,7 +136,7 @@ public: } else if constexpr (mccIsAltAzMount(CONTROLS_T::mountType)) { target_in_future_pt.pair_kind = MccCoordPairKind::COORDS_KIND_AZZD; } else { - static_assert(false, "UNKNOW MOUNT TYPE!"); + static_assert(false, "UNKNOWN MOUNT TYPE!"); } // double dist, dx, dy; @@ -148,6 +151,28 @@ public: return mcc_deduce_error_code(t_err, MccSimpleTrackingModelErrorCode::ERROR_GET_TELEMETRY); } + bool in_zone; + auto pz_err = controls->inPZone(tdata, &in_zone); + if (pz_err) { + return mcc_deduce_error_code(pz_err, MccSimpleTrackingModelErrorCode::ERROR_PZONE_CONTAINER_COMP); + } + + if (in_zone) { + logger.logError("mount current coordinates are in prohibited zone:"); + logger.logError(std::format( + " RA-APP, DEC-APP, HA, LST: {}, {}, {}, {}", mcc::MccAngle{tdata.RA_APP}.sexagesimal(true), + mcc::MccAngle{tdata.DEC_APP}.sexagesimal(), mcc::MccAngle{tdata.HA}.sexagesimal(true), + mcc::MccAngle{tdata.LST}.sexagesimal(true))); + logger.logError(std::format(" AZ, ZD, ALT: {}, {}, {}", mcc::MccAngle{tdata.target.AZ}.sexagesimal(), + mcc::MccAngle{tdata.ZD}.sexagesimal(), + mcc::MccAngle{tdata.ALT}.sexagesimal())); + + logger.logError(std::format(" hardware X, Y: {}, {}", mcc::MccAngle{tdata.X}.sexagesimal(), + mcc::MccAngle{tdata.Y}.sexagesimal())); + + return MccSimpleTrackingModelErrorCode::ERROR_IN_PZONE; + } + bool no_intersects = false; @@ -177,7 +202,7 @@ public: no_intersects = true; } } else { - static_assert(false, "UNKNOW MOUNT TYPE!"); + static_assert(false, "UNKNOWN MOUNT TYPE!"); } return MccSimpleTrackingModelErrorCode::ERROR_OK; @@ -233,7 +258,7 @@ public: }; - auto pz_err = update_pzones_ipoint(); + pz_err = update_pzones_ipoint(); if (pz_err) { *_stopTracking = true; return mcc_deduce_error_code(pz_err, MccSimpleTrackingModelErrorCode::ERROR_PZONE_CONTAINER_COMP); @@ -254,15 +279,31 @@ public: hw_state.speedX = _currentParams.trackSpeedX; hw_state.speedY = _currentParams.trackSpeedY; } + + logger.logTrace("The updated target point:"); + if constexpr (mccIsEquatorialMount(CONTROLS_T::mountType)) { + logger.logTrace(" HA, DEC: {} {}", MccAngle(target_in_future_pt.X).sexagesimal(true), + MccAngle(target_in_future_pt.Y).sexagesimal()); + } else if constexpr (mccIsAltAzMount(CONTROLS_T::mountType)) { + logger.logTrace(" AZ, ZD: {} {}", MccAngle(target_in_future_pt.X).sexagesimal(), + MccAngle(target_in_future_pt.Y).sexagesimal()); + } else { + static_assert(false, "UNKNOWN MOUNT TYPE!"); + } } // move mount + logger.logDebug(std::format("Send to hardware: X = {} degs, Y = {} degs", + mcc::MccAngle{hw_state.X}.degrees(), mcc::MccAngle{hw_state.Y}.degrees())); + auto hw_err = controls->hardwareSetState(hw_state); if (hw_err) { *_stopTracking = true; return mcc_deduce_error_code(hw_err, MccSimpleTrackingModelErrorCode::ERROR_HW_SETSTATE); } + logger.logDebug(" the 'hardwareSetState' method performed successfully!"); + std::chrono::steady_clock::time_point last_corr_tp, last_ipzone_update_tp; last_corr_tp = std::chrono::steady_clock::now(); @@ -281,6 +322,26 @@ public: } } + if constexpr (mccIsEquatorialMount(CONTROLS_T::mountType)) { + logger.logTrace(std::format(" current target: HA = {}, DEC = {}", + mcc::MccAngle(tdata.target.HA).sexagesimal(true), + mcc::MccAngle(tdata.target.DEC_APP).sexagesimal())); + logger.logTrace(std::format(" current mount: HA = {}, DEC = {}", + mcc::MccAngle(tdata.HA).sexagesimal(true), + mcc::MccAngle(tdata.DEC_APP).sexagesimal())); + } else if constexpr (mccIsAltAzMount(CONTROLS_T::mountType)) { + logger.logTrace(std::format(" target: AZ = {}, ZD = {}", + mcc::MccAngle(tdata.target.AZ).sexagesimal(), + mcc::MccAngle(tdata.target.ZD).sexagesimal())); + logger.logTrace(std::format(" mount: AZ = {}, ZD = {}", mcc::MccAngle(tdata.AZ).sexagesimal(), + mcc::MccAngle(tdata.ZD).sexagesimal())); + } + + logger.logTrace(std::format(" mount: speedX = {}/s, speedY = {}/s", + mcc::MccAngleFancyString(tdata.speedX), + mcc::MccAngleFancyString(tdata.speedY))); + + if (*_stopTracking) { break; } @@ -320,10 +381,24 @@ public: *_stopTracking = true; return mcc_deduce_error_code(ccte_err, MccSimpleTrackingModelErrorCode::ERROR_CCTE); } + + logger.logTrace("The updated target point:"); + if constexpr (mccIsEquatorialMount(CONTROLS_T::mountType)) { + logger.logTrace(" HA, DEC: {} {}", MccAngle(target_in_future_pt.X).sexagesimal(true), + MccAngle(target_in_future_pt.Y).sexagesimal()); + } else if constexpr (mccIsAltAzMount(CONTROLS_T::mountType)) { + logger.logTrace(" AZ, ZD: {} {}", MccAngle(target_in_future_pt.X).sexagesimal(), + MccAngle(target_in_future_pt.Y).sexagesimal()); + } else { + static_assert(false, "UNKNOWN MOUNT TYPE!"); + } } } // send corrections + logger.logDebug(std::format("Send to hardware: X = {} degs, Y = {} degs", + mcc::MccAngle{hw_state.X}.degrees(), mcc::MccAngle{hw_state.Y}.degrees())); + hw_state.moving_state = CONTROLS_T::hardware_moving_state_t::HW_MOVE_TRACKING; hw_err = controls->hardwareSetState(hw_state); if (hw_err) { @@ -331,6 +406,9 @@ public: return mcc_deduce_error_code(hw_err, MccSimpleTrackingModelErrorCode::ERROR_HW_SETSTATE); } + logger.logDebug(" the 'hardwareSetState' method performed successfully!"); + + // sleep here { std::lock_guard lock{*_currentParamsMutex};