This commit is contained in:
Timur A. Fatkhullin
2025-08-31 01:54:15 +03:00
parent 4696daa2ee
commit c2627ecd89
11 changed files with 324 additions and 180 deletions

View File

@@ -18,7 +18,7 @@ enum class MccSimpleTrackingModelErrorCode : int {
ERROR_HW_GETSTATE,
ERROR_HW_SETSTATE,
ERROR_PCM_COMP,
ERROR_TELEMETRY_TIMEOUT,
ERROR_GET_TELEMETRY,
ERROR_PZONE_CONTAINER_COMP,
ERROR_IN_PZONE,
ERROR_NEAR_PZONE,
@@ -80,11 +80,9 @@ public:
// compute position in future
auto err = hardware->hardwareGetState(&hw_state);
if (err) {
return mcc_deduce_error(err, MccSimpleTrackingModelErrorCode::ERROR_HW_GETSTATE);
return mcc_deduce_error<error_t>(err, MccSimpleTrackingModelErrorCode::ERROR_HW_GETSTATE);
}
cpt.time_point = std::chrono::time_point_cast<decltype(cpt.time_point)>(hw_state.time_point);
if constexpr (mccIsEquatorialMount(PcmT::mountType)) {
cpt.pair_kind = MccCoordPairKind::COORDS_KIND_HADEC_APP;
} else if constexpr (mccIsAltAzMount(PcmT::mountType)) {
@@ -94,62 +92,94 @@ public:
static_assert(false, "UNKNOW MOUNT TYPE!");
}
cpt.X = hw_state.X;
cpt.Y = hw_state.Y;
struct {
double dx, dy;
} pcm_res;
auto pcm_err = pcm->computePCM(cpt, &pcm_res);
if (pcm_err) {
return mcc_deduce_error(pcm_err, MccSimpleTrackingModelErrorCode::ERROR_PCM_COMP);
MccTelemetryData tdata;
auto t_err = telemetry->waitForTelemetryData(&tdata, _currentTrackParams.telemetryTimeout);
if (t_err) {
return mcc_deduce_error<error_t>(t_err, MccSimpleTrackingModelErrorCode::ERROR_GET_TELEMETRY);
}
// to celestial coordinates
cpt.X += pcm_res.dx;
cpt.Y += pcm_res.dy;
mcc_tp2tp(tdata.time_point, cpt.time_point);
std::vector<std::chrono::duration<double>> pz_timeto; // in seconds
std::chrono::duration<double> min_time{0.0};
std::vector<MccCelestialPoint> intsc_pt(pz_cont->sizePZones(), cpt);
// compute intersection points with the prohibited zones
auto pz_err = pz_cont->intersectPZone(tdata, &intsc_pt);
if (pz_err) {
return mcc_deduce_error<error_t>(pz_err, MccSimpleTrackingModelErrorCode::ERROR_PZONE_CONTAINER_COMP);
}
if constexpr (mccIsEquatorialMount(PcmT::mountType)) {
cpt.pair_kind = MccCoordPairKind::COORDS_KIND_HADEC_APP;
double dha_min = 0.0, dha;
// find the closest pzone
for (auto& ipt : intsc_pt) {
if (std::isfinite(ipt.X) && std::isfinite(ipt.Y)) {
dha = ipt.X - tdata.HA;
if (dha < 0.0) {
dha += std::numbers::pi * 2.0;
}
if (dha < dha_min) {
dha_min = dha;
cpt.X = ipt.X;
cpt.Y = ipt.Y;
}
}
}
if (utils::isEqual(dha_min, 0.0)) { // no intersections
cpt.X = tdata.HA - 1.0_mins;
cpt.Y = tdata.DEC_APP;
}
MccPCMResult pcm_inv_res;
// endpoint of the mount moving
auto pcm_err = pcm->computeInversePCM(cpt, &pcm_inv_res, &hw_state);
if (pcm_err) {
return mcc_deduce_error<error_t>(pcm_err, MccSimpleTrackingModelErrorCode::ERROR_PCM_COMP);
}
// just set sideral rate once
// hw_state.time_point;
mcc_tp2tp(cpt.time_point, hw_state.time_point);
hw_state.speedX = _currentTrackParams.trackSpeedX;
hw_state.speedY = _currentTrackParams.trackSpeedY;
hw_state.moving_type = HardwareT::hardware_moving_state_t::HW_MOVE_TRACKING;
// start tracking
err = hardware->hardwareSetState(std::move(hw_state));
if (err) {
return mcc_deduce_error(err, MccSimpleTrackingModelErrorCode::ERROR_HW_SETSTATE);
return mcc_deduce_error<error_t>(err, MccSimpleTrackingModelErrorCode::ERROR_HW_SETSTATE);
}
// control prohibited zones
MccTelemetryData tdata;
std::vector<std::chrono::duration<double>> pz_timeto; // in seconds
// std::vector<bool> pz_flags;
// bool inzone_flag;
while (!*_stopTracking) {
auto pz_err = pz_cont->timeToPZone(tdata, &pz_timeto);
// control prohibited zones
pz_err = pz_cont->timeToPZone(tdata, &pz_timeto);
if (pz_err) {
return mcc_deduce_error(pz_err, MccSimpleTrackingModelErrorCode::ERROR_PZONE_CONTAINER_COMP);
return mcc_deduce_error<error_t>(pz_err,
MccSimpleTrackingModelErrorCode::ERROR_PZONE_CONTAINER_COMP);
}
min_time = std::chrono::duration<double>{0};
for (size_t i = 0; i < pz_cont->sizePZones(); ++i) {
if (pz_timeto[i] <= _currentTrackParams.minTimeToPZone) {
return MccSimpleTrackingModelErrorCode::ERROR_NEAR_PZONE;
}
if (pz_timeto[i] < min_time) {
min_time = pz_timeto[i];
}
}
auto t_err = telemetry->waitForTelemetryData(&tdata, _currentTrackParams.telemetryTimeout);
t_err = telemetry->waitForTelemetryData(&tdata, _currentTrackParams.telemetryTimeout);
if (t_err) {
return mcc_deduce_error(t_err, MccSimpleTrackingModelErrorCode::ERROR_TELEMETRY_TIMEOUT);
return mcc_deduce_error<error_t>(t_err, MccSimpleTrackingModelErrorCode::ERROR_GET_TELEMETRY);
}
if (*_stopTracking) {
@@ -161,16 +191,6 @@ public:
// unhandled stop state?!!!
return MccSimpleTrackingModelErrorCode::ERROR_UNEXPECTED_AXIS_RATES;
}
// auto pz_err = mount->inPZone(tdata, &inzone_flag, &pz_flags);
// if (pz_err) {
// return mcc_deduce_error(t_err, MccSimpleTrackingModelErrorCode::ERROR_PZONE_CONTAINER_COMP);
// }
// if (inzone_flag) {
// // logging
// return MccSimpleTrackingModelErrorCode::ERROR_IN_PZONE;
// }
}
return MccSimpleTrackingModelErrorCode::ERROR_OK;