...
This commit is contained in:
@@ -51,7 +51,7 @@ struct MccTelemetryCategory : public std::error_category {
|
||||
|
||||
const char* name() const noexcept
|
||||
{
|
||||
return "ALTITUDE-LIMIT-PZ";
|
||||
return "MCC-TELEMETRY";
|
||||
}
|
||||
|
||||
std::string message(int ec) const
|
||||
@@ -160,6 +160,20 @@ public:
|
||||
if (_data.target.pair_kind == MccCoordPairKind::COORDS_KIND_RADEC_ICRS) {
|
||||
_data.target.X = _data.target.RA_ICRS;
|
||||
_data.target.Y = _data.target.DEC_ICRS;
|
||||
} else if (_data.target.pair_kind == MccCoordPairKind::COORDS_KIND_AZZD) {
|
||||
_data.target.X = _data.target.AZ;
|
||||
_data.target.Y = _data.target.ZD;
|
||||
} else if (_data.target.pair_kind == MccCoordPairKind::COORDS_KIND_AZALT) {
|
||||
_data.target.X = _data.target.AZ;
|
||||
_data.target.Y = _data.target.ALT;
|
||||
} else if (_data.target.pair_kind == MccCoordPairKind::COORDS_KIND_HADEC_APP) {
|
||||
_data.target.X = _data.target.HA;
|
||||
_data.target.Y = _data.target.DEC_APP;
|
||||
} else if (_data.target.pair_kind == MccCoordPairKind::COORDS_KIND_RADEC_APP) {
|
||||
_data.target.X = _data.target.RA_APP;
|
||||
_data.target.Y = _data.target.DEC_APP;
|
||||
} else {
|
||||
return MccTelemetryErrorCode::ERROR_UNSUPPORTED_COORD_PAIR;
|
||||
}
|
||||
|
||||
auto ccte_err = controls->transformCoordinates(_data.target, &_data.target);
|
||||
@@ -178,21 +192,24 @@ public:
|
||||
if (_data.target.pair_kind != MccCoordPairKind::COORDS_KIND_RADEC_ICRS) {
|
||||
// fixed apparent coordinates (AZZD or HADEC)
|
||||
// needs to compute ICRS
|
||||
if (_data.target.pair_kind == MccCoordPairKind::COORDS_KIND_AZZD) {
|
||||
_data.target.X = _data.target.AZ;
|
||||
_data.target.Y = _data.target.ZD;
|
||||
} else if (_data.target.pair_kind == MccCoordPairKind::COORDS_KIND_AZALT) {
|
||||
_data.target.X = _data.target.AZ;
|
||||
_data.target.Y = _data.target.ALT;
|
||||
} else if (_data.target.pair_kind == MccCoordPairKind::COORDS_KIND_HADEC_APP) {
|
||||
_data.target.X = _data.target.HA;
|
||||
_data.target.Y = _data.target.DEC_APP;
|
||||
} else if (_data.target.pair_kind == MccCoordPairKind::COORDS_KIND_RADEC_APP) {
|
||||
_data.target.X = _data.target.RA_APP;
|
||||
_data.target.Y = _data.target.DEC_APP;
|
||||
} else {
|
||||
return MccTelemetryErrorCode::ERROR_UNSUPPORTED_COORD_PAIR;
|
||||
}
|
||||
// (.X and .Y are already assigned above!)
|
||||
|
||||
|
||||
// if (_data.target.pair_kind == MccCoordPairKind::COORDS_KIND_AZZD) {
|
||||
// _data.target.X = _data.target.AZ;
|
||||
// _data.target.Y = _data.target.ZD;
|
||||
// } else if (_data.target.pair_kind == MccCoordPairKind::COORDS_KIND_AZALT) {
|
||||
// _data.target.X = _data.target.AZ;
|
||||
// _data.target.Y = _data.target.ALT;
|
||||
// } else if (_data.target.pair_kind == MccCoordPairKind::COORDS_KIND_HADEC_APP) {
|
||||
// _data.target.X = _data.target.HA;
|
||||
// _data.target.Y = _data.target.DEC_APP;
|
||||
// } else if (_data.target.pair_kind == MccCoordPairKind::COORDS_KIND_RADEC_APP) {
|
||||
// _data.target.X = _data.target.RA_APP;
|
||||
// _data.target.Y = _data.target.DEC_APP;
|
||||
// } else {
|
||||
// return MccTelemetryErrorCode::ERROR_UNSUPPORTED_COORD_PAIR;
|
||||
// }
|
||||
|
||||
MccCelestialPoint pt{.pair_kind = MccCoordPairKind::COORDS_KIND_RADEC_ICRS};
|
||||
ccte_err = controls->transformCoordinates(_data.target, &pt);
|
||||
@@ -228,76 +245,6 @@ public:
|
||||
return MccTelemetryErrorCode::ERROR_OK;
|
||||
};
|
||||
|
||||
/*
|
||||
_updateTargetFunc = [controls, this](bool only_hw, std::stop_token stop_token) -> error_t {
|
||||
if (!only_hw) {
|
||||
//
|
||||
// compute apparent coordinates
|
||||
// ICRS coordinates of the taget must be already set
|
||||
//
|
||||
_data.target.time_point =
|
||||
std::chrono::time_point_cast<typename decltype(_data.target.time_point)::duration>(
|
||||
_data.time_point);
|
||||
|
||||
_data.target.pair_kind = MccCoordPairKind::COORDS_KIND_RADEC_ICRS;
|
||||
_data.target.X = _data.target.RA_ICRS;
|
||||
_data.target.Y = _data.target.DEC_ICRS;
|
||||
|
||||
// update apparent cordinates
|
||||
auto ccte_err = controls->transformCoordinates(_data.target, &_data.target);
|
||||
if (ccte_err) {
|
||||
return mcc_deduce_error_code(ccte_err, MccTelemetryErrorCode::ERROR_COORD_TRANSFORM);
|
||||
}
|
||||
}
|
||||
|
||||
if (stop_token.stop_requested()) {
|
||||
return MccTelemetryErrorCode::ERROR_UPDATE_STOPPED;
|
||||
}
|
||||
|
||||
|
||||
typename pcm_t::error_t pcm_err;
|
||||
|
||||
MccPCMResult pcm_res;
|
||||
|
||||
// MccCelestialPoint pt;
|
||||
// pt.time_point =
|
||||
// std::chrono::time_point_cast<typename decltype(pt.time_point)::duration>(_data.target.time_point);
|
||||
|
||||
pcm_err = controls->computeInversePCM(_data, &pcm_res, &_data);
|
||||
|
||||
// if constexpr (mccIsEquatorialMount(pcm_t::mountType)) {
|
||||
// pcm_err = pcm->computeInversePCM(_data, &pcm_res, &_data);
|
||||
|
||||
// pt.pair_kind = MccCoordPairKind::COORDS_KIND_HADEC_APP;
|
||||
// pt.X = _data.target.HA;
|
||||
// pt.Y = _data.target.DEC_APP;
|
||||
// pcm_err = pcm->computeInversePCM(std::move(pt), &pcm_res);
|
||||
// if (!pcm_err) {
|
||||
// _data.target.X = _data.target.HA - pcm_res.pcmX;
|
||||
// _data.target.Y = _data.target.DEC_APP - pcm_res.pcmY;
|
||||
// }
|
||||
// } else if constexpr (mccIsAltAzMount(pcm_t::mountType)) {
|
||||
// pt.pair_kind = MccCoordPairKind::COORDS_KIND_AZALT;
|
||||
// pt.X = _data.target.AZ;
|
||||
// pt.Y = _data.target.ALT;
|
||||
// pcm_err = pcm->computeInversePCM(std::move(pt), &pcm_res);
|
||||
// if (!pcm_err) {
|
||||
// _data.target.X = _data.target.AZ - pcm_res.pcmX;
|
||||
// _data.target.Y = _data.target.ALT - pcm_res.pcmY;
|
||||
// }
|
||||
// } else {
|
||||
// static_assert(false, "UNKNOWN MOUNT TYPE!");
|
||||
// }
|
||||
|
||||
if (pcm_err) {
|
||||
return mcc_deduce_error_code(pcm_err, MccTelemetryErrorCode::ERROR_PCM_COMP);
|
||||
}
|
||||
|
||||
|
||||
return MccTelemetryErrorCode::ERROR_OK;
|
||||
};
|
||||
*/
|
||||
|
||||
_updateFunc = [controls, this](std::stop_token stop_token) -> std::error_code {
|
||||
// first, update mount quantities
|
||||
typename hardware_t::hardware_state_t hw_pos;
|
||||
@@ -306,9 +253,9 @@ public:
|
||||
return mcc_deduce_error_code(hw_err, MccTelemetryErrorCode::ERROR_HARDWARE_GETPOS);
|
||||
}
|
||||
|
||||
if (stop_token.stop_requested()) {
|
||||
return MccTelemetryErrorCode::ERROR_UPDATE_STOPPED;
|
||||
}
|
||||
// if (stop_token.stop_requested()) {
|
||||
// return MccTelemetryErrorCode::ERROR_UPDATE_STOPPED;
|
||||
// }
|
||||
|
||||
double eo;
|
||||
|
||||
@@ -323,10 +270,6 @@ public:
|
||||
|
||||
ccte_err = controls->juldayToAppSideral(_data.JD, &_data.LST, true);
|
||||
if (!ccte_err) {
|
||||
if (stop_token.stop_requested()) {
|
||||
return MccTelemetryErrorCode::ERROR_UPDATE_STOPPED;
|
||||
}
|
||||
|
||||
ccte_err = controls->equationOrigins(_data.JD, &eo);
|
||||
}
|
||||
}
|
||||
@@ -335,9 +278,9 @@ public:
|
||||
return mcc_deduce_error_code(ccte_err, MccTelemetryErrorCode::ERROR_COORD_TRANSFORM);
|
||||
}
|
||||
|
||||
if (stop_token.stop_requested()) {
|
||||
return MccTelemetryErrorCode::ERROR_UPDATE_STOPPED;
|
||||
}
|
||||
// if (stop_token.stop_requested()) {
|
||||
// return MccTelemetryErrorCode::ERROR_UPDATE_STOPPED;
|
||||
// }
|
||||
|
||||
_data.X = (double)hw_pos.X;
|
||||
_data.Y = (double)hw_pos.Y;
|
||||
@@ -350,9 +293,9 @@ public:
|
||||
return mcc_deduce_error_code(pcm_err, MccTelemetryErrorCode::ERROR_PCM_COMP);
|
||||
}
|
||||
|
||||
if (stop_token.stop_requested()) {
|
||||
return MccTelemetryErrorCode::ERROR_UPDATE_STOPPED;
|
||||
}
|
||||
// if (stop_token.stop_requested()) {
|
||||
// return MccTelemetryErrorCode::ERROR_UPDATE_STOPPED;
|
||||
// }
|
||||
|
||||
MccCelestialPoint pt{.pair_kind = MccCoordPairKind::COORDS_KIND_AZALT, .time_point = _data.time_point};
|
||||
|
||||
@@ -391,9 +334,9 @@ public:
|
||||
}
|
||||
|
||||
if (!ccte_err) {
|
||||
if (stop_token.stop_requested()) {
|
||||
return MccTelemetryErrorCode::ERROR_UPDATE_STOPPED;
|
||||
}
|
||||
// if (stop_token.stop_requested()) {
|
||||
// return MccTelemetryErrorCode::ERROR_UPDATE_STOPPED;
|
||||
// }
|
||||
|
||||
// to compute refraction coefficients
|
||||
_data.pair_kind = MccCoordPairKind::COORDS_KIND_AZZD;
|
||||
@@ -530,14 +473,18 @@ public:
|
||||
_internalUpdatingFuture = std::async(
|
||||
std::launch::async,
|
||||
[this](std::stop_token stop_token) -> error_t {
|
||||
// while (!stop_token.stop_requested()) {
|
||||
while (true) {
|
||||
while (!stop_token.stop_requested()) {
|
||||
// while (true) {
|
||||
_lastUpdateError = updateTelemetryData(defaultInternalUpdateTimeout);
|
||||
if (_lastUpdateError) {
|
||||
*_internalUpdating = false;
|
||||
return _lastUpdateError;
|
||||
}
|
||||
|
||||
// auto nn = std::this_thread::get_id();
|
||||
|
||||
// std::this_thread::sleep_for(_currentUpdateInterval);
|
||||
|
||||
{
|
||||
std::lock_guard lock{*_currentUpdateIntervalMutex};
|
||||
|
||||
@@ -592,28 +539,30 @@ public:
|
||||
|
||||
error_t updateTelemetryData(traits::mcc_time_duration_c auto const& timeout)
|
||||
{
|
||||
std::lock_guard thread_lock{*_updateMutex};
|
||||
{
|
||||
std::lock_guard thread_lock{*_updateMutex};
|
||||
|
||||
std::stop_source stop_source;
|
||||
std::stop_source stop_source;
|
||||
|
||||
*_isDataUpdated = false;
|
||||
*_isDataUpdated = false;
|
||||
|
||||
std::future<error_t> update_ft = std::async(std::launch::async, _updateFunc, stop_source.get_token());
|
||||
// std::future<error_t> update_ft =
|
||||
// std::async(std::launch::async, _updateFunc, _internalUpdatingStopSource.get_token());
|
||||
auto status = update_ft.wait_for(timeout);
|
||||
std::future<error_t> update_ft = std::async(std::launch::async, _updateFunc, stop_source.get_token());
|
||||
// std::future<error_t> update_ft =
|
||||
// std::async(std::launch::async, _updateFunc, _internalUpdatingStopSource.get_token());
|
||||
auto status = update_ft.wait_for(timeout);
|
||||
|
||||
if (status == std::future_status::ready) {
|
||||
*_isDataUpdated = true;
|
||||
_lastUpdateError = update_ft.get();
|
||||
} else if (status == std::future_status::deferred) { // std::async was invoked in this thread, get result
|
||||
_lastUpdateError = update_ft.get();
|
||||
if (!_lastUpdateError) {
|
||||
if (status == std::future_status::ready) {
|
||||
*_isDataUpdated = true;
|
||||
_lastUpdateError = update_ft.get();
|
||||
} else if (status == std::future_status::deferred) { // std::async was invoked in this thread, get result
|
||||
_lastUpdateError = update_ft.get();
|
||||
if (!_lastUpdateError) {
|
||||
*_isDataUpdated = true;
|
||||
}
|
||||
} else { // timeout
|
||||
stop_source.request_stop();
|
||||
_lastUpdateError = MccTelemetryErrorCode::ERROR_DATA_TIMEOUT;
|
||||
}
|
||||
} else { // timeout
|
||||
stop_source.request_stop();
|
||||
_lastUpdateError = MccTelemetryErrorCode::ERROR_DATA_TIMEOUT;
|
||||
}
|
||||
|
||||
// unblock waiting threads even in the case of timeout!
|
||||
@@ -631,7 +580,7 @@ public:
|
||||
|
||||
std::unique_lock ulock(*_updateMutex);
|
||||
|
||||
auto res = _updateCondVar->wait_for(ulock, timeout, [this]() -> bool { return _isDataUpdated.get(); });
|
||||
auto res = _updateCondVar->wait_for(ulock, timeout, [this]() -> bool { return *_isDataUpdated; });
|
||||
if (!res) {
|
||||
return MccTelemetryErrorCode::ERROR_DATA_TIMEOUT;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user