...
This commit is contained in:
parent
e0c8d8f39b
commit
771619b832
@ -255,6 +255,7 @@ Asibfm700Mount::error_t Asibfm700Mount::initMount()
|
|||||||
|
|
||||||
setStateERFA(std::move(ccte_state));
|
setStateERFA(std::move(ccte_state));
|
||||||
|
|
||||||
|
setTelemetryDataUpdateInterval(_mountConfig.hardwarePollingPeriod());
|
||||||
setTelemetryUpdateTimeout(_mountConfig.movingModelParams().telemetryTimeout);
|
setTelemetryUpdateTimeout(_mountConfig.movingModelParams().telemetryTimeout);
|
||||||
startInternalTelemetryDataUpdating();
|
startInternalTelemetryDataUpdating();
|
||||||
|
|
||||||
|
|||||||
@ -44,8 +44,8 @@ int main(int argc, char* argv[])
|
|||||||
options.positional_help("[endpoint0] [enpoint1] ... [endpointN]");
|
options.positional_help("[endpoint0] [enpoint1] ... [endpointN]");
|
||||||
options.parse_positional({"endpoints"});
|
options.parse_positional({"endpoints"});
|
||||||
|
|
||||||
// asio::io_context ctx(2);
|
asio::io_context ctx(8);
|
||||||
asio::io_context ctx;
|
// asio::io_context ctx;
|
||||||
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -154,12 +154,12 @@ int main(int argc, char* argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
asio::thread_pool pool(5);
|
// asio::thread_pool pool(5);
|
||||||
|
|
||||||
asio::post(pool, [&ctx]() { ctx.run(); });
|
// asio::post(pool, [&ctx]() { ctx.run(); });
|
||||||
|
|
||||||
pool.join();
|
// pool.join();
|
||||||
// ctx.run();
|
ctx.run();
|
||||||
|
|
||||||
} catch (const std::system_error& ex) {
|
} catch (const std::system_error& ex) {
|
||||||
std::cerr << "An error occured: " << ex.code().message() << "\n";
|
std::cerr << "An error occured: " << ex.code().message() << "\n";
|
||||||
|
|||||||
@ -603,10 +603,17 @@ std::string MccAngleFancyString(std::convertible_to<MccAngle> auto const& ang,
|
|||||||
{
|
{
|
||||||
std::string s;
|
std::string s;
|
||||||
|
|
||||||
if (ang < 1.0_arcmins) {
|
double abs_ang;
|
||||||
|
if constexpr (std::is_arithmetic_v<std::decay_t<decltype(ang)>>) {
|
||||||
|
abs_ang = std::abs(ang);
|
||||||
|
} else {
|
||||||
|
abs_ang = std::abs(MccAngle{ang});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (abs_ang < 1.0_arcmins) {
|
||||||
std::format_to(std::back_inserter(s), val_fmt, MccAngle{ang}.arcsecs());
|
std::format_to(std::back_inserter(s), val_fmt, MccAngle{ang}.arcsecs());
|
||||||
s += " arcsecs";
|
s += " arcsecs";
|
||||||
} else if (ang < 1.0_degs) {
|
} else if (abs_ang < 1.0_degs) {
|
||||||
std::format_to(std::back_inserter(s), val_fmt, MccAngle{ang}.arcmins());
|
std::format_to(std::back_inserter(s), val_fmt, MccAngle{ang}.arcmins());
|
||||||
s += " arcmins";
|
s += " arcmins";
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -394,8 +394,20 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
// coordinates transformations
|
// coordinates transformations
|
||||||
|
template <typename ResT>
|
||||||
|
error_t transformCoordinates(mcc_celestial_point_c auto from_pt, ResT* to_pt)
|
||||||
|
requires(mcc_eqt_hrz_coord_c<ResT> || mcc_celestial_point_c<ResT>)
|
||||||
|
{
|
||||||
|
if constexpr (mcc_eqt_hrz_coord_c<ResT>) {
|
||||||
|
return transformCoordinatesEQHR(std::move(from_pt), to_pt);
|
||||||
|
} else if constexpr (mcc_celestial_point_c<ResT>) {
|
||||||
|
return transformCoordinatesCP(std::move(from_pt), to_pt);
|
||||||
|
} else {
|
||||||
|
static_assert(false, "UNSUPPORTED TYPE!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
error_t transformCoordinates(mcc_celestial_point_c auto from_pt, mcc_celestial_point_c auto* to_pt)
|
error_t transformCoordinatesCP(mcc_celestial_point_c auto from_pt, mcc_celestial_point_c auto* to_pt)
|
||||||
{
|
{
|
||||||
error_t ret = MccCCTE_ERFAErrorCode::ERROR_OK;
|
error_t ret = MccCCTE_ERFAErrorCode::ERROR_OK;
|
||||||
|
|
||||||
@ -557,7 +569,7 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
error_t transformCoordinates(mcc_celestial_point_c auto from_pt, mcc_eqt_hrz_coord_c auto* to_pt)
|
error_t transformCoordinatesEQHR(mcc_celestial_point_c auto from_pt, mcc_eqt_hrz_coord_c auto* to_pt)
|
||||||
{
|
{
|
||||||
error_t ret = MccCCTE_ERFAErrorCode::ERROR_OK;
|
error_t ret = MccCCTE_ERFAErrorCode::ERROR_OK;
|
||||||
|
|
||||||
|
|||||||
@ -1059,7 +1059,7 @@ public:
|
|||||||
toSexagesimalHour(bytes, value.RA_ICRS);
|
toSexagesimalHour(bytes, value.RA_ICRS);
|
||||||
std::format_to(std::back_inserter(bytes), "{}", _delimiter);
|
std::format_to(std::back_inserter(bytes), "{}", _delimiter);
|
||||||
|
|
||||||
toSexagesimalDeg(bytes, value.DEC_APP);
|
toSexagesimalDeg(bytes, value.DEC_ICRS);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::format_to(std::back_inserter(bytes), "{}", _delimiter);
|
std::format_to(std::back_inserter(bytes), "{}", _delimiter);
|
||||||
@ -1126,8 +1126,9 @@ public:
|
|||||||
eqhrz_ser.setPrecision(_currentPrec);
|
eqhrz_ser.setPrecision(_currentPrec);
|
||||||
eqhrz_ser(value, bytes);
|
eqhrz_ser(value, bytes);
|
||||||
|
|
||||||
// MccEqtHrzCoordsSerializer{}(value, bytes);
|
|
||||||
std::format_to(std::back_inserter(bytes), "{}", _delimiter);
|
std::format_to(std::back_inserter(bytes), "{}", _delimiter);
|
||||||
|
// toSexagesimalHour(bytes, value.LST);
|
||||||
|
// std::format_to(std::back_inserter(bytes), "{}", _delimiter);
|
||||||
|
|
||||||
// '*3600.0' to express refraction correction in arcseconds!
|
// '*3600.0' to express refraction correction in arcseconds!
|
||||||
toDegrees(bytes, value.speedX, value.speedY, value.pcmX, value.pcmY, value.refCorr * 3600.0);
|
toDegrees(bytes, value.speedX, value.speedY, value.pcmX, value.pcmY, value.refCorr * 3600.0);
|
||||||
@ -1136,8 +1137,6 @@ public:
|
|||||||
pt_ser.setFormat(_currentFormat);
|
pt_ser.setFormat(_currentFormat);
|
||||||
pt_ser.setPrecision(_currentPrec);
|
pt_ser.setPrecision(_currentPrec);
|
||||||
pt_ser(value.target, bytes);
|
pt_ser(value.target, bytes);
|
||||||
|
|
||||||
// MccPointingTargetSerializer{}(value.target, bytes);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -268,6 +268,7 @@ public:
|
|||||||
// re-implements SlewModelT::slewToTarget to fetch input target coordinates from intermediate buffer
|
// re-implements SlewModelT::slewToTarget to fetch input target coordinates from intermediate buffer
|
||||||
error_t slewToTarget(bool slew_and_stop = false)
|
error_t slewToTarget(bool slew_and_stop = false)
|
||||||
{
|
{
|
||||||
|
_enteredTargetCoordiniates.time_point = std::chrono::system_clock::now();
|
||||||
auto err = TelemetryT::setPointingTarget(_enteredTargetCoordiniates);
|
auto err = TelemetryT::setPointingTarget(_enteredTargetCoordiniates);
|
||||||
if (err) {
|
if (err) {
|
||||||
*_mountStatus = mount_status_t::ERROR;
|
*_mountStatus = mount_status_t::ERROR;
|
||||||
@ -287,6 +288,8 @@ public:
|
|||||||
|
|
||||||
if (slew_and_stop) {
|
if (slew_and_stop) {
|
||||||
*_mountStatus = mount_status_t::IDLE;
|
*_mountStatus = mount_status_t::IDLE;
|
||||||
|
} else {
|
||||||
|
s_err = trackTarget();
|
||||||
}
|
}
|
||||||
|
|
||||||
return s_err;
|
return s_err;
|
||||||
|
|||||||
@ -9,7 +9,6 @@
|
|||||||
#include "mcc_defaults.h"
|
#include "mcc_defaults.h"
|
||||||
#include "mcc_generics.h"
|
#include "mcc_generics.h"
|
||||||
#include "mcc_moving_model_common.h"
|
#include "mcc_moving_model_common.h"
|
||||||
#include "mcc_spdlog.h"
|
|
||||||
|
|
||||||
namespace mcc
|
namespace mcc
|
||||||
{
|
{
|
||||||
@ -127,11 +126,80 @@ public:
|
|||||||
|
|
||||||
*_stopSlewing = true;
|
*_stopSlewing = true;
|
||||||
|
|
||||||
|
_checkTargetFunc = [controls, logger, this]() mutable -> error_t {
|
||||||
|
typename CONTROLS_T::error_t t_err;
|
||||||
|
|
||||||
|
MccTelemetryData tdata;
|
||||||
|
bool in_zone;
|
||||||
|
|
||||||
|
t_err = controls->telemetryData(&tdata);
|
||||||
|
|
||||||
|
if (t_err) {
|
||||||
|
return mcc_deduce_error_code(t_err, MccSimpleSlewingModelErrorCode::ERROR_GET_TELEMETRY);
|
||||||
|
}
|
||||||
|
auto pz_err = controls->inPZone(tdata.target, &in_zone);
|
||||||
|
if (pz_err) {
|
||||||
|
return mcc_deduce_error_code(pz_err, MccSimpleSlewingModelErrorCode::ERROR_PZONE_CONTAINER_COMP);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_zone) {
|
||||||
|
logger.logError("target point is in prohibited zone! Entered target coordinates:");
|
||||||
|
logger.logError(std::format(" RA-APP, DEC-APP, HA, LST: {}, {}, {}, {}",
|
||||||
|
mcc::MccAngle{tdata.target.RA_APP}.sexagesimal(true),
|
||||||
|
mcc::MccAngle{tdata.target.DEC_APP}.sexagesimal(),
|
||||||
|
mcc::MccAngle{tdata.target.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.target.ZD}.sexagesimal(),
|
||||||
|
mcc::MccAngle{tdata.target.ALT}.sexagesimal()));
|
||||||
|
|
||||||
|
return MccSimpleSlewingModelErrorCode::ERROR_TARGET_IN_PZONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return MccSimpleSlewingModelErrorCode::ERROR_OK;
|
||||||
|
};
|
||||||
|
|
||||||
_slewingFunc = [controls, logger = std::move(logger), this](bool slew_and_stop) mutable -> error_t {
|
_slewingFunc = [controls, logger = std::move(logger), this](bool slew_and_stop) mutable -> error_t {
|
||||||
// first, check target coordinates
|
// first, check target coordinates
|
||||||
typename CONTROLS_T::error_t t_err;
|
typename CONTROLS_T::error_t t_err;
|
||||||
MccTelemetryData tdata;
|
MccTelemetryData tdata;
|
||||||
|
|
||||||
|
{
|
||||||
|
std::lock_guard lock{*_currentParamsMutex};
|
||||||
|
t_err = controls->telemetryData(&tdata);
|
||||||
|
|
||||||
|
if (t_err) {
|
||||||
|
return mcc_deduce_error_code(t_err, MccSimpleSlewingModelErrorCode::ERROR_GET_TELEMETRY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool in_zone;
|
||||||
|
auto pz_err = controls->inPZone(tdata.target, &in_zone);
|
||||||
|
if (pz_err) {
|
||||||
|
*_stopSlewing = true;
|
||||||
|
return mcc_deduce_error_code(pz_err, MccSimpleSlewingModelErrorCode::ERROR_PZONE_CONTAINER_COMP);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_zone) {
|
||||||
|
*_stopSlewing = true;
|
||||||
|
|
||||||
|
logger.logError("target point is in prohibited zone! Entered target coordinates:");
|
||||||
|
logger.logError(std::format(" RA-APP, DEC-APP, HA, LST: {}, {}, {}, {}",
|
||||||
|
mcc::MccAngle{tdata.target.RA_APP}.sexagesimal(true),
|
||||||
|
mcc::MccAngle{tdata.target.DEC_APP}.sexagesimal(),
|
||||||
|
mcc::MccAngle{tdata.target.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.target.ZD}.sexagesimal(),
|
||||||
|
mcc::MccAngle{tdata.target.ALT}.sexagesimal()));
|
||||||
|
|
||||||
|
return MccSimpleSlewingModelErrorCode::ERROR_TARGET_IN_PZONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*_stopSlewing) {
|
||||||
|
return MccSimpleSlewingModelErrorCode::ERROR_STOPPED;
|
||||||
|
}
|
||||||
|
|
||||||
double braking_accelX, braking_accelY;
|
double braking_accelX, braking_accelY;
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -161,41 +229,6 @@ public:
|
|||||||
logger.logInfo(std::format(" braking acceleration Y: {} degs/s^2 (in config: {} rads/s^2)",
|
logger.logInfo(std::format(" braking acceleration Y: {} degs/s^2 (in config: {} rads/s^2)",
|
||||||
mcc::MccAngle(braking_accelY).degrees(), _currentParams.brakingAccelY));
|
mcc::MccAngle(braking_accelY).degrees(), _currentParams.brakingAccelY));
|
||||||
|
|
||||||
{
|
|
||||||
std::lock_guard lock{*_currentParamsMutex};
|
|
||||||
t_err = controls->telemetryData(&tdata);
|
|
||||||
|
|
||||||
if (t_err) {
|
|
||||||
return mcc_deduce_error_code(t_err, MccSimpleSlewingModelErrorCode::ERROR_GET_TELEMETRY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool in_zone;
|
|
||||||
auto pz_err = controls->inPZone(tdata.target, &in_zone);
|
|
||||||
if (pz_err) {
|
|
||||||
*_stopSlewing = true;
|
|
||||||
return mcc_deduce_error_code(pz_err, MccSimpleSlewingModelErrorCode::ERROR_PZONE_CONTAINER_COMP);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_zone) {
|
|
||||||
*_stopSlewing = true;
|
|
||||||
|
|
||||||
logger.logError("target point is in prohibited zone!");
|
|
||||||
logger.logError(std::format(
|
|
||||||
"RA-APP, DEC-APP, HA, LST: {}, {}, {}, {}", mcc::MccAngle{tdata.target.RA_APP}.sexagesimal(true),
|
|
||||||
mcc::MccAngle{tdata.target.DEC_APP}.sexagesimal(), mcc::MccAngle{tdata.target.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.target.ZD}.sexagesimal(),
|
|
||||||
mcc::MccAngle{tdata.target.ALT}.sexagesimal()));
|
|
||||||
|
|
||||||
return MccSimpleSlewingModelErrorCode::ERROR_TARGET_IN_PZONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*_stopSlewing) {
|
|
||||||
return MccSimpleSlewingModelErrorCode::ERROR_STOPPED;
|
|
||||||
}
|
|
||||||
|
|
||||||
MccCelestialPoint cpt;
|
MccCelestialPoint cpt;
|
||||||
double min_time_to_pzone_in_secs;
|
double min_time_to_pzone_in_secs;
|
||||||
|
|
||||||
@ -207,11 +240,6 @@ public:
|
|||||||
static_assert(false, "UNKNOWN MOUNT TYPE!");
|
static_assert(false, "UNKNOWN MOUNT TYPE!");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*_stopSlewing) {
|
|
||||||
logger.logDebug("slewing was stopped!");
|
|
||||||
return MccSimpleSlewingModelErrorCode::ERROR_STOPPED;
|
|
||||||
}
|
|
||||||
|
|
||||||
typename CONTROLS_T::hardware_state_t hw_state;
|
typename CONTROLS_T::hardware_state_t hw_state;
|
||||||
|
|
||||||
auto hw_err = controls->hardwareGetState(&hw_state);
|
auto hw_err = controls->hardwareGetState(&hw_state);
|
||||||
@ -242,16 +270,18 @@ public:
|
|||||||
logger.logDebug(std::format("Send to hardware: X = {} degs, Y = {} degs",
|
logger.logDebug(std::format("Send to hardware: X = {} degs, Y = {} degs",
|
||||||
mcc::MccAngle{hw_state.X}.degrees(), mcc::MccAngle{hw_state.Y}.degrees()));
|
mcc::MccAngle{hw_state.X}.degrees(), mcc::MccAngle{hw_state.Y}.degrees()));
|
||||||
if constexpr (mccIsEquatorialMount(CONTROLS_T::mountType)) {
|
if constexpr (mccIsEquatorialMount(CONTROLS_T::mountType)) {
|
||||||
logger.logDebug(std::format(" target: HA = {}, DEC = {}",
|
logger.logDebug(std::format(" entered target: HA = {}, DEC = {}",
|
||||||
mcc::MccAngle{tdata.target.DEC_APP}.sexagesimal(),
|
mcc::MccAngle{tdata.target.HA}.sexagesimal(true),
|
||||||
mcc::MccAngle{tdata.target.HA}.sexagesimal(true)));
|
mcc::MccAngle{tdata.target.DEC_APP}.sexagesimal()));
|
||||||
logger.logDebug(std::format(" mount: HA = {}, DEC = {}", mcc::MccAngle{tdata.DEC_APP}.sexagesimal(),
|
logger.logDebug(std::format(" current mount: HA = {}, DEC = {}",
|
||||||
mcc::MccAngle{tdata.HA}.sexagesimal(true)));
|
mcc::MccAngle{tdata.HA}.sexagesimal(true),
|
||||||
|
mcc::MccAngle{tdata.DEC_APP}.sexagesimal()));
|
||||||
} else if constexpr (mccIsAltAzMount(CONTROLS_T::mountType)) {
|
} else if constexpr (mccIsAltAzMount(CONTROLS_T::mountType)) {
|
||||||
logger.logDebug(std::format(" target: AZ = {}, ZD = {}",
|
logger.logDebug(std::format(" entered target: AZ = {}, ZD = {}",
|
||||||
mcc::MccAngle{tdata.target.AZ}.sexagesimal(),
|
mcc::MccAngle{tdata.target.AZ}.sexagesimal(),
|
||||||
mcc::MccAngle{tdata.target.ZD}.sexagesimal()));
|
mcc::MccAngle{tdata.target.ZD}.sexagesimal()));
|
||||||
logger.logDebug(std::format(" mount: AZ = {}, ZD = {}", mcc::MccAngle{tdata.AZ}.sexagesimal(),
|
logger.logDebug(std::format(" current mount: AZ = {}, ZD = {}",
|
||||||
|
mcc::MccAngle{tdata.AZ}.sexagesimal(),
|
||||||
mcc::MccAngle{tdata.ZD}.sexagesimal()));
|
mcc::MccAngle{tdata.ZD}.sexagesimal()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -261,6 +291,8 @@ public:
|
|||||||
return mcc_deduce_error_code(hw_err, MccSimpleSlewingModelErrorCode::ERROR_HW_SETSTATE);
|
return mcc_deduce_error_code(hw_err, MccSimpleSlewingModelErrorCode::ERROR_HW_SETSTATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.logDebug(" the 'hardwareSetState' method performed successfully!");
|
||||||
|
|
||||||
// std::chrono::steady_clock::time_point start_slewing_tp, last_adjust_tp;
|
// std::chrono::steady_clock::time_point start_slewing_tp, last_adjust_tp;
|
||||||
// mcc_tp2tp(hw_state.time_point, start_slewing_tp); // not compiled!!
|
// mcc_tp2tp(hw_state.time_point, start_slewing_tp); // not compiled!!
|
||||||
|
|
||||||
@ -319,10 +351,10 @@ public:
|
|||||||
cpt.Y = -DEG90INRADS;
|
cpt.Y = -DEG90INRADS;
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.logTrace(std::format(" target: HA = {}, DEC = {}",
|
logger.logTrace(std::format(" current target: HA = {}, DEC = {}",
|
||||||
mcc::MccAngle(tdata.target.HA).sexagesimal(true),
|
mcc::MccAngle(tdata.target.HA).sexagesimal(true),
|
||||||
mcc::MccAngle(tdata.target.DEC_APP).sexagesimal()));
|
mcc::MccAngle(tdata.target.DEC_APP).sexagesimal()));
|
||||||
logger.logTrace(std::format(" mount: HA = {}, DEC = {}",
|
logger.logTrace(std::format(" current mount: HA = {}, DEC = {}",
|
||||||
mcc::MccAngle(tdata.HA).sexagesimal(true),
|
mcc::MccAngle(tdata.HA).sexagesimal(true),
|
||||||
mcc::MccAngle(tdata.DEC_APP).sexagesimal()));
|
mcc::MccAngle(tdata.DEC_APP).sexagesimal()));
|
||||||
} else if constexpr (mccIsAltAzMount(CONTROLS_T::mountType)) {
|
} else if constexpr (mccIsAltAzMount(CONTROLS_T::mountType)) {
|
||||||
@ -409,6 +441,8 @@ public:
|
|||||||
*_stopSlewing = true;
|
*_stopSlewing = true;
|
||||||
return mcc_deduce_error_code(hw_err, MccSimpleSlewingModelErrorCode::ERROR_HW_SETSTATE);
|
return mcc_deduce_error_code(hw_err, MccSimpleSlewingModelErrorCode::ERROR_HW_SETSTATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.logDebug(" the 'hardwareSetState' method performed successfully!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -416,6 +450,34 @@ public:
|
|||||||
|
|
||||||
logger.logInfo("Slewing finished");
|
logger.logInfo("Slewing finished");
|
||||||
|
|
||||||
|
// wait for updated telemetry data
|
||||||
|
{
|
||||||
|
std::lock_guard lock{*_currentParamsMutex};
|
||||||
|
|
||||||
|
t_err = controls->waitForTelemetryData(&tdata, _currentParams.telemetryTimeout);
|
||||||
|
|
||||||
|
if (t_err) {
|
||||||
|
*_stopSlewing = true;
|
||||||
|
return mcc_deduce_error_code(t_err, MccSimpleSlewingModelErrorCode::ERROR_GET_TELEMETRY);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if constexpr (mccIsEquatorialMount(CONTROLS_T::mountType)) {
|
||||||
|
logger.logDebug(std::format(" entered target: HA = {}, DEC = {}",
|
||||||
|
mcc::MccAngle{tdata.target.HA}.sexagesimal(true),
|
||||||
|
mcc::MccAngle{tdata.target.DEC_APP}.sexagesimal()));
|
||||||
|
logger.logDebug(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.logDebug(std::format(" entered target: AZ = {}, ZD = {}",
|
||||||
|
mcc::MccAngle{tdata.target.AZ}.sexagesimal(),
|
||||||
|
mcc::MccAngle{tdata.target.ZD}.sexagesimal()));
|
||||||
|
logger.logDebug(std::format(" current mount: AZ = {}, ZD = {}",
|
||||||
|
mcc::MccAngle{tdata.AZ}.sexagesimal(),
|
||||||
|
mcc::MccAngle{tdata.ZD}.sexagesimal()));
|
||||||
|
}
|
||||||
|
|
||||||
return MccSimpleSlewingModelErrorCode::ERROR_OK;
|
return MccSimpleSlewingModelErrorCode::ERROR_OK;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -474,6 +536,7 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
std::function<error_t(bool)> _slewingFunc{};
|
std::function<error_t(bool)> _slewingFunc{};
|
||||||
std::unique_ptr<std::atomic_bool> _stopSlewing;
|
std::unique_ptr<std::atomic_bool> _stopSlewing;
|
||||||
|
std::function<error_t()> _checkTargetFunc{};
|
||||||
|
|
||||||
slewing_params_t _currentParams{};
|
slewing_params_t _currentParams{};
|
||||||
std::unique_ptr<std::mutex> _currentParamsMutex{};
|
std::unique_ptr<std::mutex> _currentParamsMutex{};
|
||||||
|
|||||||
@ -379,31 +379,32 @@ public:
|
|||||||
|
|
||||||
|
|
||||||
// arm internal update loop
|
// arm internal update loop
|
||||||
_internalUpdatingStopSource = std::stop_source{};
|
// _internalUpdatingStopSource = std::stop_source{};
|
||||||
|
|
||||||
_internalUpdatingLoopFuture = std::async(
|
// _internalUpdatingLoopFuture = std::async(
|
||||||
std::launch::async,
|
// std::launch::async,
|
||||||
[this](std::stop_token stoken) {
|
// [this](std::stop_token stoken) {
|
||||||
while (!(*_internalUpdatingLoopStop)) {
|
// while (!(*_internalUpdatingLoopStop)) {
|
||||||
{
|
// {
|
||||||
std::unique_lock ulock(*_internalUpdatingLoopMutex);
|
// std::unique_lock ulock(*_internalUpdatingLoopMutex);
|
||||||
_internalUpdatingLoopCondVar->wait(ulock, [this]() -> bool { return *_dataUpdatingRequested; });
|
// _internalUpdatingLoopCondVar->wait(ulock, [this]() -> bool { return *_dataUpdatingRequested;
|
||||||
}
|
// });
|
||||||
|
// }
|
||||||
|
|
||||||
{
|
// {
|
||||||
std::lock_guard lock_update(*_updateMutex);
|
// std::lock_guard lock_update(*_updateMutex);
|
||||||
|
|
||||||
*_isDataUpdated = false;
|
// *_isDataUpdated = false;
|
||||||
_lastUpdateError = _updateFunc(stoken);
|
// _lastUpdateError = _updateFunc(stoken);
|
||||||
}
|
// }
|
||||||
|
|
||||||
*_isDataUpdated = true;
|
// *_isDataUpdated = true;
|
||||||
|
|
||||||
// unlock all waiting threads
|
// // unlock all waiting threads
|
||||||
_updateCondVar->notify_all();
|
// _updateCondVar->notify_all();
|
||||||
}
|
// }
|
||||||
},
|
// },
|
||||||
_internalUpdatingStopSource.get_token());
|
// _internalUpdatingStopSource.get_token());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -489,38 +490,38 @@ public:
|
|||||||
|
|
||||||
// auto nn = std::this_thread::get_id();
|
// auto nn = std::this_thread::get_id();
|
||||||
|
|
||||||
// std::this_thread::sleep_for(_currentUpdateInterval);
|
std::this_thread::sleep_for(_currentUpdateInterval);
|
||||||
|
|
||||||
{
|
// {
|
||||||
std::lock_guard lock{*_currentUpdateIntervalMutex};
|
// std::lock_guard lock{*_currentUpdateIntervalMutex};
|
||||||
|
|
||||||
// compute it here because of possible changing _currentUpdateInterval
|
// // compute it here because of possible changing _currentUpdateInterval
|
||||||
auto sleep_td = _currentUpdateInterval / internalUpdatingIntervalDiv;
|
// auto sleep_td = _currentUpdateInterval / internalUpdatingIntervalDiv;
|
||||||
|
|
||||||
for (uint16_t i = 0; i < internalUpdatingIntervalDiv - 1; ++i) {
|
// for (uint16_t i = 0; i < internalUpdatingIntervalDiv - 1; ++i) {
|
||||||
if (stop_token.stop_requested()) {
|
// if (stop_token.stop_requested()) {
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
|
|
||||||
std::this_thread::sleep_for(sleep_td);
|
// std::this_thread::sleep_for(sleep_td);
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (stop_token.stop_requested()) {
|
// if (stop_token.stop_requested()) {
|
||||||
break;
|
// break;
|
||||||
}
|
// }
|
||||||
|
|
||||||
if constexpr (std::floating_point<intv_t>) {
|
// if constexpr (std::floating_point<intv_t>) {
|
||||||
std::this_thread::sleep_for(sleep_td);
|
// std::this_thread::sleep_for(sleep_td);
|
||||||
} else {
|
// } else {
|
||||||
auto rem = _currentUpdateInterval % internalUpdatingIntervalDiv;
|
// auto rem = _currentUpdateInterval % internalUpdatingIntervalDiv;
|
||||||
|
|
||||||
if (rem.count()) {
|
// if (rem.count()) {
|
||||||
std::this_thread::sleep_for(rem);
|
// std::this_thread::sleep_for(rem);
|
||||||
} else {
|
// } else {
|
||||||
std::this_thread::sleep_for(sleep_td);
|
// std::this_thread::sleep_for(sleep_td);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
*_internalUpdating = false;
|
*_internalUpdating = false;
|
||||||
@ -546,50 +547,37 @@ public:
|
|||||||
error_t updateTelemetryData(traits::mcc_time_duration_c auto const& timeout)
|
error_t updateTelemetryData(traits::mcc_time_duration_c auto const& timeout)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
std::lock_guard lock(*_internalUpdatingLoopMutex);
|
std::lock_guard thread_lock{*_updateMutex};
|
||||||
*_dataUpdatingRequested = true;
|
|
||||||
}
|
|
||||||
std::unique_lock ulock(*_updateMutex);
|
|
||||||
|
|
||||||
_internalUpdatingLoopCondVar->notify_one();
|
std::stop_source stop_source;
|
||||||
*_dataUpdatingRequested = false;
|
|
||||||
|
|
||||||
bool ok = _updateCondVar->wait_for(ulock, timeout, [this]() -> bool { return *_isDataUpdated; });
|
*_isDataUpdated = false;
|
||||||
if (!ok) {
|
|
||||||
_lastUpdateError = MccTelemetryErrorCode::ERROR_DATA_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) {
|
||||||
|
// *_isDataUpdated = true;
|
||||||
|
// }
|
||||||
|
// } else { // timeout
|
||||||
|
// stop_source.request_stop();
|
||||||
|
// _lastUpdateError = MccTelemetryErrorCode::ERROR_DATA_TIMEOUT;
|
||||||
|
// }
|
||||||
|
|
||||||
|
_lastUpdateError = _updateFunc(_internalUpdatingStopSource.get_token());
|
||||||
|
*_isDataUpdated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// {
|
// unblock waiting threads even in the case of timeout!
|
||||||
// std::lock_guard thread_lock{*_updateMutex};
|
_updateCondVar->notify_all();
|
||||||
|
|
||||||
// std::stop_source stop_source;
|
|
||||||
|
|
||||||
// *_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);
|
|
||||||
|
|
||||||
// // 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;
|
|
||||||
// // }
|
|
||||||
|
|
||||||
// *_isDataUpdated = true;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // unblock waiting threads even in the case of timeout!
|
|
||||||
// _updateCondVar->notify_all();
|
|
||||||
|
|
||||||
// *_isDataUpdated = false;
|
// *_isDataUpdated = false;
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user