...
This commit is contained in:
parent
00354d9b41
commit
ab49f927fb
@ -12,6 +12,6 @@ set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH})
|
||||
#
|
||||
# ******* C++ PART OF THE PROJECT *******
|
||||
|
||||
add_subdirectory(cxx)
|
||||
# add_subdirectory(cxx)
|
||||
add_subdirectory(mcc)
|
||||
add_subdirectory(asibfm700)
|
||||
|
||||
@ -11,5 +11,6 @@ set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
|
||||
set(ASIBFM700_LIB_SRC asibfm700_common.h asibfm700_servocontroller.h asibfm700_servocontroller.cpp)
|
||||
|
||||
set(ASIBFM700_LIB asibfm700mount)
|
||||
add_library(${ASIBFM700_LIB} STATIC ${ASIBFM700_LIB_SRC})
|
||||
add_library(${ASIBFM700_LIB} STATIC ${ASIBFM700_LIB_SRC}
|
||||
asibfm700_mount.h asibfm700_mount.cpp)
|
||||
target_link_libraries(${ASIBFM700_LIB} PRIVATE mcc1)
|
||||
|
||||
@ -5,9 +5,38 @@
|
||||
|
||||
/* COMMON LIBRARY DEFINITIONS */
|
||||
|
||||
|
||||
#include <mcc_moving_model_common.h>
|
||||
#include <mcc_pcm.h>
|
||||
|
||||
#include "asibfm700_servocontroller.h"
|
||||
|
||||
namespace asibfm700
|
||||
{
|
||||
|
||||
static constexpr mcc::MccMountType asibfm700MountType = mcc::MccMountType::FORK_TYPE;
|
||||
|
||||
struct Asibfm700MountConfig {
|
||||
std::chrono::milliseconds hardwarePollingPeriod{100}; // main cycle period
|
||||
|
||||
// CCTE-related configuration
|
||||
double siteLatitude{43.646711_degs};
|
||||
double siteLongitude{41.440732_degs};
|
||||
double siteElevation{2100.0};
|
||||
double refractWavelength{0.55};
|
||||
|
||||
std::string leapSecondFilename{};
|
||||
std::string bulletinAFilename{};
|
||||
|
||||
|
||||
// PCM-related configuration
|
||||
mcc::MccDefaultPCM<asibfm700MountType>::pcm_data_t pcmData{
|
||||
.type = mcc::MccDefaultPCMType::PCM_TYPE_GEOMETRY,
|
||||
.siteLatitude = siteLatitude,
|
||||
.geomCoefficients = {0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0}};
|
||||
|
||||
AsibFM700ServoController::hardware_config_t servoControllerConfig{};
|
||||
mcc::MccSimpleMovingModelParams movingModelParams{};
|
||||
};
|
||||
|
||||
} // namespace asibfm700
|
||||
|
||||
20
asibfm700/asibfm700_mount.cpp
Normal file
20
asibfm700/asibfm700_mount.cpp
Normal file
@ -0,0 +1,20 @@
|
||||
#include "asibfm700_mount.h"
|
||||
|
||||
namespace asibfm700
|
||||
{
|
||||
|
||||
|
||||
Asibfm700Mount::Asibfm700Mount(Asibfm700MountConfig const& config,
|
||||
std::shared_ptr<spdlog::logger> logger,
|
||||
const auto& pattern_range)
|
||||
: mcc::ccte::erfa::MccCCTE_ERFA({.meteo{.temperature = 10.0, .humidity = 0.5, .pressure = 1010.0},
|
||||
.wavelength = config.refractWavelength,
|
||||
.lat = config.siteLatitude,
|
||||
.lon = config.siteLongitude,
|
||||
.elev = config.siteElevation}),
|
||||
mcc::MccDefaultPCM<asibfm700MountType>(config.pcmData),
|
||||
base_gm_class_t(AsibFM700ServoController{config.servoControllerConfig}, mcc::MccTelemetry{this});
|
||||
{
|
||||
}
|
||||
|
||||
} // namespace asibfm700
|
||||
52
asibfm700/asibfm700_mount.h
Normal file
52
asibfm700/asibfm700_mount.h
Normal file
@ -0,0 +1,52 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
#include <mcc_ccte_erfa.h>
|
||||
#include <mcc_generic_mount.h>
|
||||
#include <mcc_pcm.h>
|
||||
#include <mcc_pzone_container.h>
|
||||
#include <mcc_slewing_model.h>
|
||||
#include <mcc_spdlog.h>
|
||||
#include <mcc_telemetry.h>
|
||||
#include <mcc_tracking_model.h>
|
||||
|
||||
#include "asibfm700_common.h"
|
||||
|
||||
|
||||
|
||||
namespace asibfm700
|
||||
{
|
||||
|
||||
class Asibfm700Mount : protected mcc::ccte::erfa::MccCCTE_ERFA,
|
||||
protected mcc::MccDefaultPCM<asibfm700MountType>,
|
||||
protected AsibFM700ServoController,
|
||||
public mcc::MccGenericMountFSM<AsibFM700ServoController,
|
||||
mcc::MccTelemetry,
|
||||
mcc::MccPZoneContainer<mcc::MccTimeDuration>,
|
||||
mcc::MccSimpleSlewingModel,
|
||||
mcc::MccSimpleTrackingModel,
|
||||
mcc::utils::MccSpdlogLogger>
|
||||
{
|
||||
typedef mcc::MccGenericMountFSM<AsibFM700ServoController,
|
||||
mcc::MccTelemetry,
|
||||
mcc::MccPZoneContainer<mcc::MccTimeDuration>,
|
||||
mcc::MccSimpleSlewingModel,
|
||||
mcc::MccSimpleTrackingModel,
|
||||
mcc::utils::MccSpdlogLogger>
|
||||
base_gm_class_t;
|
||||
|
||||
public:
|
||||
using mcc::ccte::erfa::MccCCTE_ERFA::setStateERFA;
|
||||
using mcc::ccte::erfa::MccCCTE_ERFA::updateBulletinA;
|
||||
using mcc::ccte::erfa::MccCCTE_ERFA::updateLeapSeconds;
|
||||
using mcc::ccte::erfa::MccCCTE_ERFA::updateMeteoERFA;
|
||||
|
||||
Asibfm700Mount(Asibfm700MountConfig const& config,
|
||||
std::shared_ptr<spdlog::logger> logger,
|
||||
const auto& pattern_range = LOGGER_DEFAULT_FORMAT);
|
||||
|
||||
~Asibfm700Mount();
|
||||
};
|
||||
|
||||
|
||||
} // namespace asibfm700
|
||||
@ -53,7 +53,7 @@ class is_error_code_enum<asibfm700::AsibFM700ServoControllerErrorCode> : public
|
||||
namespace asibfm700
|
||||
{
|
||||
|
||||
class AsibFM700ServoController final
|
||||
class AsibFM700ServoController
|
||||
{
|
||||
public:
|
||||
typedef std::error_code error_t;
|
||||
|
||||
@ -39,22 +39,22 @@ find_package(spdlog CONFIG)
|
||||
|
||||
# ******* ERFA LIBRARY *******
|
||||
|
||||
# ExternalProject_Add(erfalib
|
||||
# PREFIX ${CMAKE_BINARY_DIR}/erfa_lib
|
||||
# GIT_REPOSITORY "https://github.com/liberfa/erfa.git"
|
||||
# GIT_TAG "v2.0.1"
|
||||
# UPDATE_COMMAND ""
|
||||
# PATCH_COMMAND ""
|
||||
# # BINARY_DIR erfa_build
|
||||
# # SOURCE_DIR erfa
|
||||
# # INSTALL_DIR
|
||||
# LOG_CONFIGURE 1
|
||||
# CONFIGURE_COMMAND meson setup --reconfigure -Ddefault_library=static -Dbuildtype=release
|
||||
# -Dprefix=${CMAKE_BINARY_DIR}/erfa_lib -Dlibdir= -Dincludedir= -Ddatadir= <SOURCE_DIR>
|
||||
# BUILD_COMMAND ninja -C <BINARY_DIR>
|
||||
# INSTALL_COMMAND meson install -C <BINARY_DIR>
|
||||
# BUILD_BYPRODUCTS ${CMAKE_BINARY_DIR}/erfa_lib/liberfa.a
|
||||
# )
|
||||
ExternalProject_Add(erfalib
|
||||
PREFIX ${CMAKE_BINARY_DIR}/erfa_lib
|
||||
GIT_REPOSITORY "https://github.com/liberfa/erfa.git"
|
||||
GIT_TAG "v2.0.1"
|
||||
UPDATE_COMMAND ""
|
||||
PATCH_COMMAND ""
|
||||
# BINARY_DIR erfa_build
|
||||
# SOURCE_DIR erfa
|
||||
# INSTALL_DIR
|
||||
LOG_CONFIGURE 1
|
||||
CONFIGURE_COMMAND meson setup --reconfigure -Ddefault_library=static -Dbuildtype=release
|
||||
-Dprefix=${CMAKE_BINARY_DIR}/erfa_lib -Dlibdir= -Dincludedir= -Ddatadir= <SOURCE_DIR>
|
||||
BUILD_COMMAND ninja -C <BINARY_DIR>
|
||||
INSTALL_COMMAND meson install -C <BINARY_DIR>
|
||||
BUILD_BYPRODUCTS ${CMAKE_BINARY_DIR}/erfa_lib/liberfa.a
|
||||
)
|
||||
add_library(ERFA_LIB STATIC IMPORTED)
|
||||
set_target_properties(ERFA_LIB PROPERTIES IMPORTED_LOCATION ${CMAKE_BINARY_DIR}/erfa_lib/liberfa.a)
|
||||
add_dependencies(ERFA_LIB erfalib)
|
||||
|
||||
@ -13,11 +13,13 @@ namespace mcc
|
||||
{
|
||||
|
||||
|
||||
/* DEFAULT TIME POINT CLASS */
|
||||
/* DEFAULT TIME-RELATED CLASSES */
|
||||
|
||||
typedef std::chrono::system_clock::time_point MccTimePoint;
|
||||
|
||||
|
||||
typedef std::chrono::duration<double> MccTimeDuration; // seconds as floating-point value
|
||||
|
||||
template <traits::mcc_time_duration_c DT>
|
||||
static constexpr DT mcc_infinite_duration_v =
|
||||
std::floating_point<typename DT::rep> ? DT{std::numeric_limits<typename DT::rep>::infinity()}
|
||||
|
||||
@ -181,7 +181,8 @@ concept mcc_refract_model_c = requires(const T t_const) {
|
||||
|
||||
template <typename T>
|
||||
concept mcc_celestial_point_c = requires(T t) {
|
||||
requires std::same_as<decltype(t.pair_kind), MccCoordPairKind>; // type of given coordinate pair
|
||||
requires std::same_as<std::remove_const_t<decltype(t.pair_kind)>,
|
||||
MccCoordPairKind>; // type of given coordinate pair (it may be even static constexpr value)
|
||||
|
||||
requires mcc_time_point_c<decltype(t.time_point)>; // time point for given coordinates
|
||||
|
||||
@ -416,11 +417,11 @@ concept mcc_hardware_c = requires(T t, const T t_const) {
|
||||
{ t_const.hardwareName() } -> std::formattable<char>;
|
||||
|
||||
// the 'T' class must contain static constexpr member of 'MccMountType' type
|
||||
requires std::same_as<decltype(T::mountType), const MccMountType>;
|
||||
[]() {
|
||||
static constexpr MccMountType val = T::mountType;
|
||||
return val;
|
||||
}(); // to ensure 'mountType' can be used in compile-time context
|
||||
// requires std::same_as<decltype(T::mountType), const MccMountType>;
|
||||
// []() {
|
||||
// static constexpr MccMountType val = T::mountType;
|
||||
// return val;
|
||||
// }(); // to ensure 'mountType' can be used in compile-time context
|
||||
|
||||
|
||||
// a type that defines at least HW_MOVE_STOPPED, HW_MOVE_SLEWING, HW_MOVE_ADJUSTING, HW_MOVE_TRACKING
|
||||
|
||||
@ -26,6 +26,8 @@ enum class MccSimpleTrackingModelErrorCode : int {
|
||||
ERROR_NEAR_PZONE,
|
||||
ERROR_TIMEOUT,
|
||||
ERROR_UNEXPECTED_AXIS_RATES,
|
||||
ERROR_ALREADY_TRACK,
|
||||
ERROR_ALREADY_STOPPED,
|
||||
ERROR_STOPPED
|
||||
};
|
||||
|
||||
@ -59,6 +61,8 @@ public:
|
||||
MccSimpleTrackingModel(CONTROLS_T* controls)
|
||||
: _stopTracking(new std::atomic_bool()), _currentParamsMutex(new std::mutex())
|
||||
{
|
||||
*_stopTracking = true;
|
||||
|
||||
_trackingFunc = [controls, this]() -> error_t {
|
||||
typename CONTROLS_T::hardware_state_t hw_state;
|
||||
|
||||
@ -78,6 +82,7 @@ public:
|
||||
|
||||
auto t_err = controls->telemetryData(&tdata);
|
||||
if (t_err) {
|
||||
*_stopTracking = true;
|
||||
return mcc_deduce_error<error_t>(t_err, MccSimpleTrackingModelErrorCode::ERROR_GET_TELEMETRY);
|
||||
}
|
||||
|
||||
@ -165,6 +170,7 @@ public:
|
||||
|
||||
auto pz_err = update_pzones_ipoint();
|
||||
if (pz_err) {
|
||||
*_stopTracking = true;
|
||||
return mcc_deduce_error<error_t>(pz_err, MccSimpleTrackingModelErrorCode::ERROR_PZONE_CONTAINER_COMP);
|
||||
}
|
||||
|
||||
@ -175,6 +181,7 @@ public:
|
||||
|
||||
auto ccte_err = target_point(&target_in_future_pt);
|
||||
if (ccte_err) {
|
||||
*_stopTracking = true;
|
||||
return mcc_deduce_error(ccte_err, MccSimpleTrackingModelErrorCode::ERROR_CCTE);
|
||||
}
|
||||
|
||||
@ -187,6 +194,7 @@ public:
|
||||
// move mount
|
||||
auto hw_err = controls->hardwareSetState(hw_state);
|
||||
if (hw_err) {
|
||||
*_stopTracking = true;
|
||||
return mcc_deduce_error<error_t>(hw_err, MccSimpleTrackingModelErrorCode::ERROR_HW_SETSTATE);
|
||||
}
|
||||
|
||||
@ -201,6 +209,7 @@ public:
|
||||
t_err = controls->waitForTelemetryData(&tdata, _currentParams.telemetryTimeout);
|
||||
|
||||
if (t_err) {
|
||||
*_stopTracking = true;
|
||||
return mcc_deduce_error<error_t>(t_err, MccSimpleTrackingModelErrorCode::ERROR_GET_TELEMETRY);
|
||||
}
|
||||
}
|
||||
@ -211,9 +220,11 @@ public:
|
||||
|
||||
// control prohibited zones
|
||||
if (mcc_is_near_pzones(controls, tdata, _currentParams.minTimeToPZone, pz_err)) {
|
||||
*_stopTracking = true;
|
||||
return MccSimpleTrackingModelErrorCode::ERROR_NEAR_PZONE;
|
||||
}
|
||||
if (pz_err) {
|
||||
*_stopTracking = true;
|
||||
return mcc_deduce_error<error_t>(pz_err,
|
||||
MccSimpleTrackingModelErrorCode::ERROR_PZONE_CONTAINER_COMP);
|
||||
}
|
||||
@ -234,6 +245,7 @@ public:
|
||||
if ((now - last_ipzone_update_tp) < _currentParams.updatingPZoneInterval) {
|
||||
pz_err = update_pzones_ipoint();
|
||||
if (pz_err) {
|
||||
*_stopTracking = true;
|
||||
return mcc_deduce_error<error_t>(
|
||||
pz_err, MccSimpleTrackingModelErrorCode::ERROR_PZONE_CONTAINER_COMP);
|
||||
}
|
||||
@ -242,6 +254,7 @@ public:
|
||||
// compute new target-in-future point
|
||||
auto ccte_err = target_point(&target_in_future_pt);
|
||||
if (ccte_err) {
|
||||
*_stopTracking = true;
|
||||
return mcc_deduce_error(ccte_err, MccSimpleTrackingModelErrorCode::ERROR_CCTE);
|
||||
}
|
||||
}
|
||||
@ -250,6 +263,7 @@ public:
|
||||
hw_state.moving_state = CONTROLS_T::hardware_moving_state_t::HW_MOVE_Tracking;
|
||||
hw_err = controls->hardwareSetState(hw_state);
|
||||
if (hw_err) {
|
||||
*_stopTracking = true;
|
||||
return mcc_deduce_error<error_t>(hw_err, MccSimpleTrackingModelErrorCode::ERROR_HW_SETSTATE);
|
||||
}
|
||||
}
|
||||
@ -266,13 +280,21 @@ public:
|
||||
|
||||
error_t trackTarget()
|
||||
{
|
||||
if (!(*_stopTracking)) { // already tracking
|
||||
return MccSimpleTrackingModelErrorCode::ERROR_ALREADY_TRACK;
|
||||
}
|
||||
|
||||
*_stopTracking = false;
|
||||
|
||||
return _trackingFunc();
|
||||
}
|
||||
|
||||
error_t stoptTracking()
|
||||
error_t stopTracking()
|
||||
{
|
||||
if (*_stopTracking) { // already stopped
|
||||
return MccSimpleTrackingModelErrorCode::ERROR_ALREADY_STOPPED;
|
||||
}
|
||||
|
||||
*_stopTracking = true;
|
||||
|
||||
return MccSimpleTrackingModelErrorCode::ERROR_OK;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user