This commit is contained in:
2026-02-26 18:28:47 +03:00
parent 23b8b0eb9d
commit 5c8d9bd5f4
3 changed files with 80 additions and 23 deletions

View File

@@ -475,6 +475,10 @@ Asibfm700Mount::error_t Asibfm700Mount::slewingImpl(bool slew_and_stop)
_enteredBackupCoordinates = getPointingTarget();
typename telemetry_t::telemetry_data_t tdata;
mcc::impl::MccSkyPoint start_target;
mcc::impl::MccSkyHADEC_OBS init_target;
decltype(tdata.targetXY) start_targetXY;
*_lastMountError = telemetryData(&tdata);
if (_lastMountError->load()) {
errorLogging("An error occured while telemetry requesting: ", _lastMountError->load());
@@ -486,6 +490,18 @@ Asibfm700Mount::error_t Asibfm700Mount::slewingImpl(bool slew_and_stop)
return _lastMountError->load();
}
if (slew_and_stop) {
// store initial target coordinates in the "slew-and-stop" mode
// and use it below!
start_target = tdata.targetPos;
init_target.setX(tdata.targetPos.co_lon());
init_target.setY(tdata.targetPos.co_lat());
start_targetXY = tdata.targetXY;
}
logInfo("Start slewing in mode '{}'", slew_and_stop ? "SLEW-AND-STOP" : "SLEW-AND-TRACK");
logInfo(" slewing process timeout: {} secs", _currentMovementParams.slewTimeout.count());
logInfo(" slewing tolerance radius: {} arcsecs",
@@ -544,6 +560,11 @@ Asibfm700Mount::error_t Asibfm700Mount::slewingImpl(bool slew_and_stop)
mcc::impl::MccSkyPoint::dist_result_t dist;
while (!_stopMovementRequest->load()) {
if ((std::chrono::steady_clock::now() - start_point) > getMovementParams().slewTimeout) {
*_lastMountError = mcc::impl::MccGenericMovementControlsErrorCode::ERROR_SLEW_TIMEOUT;
break;
}
*_lastMountError = telemetryData(&tdata);
if (_lastMountError->load()) {
@@ -552,10 +573,37 @@ Asibfm700Mount::error_t Asibfm700Mount::slewingImpl(bool slew_and_stop)
break;
}
hw_state.XY.setX(tdata.targetXY.x());
hw_state.XY.setY(tdata.targetXY.y());
if (last_hw_time >= tdata.hwState.XY.epoch().UTC()) {
logTrace("\nSame hardware timepoint! Just continue to polling!\n");
last_hw_time = tdata.hwState.XY.epoch().UTC();
auto d = getMovementParams().slewingTelemetryInterval / 3;
if (d.count()) {
std::this_thread::sleep_for(d);
} else {
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
continue;
}
hw_state.XY.setEpoch(ep_t::now());
if (!slew_and_stop) { // update target coordinates only in the "slew-and-track" mode
hw_state.XY.setX(tdata.targetXY.x());
hw_state.XY.setY(tdata.targetXY.y());
} else { // restore initial target coordinate
init_target.setEpoch(tdata.mountPos.epoch());
tdata.targetPos.from(init_target);
tdata.targetXY = start_targetXY;
tdata.targetXY.setEpoch(tdata.mountPos.epoch());
}
logMountPos(tdata);
if (_stopMovementRequest->load()) { // external stop
@@ -568,16 +616,18 @@ Asibfm700Mount::error_t Asibfm700Mount::slewingImpl(bool slew_and_stop)
// return _lastMountError->load();
}
if ((std::chrono::steady_clock::now() - start_point) > getMovementParams().slewTimeout) {
*_lastMountError = mcc::impl::MccGenericMovementControlsErrorCode::ERROR_SLEW_TIMEOUT;
dist = tdata.mountPos.distance(tdata.targetPos);
if (dist.dist <= getMovementParams().slewToleranceRadius) { // start adjusting (precise pointing)
logInfo("target-to-mount distance is lesser than slew acceptable radius - exit!");
break;
}
dist = tdata.mountPos.distance(tdata.targetPos);
if (dist.dist <= getMovementParams().adjustCoordDiff) { // start adjusting (precise pointing)
*_mountStatus = mount_status_t::MOUNT_STATUS_ADJUSTING;
// LibSidServo.correctTo
*_lastMountError = sendToHardware(hw_state);
if (_lastMountError->load()) {
@@ -613,7 +663,7 @@ Asibfm700Mount::error_t Asibfm700Mount::slewingImpl(bool slew_and_stop)
if (_stopMovementRequest->load()) { // external stop
logWarn("Slewing was stopped!");
*_lastMountError = mcc::impl::MccGenericMovementControlsErrorCode::ERROR_OK;
*_mountStatus = mount_status_t::MOUNT_STATUS_IDLE;
*_mountStatus = mount_status_t::MOUNT_STATUS_STOPPED;
} else {
if (_lastMountError->load()) {
*_mountStatus = mount_status_t::MOUNT_STATUS_ERROR;
@@ -621,6 +671,7 @@ Asibfm700Mount::error_t Asibfm700Mount::slewingImpl(bool slew_and_stop)
logError("Slewing finished with error: {} ({}::{})", err.message(), err.category().name(), err.value());
} else {
logInfo("Slewing finished without errors!");
*_mountStatus = mount_status_t::MOUNT_STATUS_IDLE;
}
}
@@ -632,6 +683,13 @@ Asibfm700Mount::error_t Asibfm700Mount::slewingImpl(bool slew_and_stop)
errorLogging("An error occured while telemetry requesting: ", _lastMountError->load());
} else {
logInfo("Final mount slewing position:");
if (slew_and_stop) { // restore initial target position
init_target.setEpoch(tdata.mountPos.epoch());
tdata.targetPos.from(init_target);
tdata.targetXY = start_targetXY;
}
logMountPos(tdata);
}
}
@@ -755,21 +813,19 @@ Asibfm700Mount::error_t Asibfm700Mount::trackingImpl()
std::this_thread::sleep_for(_currentMovementParams.trackingTelemetryInterval);
}
if (_stopMovementRequest->load()) { // external stop
logWarn("Tracking was stopped!");
logWarn("Tracking was stopped!");
if (_lastMountError->load()) {
*_mountStatus = mount_status_t::MOUNT_STATUS_ERROR;
auto err = _lastMountError->load();
logError("Tracking finished with error: {} ({}::{})", err.message(), err.category().name(), err.value());
} else { // ???!!!!!
*_lastMountError = mcc::impl::MccGenericMovementControlsErrorCode::ERROR_OK;
logInfo("Tracking finished without errors!");
*_mountStatus = mount_status_t::MOUNT_STATUS_IDLE;
} else {
if (_lastMountError->load()) {
*_mountStatus = mount_status_t::MOUNT_STATUS_ERROR;
auto err = _lastMountError->load();
logError("Tracking finished with error: {} ({}::{})", err.message(), err.category().name(), err.value());
} else { // ???!!!!!
logInfo("Tracking finished without errors!");
}
}
bool ok = _pathFile.saveToFile(_currentMovementParams.trackingPathFilename, std::ios_base::app);
bool ok = _pathFile.saveToFile(_currentMovementParams.trackingPathFilename, std::ios::out | std::ios::app);
if (!ok && !_currentMovementParams.trackingPathFilename.empty()) {
logError("Cannot save trajectory file!");
}