...
This commit is contained in:
@@ -12,13 +12,14 @@
|
||||
#include <mcc_spdlog.h>
|
||||
|
||||
#include "asibfm700_servocontroller.h"
|
||||
#include "mcc_ccte_erfa.h"
|
||||
|
||||
namespace asibfm700
|
||||
{
|
||||
|
||||
static constexpr mcc::MccMountType asibfm700MountType = mcc::MccMountType::FORK_TYPE;
|
||||
|
||||
|
||||
typedef mcc::ccte::erfa::MccCCTE_ERFA Asibfm700CCTE;
|
||||
typedef mcc::MccDefaultPCM<asibfm700MountType> Asibfm700PCM;
|
||||
typedef mcc::MccPZoneContainer<mcc::MccTimeDuration> Asibfm700PZoneContainer;
|
||||
typedef mcc::utils::MccSpdlogLogger Asibfm700Logger;
|
||||
|
||||
@@ -115,8 +115,51 @@ Asibfm700Mount::error_t Asibfm700Mount::initMount()
|
||||
if (hw_err) {
|
||||
errorLogging("", hw_err);
|
||||
return hw_err;
|
||||
} else {
|
||||
logInfo("Hardware initialization was performed sucessfully!");
|
||||
}
|
||||
|
||||
logInfo("ERFA engine initialization ...");
|
||||
|
||||
// set ERFA state
|
||||
Asibfm700CCTE::engine_state_t ccte_state{.meteo{},
|
||||
.wavelength = _mountConfig.refractWavelength(),
|
||||
.lat = _mountConfig.siteLatitude(),
|
||||
.lon = _mountConfig.siteLongitude(),
|
||||
.elev = _mountConfig.siteElevation()};
|
||||
|
||||
|
||||
if (!_mountConfig.leapSecondFilename().empty()) { // load leap seconds file
|
||||
logInfo("Loading leap second file: {} ...", _mountConfig.leapSecondFilename());
|
||||
bool ok = ccte_state._leapSeconds.load(_mountConfig.leapSecondFilename());
|
||||
if (ok) {
|
||||
logInfo("Leap second file was loaded successfully (expire date: {})", ccte_state._leapSeconds.expireDate());
|
||||
} else {
|
||||
logError("Leap second file loading failed! Using hardcoded defauls (expire date: {})",
|
||||
ccte_state._leapSeconds.expireDate());
|
||||
}
|
||||
} else {
|
||||
logError("Using hardcoded leap seconds defauls (expire date: {})", ccte_state._leapSeconds.expireDate());
|
||||
}
|
||||
|
||||
if (!_mountConfig.bulletinAFilename().empty()) { // load IERS Bulletin A file
|
||||
logInfo("Loading IERS Bulletin A file: {} ...", _mountConfig.bulletinAFilename());
|
||||
bool ok = ccte_state._bulletinA.load(_mountConfig.bulletinAFilename());
|
||||
if (ok) {
|
||||
logInfo("IERS Bulletin A file was loaded successfully (date range: {} - {})",
|
||||
ccte_state._bulletinA.dateRange().begin, ccte_state._bulletinA.dateRange().end);
|
||||
} else {
|
||||
logError("IERS Bulletin A file loading failed! Using hardcoded defauls (date range: {} - {})",
|
||||
ccte_state._bulletinA.dateRange().begin, ccte_state._bulletinA.dateRange().end);
|
||||
}
|
||||
} else {
|
||||
logError("Using hardcoded IERS Bulletin A defauls (date range: {} - {})",
|
||||
ccte_state._bulletinA.dateRange().begin, ccte_state._bulletinA.dateRange().end);
|
||||
}
|
||||
|
||||
setStateERFA(std::move(ccte_state));
|
||||
|
||||
|
||||
return mcc::MccGenericMountErrorCode::ERROR_OK;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
#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>
|
||||
@@ -19,8 +17,8 @@ namespace asibfm700
|
||||
|
||||
|
||||
|
||||
class Asibfm700Mount : public mcc::ccte::erfa::MccCCTE_ERFA,
|
||||
public mcc::MccDefaultPCM<asibfm700MountType>,
|
||||
class Asibfm700Mount : public Asibfm700CCTE,
|
||||
public Asibfm700PCM,
|
||||
public mcc::MccGenericFsmMount<mcc::MccGenericMount<AsibFM700ServoController,
|
||||
mcc::MccTelemetry,
|
||||
Asibfm700PZoneContainer,
|
||||
@@ -82,10 +80,10 @@ protected:
|
||||
public:
|
||||
using base_gm_class_t::error_t;
|
||||
|
||||
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;
|
||||
using Asibfm700CCTE::setStateERFA;
|
||||
using Asibfm700CCTE::updateBulletinA;
|
||||
using Asibfm700CCTE::updateLeapSeconds;
|
||||
using Asibfm700CCTE::updateMeteoERFA;
|
||||
|
||||
using Asibfm700Logger::logCritical;
|
||||
using Asibfm700Logger::logDebug;
|
||||
|
||||
@@ -5,7 +5,7 @@ namespace asibfm700
|
||||
{
|
||||
|
||||
template <mcc::traits::mcc_range_of_input_char_range R>
|
||||
Asibfm700MountNetserver::Asibfm700MountNetserver(asio::io_context& ctx,
|
||||
Asibfm700MountNetServer::Asibfm700MountNetServer(asio::io_context& ctx,
|
||||
std::shared_ptr<spdlog::logger> logger,
|
||||
const R& pattern_range)
|
||||
: _base_t(ctx, [this](std::string_view msg) { return handleMessage(msg); }, std::move(logger), pattern_range)
|
||||
|
||||
@@ -8,17 +8,93 @@
|
||||
namespace asibfm700
|
||||
{
|
||||
|
||||
class Asibfm700MountNetserver : public mcc::network::MccGenericNetworkServer<Asibfm700Logger>
|
||||
namespace details
|
||||
{
|
||||
|
||||
template <typename VT, size_t N1, size_t N2>
|
||||
static constexpr auto merge_arrays(const std::array<VT, N1>& arr1, const std::array<VT, N2>& arr2)
|
||||
{
|
||||
constexpr auto N = N1 + N2;
|
||||
std::array<VT, N> res;
|
||||
|
||||
for (size_t i = 0; i < N1; ++i) {
|
||||
res[i] = arr1[i];
|
||||
}
|
||||
|
||||
for (size_t i = N1; i < N; ++i) {
|
||||
res[i] = arr2[i - N1];
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
} // namespace details
|
||||
|
||||
constexpr static std::string_view ASIBFM700_COMMPROTO_KEYWORD_METEO_STR{"METEO"};
|
||||
|
||||
struct Asibfm700NetMessageValidKeywords {
|
||||
static constexpr std::array NETMSG_VALID_KEYWORDS =
|
||||
details::merge_arrays(mcc::network::MccNetMessageValidKeywords::NETMSG_VALID_KEYWORDS,
|
||||
std::array{ASIBFM700_COMMPROTO_KEYWORD_METEO_STR});
|
||||
|
||||
// hashes of valid keywords
|
||||
static constexpr std::array NETMSG_VALID_KEYWORD_HASHES = []<size_t... Is>(std::index_sequence<Is...>) {
|
||||
return std::array{mcc::utils::FNV1aHash(NETMSG_VALID_KEYWORDS[Is])...};
|
||||
}(std::make_index_sequence<NETMSG_VALID_KEYWORDS.size()>());
|
||||
|
||||
constexpr static const size_t* isKeywordValid(std::string_view key)
|
||||
{
|
||||
const auto hash = mcc::utils::FNV1aHash(key);
|
||||
|
||||
for (auto const& h : NETMSG_VALID_KEYWORD_HASHES) {
|
||||
if (h == hash) {
|
||||
return &h;
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
}
|
||||
};
|
||||
|
||||
template <mcc::traits::mcc_char_range BYTEREPR_T = std::string_view>
|
||||
class Asibfm700MountNetMessage : public mcc::network::MccNetMessage<BYTEREPR_T, Asibfm700NetMessageValidKeywords>
|
||||
{
|
||||
protected:
|
||||
using base_t = mcc::network::MccNetMessage<BYTEREPR_T, Asibfm700NetMessageValidKeywords>;
|
||||
|
||||
|
||||
public:
|
||||
using base_t::base_t;
|
||||
|
||||
template <typename T>
|
||||
std::expected<T, std::error_code> paramValue(size_t idx)
|
||||
{
|
||||
return paramValue<T>(idx, _defaultDeserilizer);
|
||||
}
|
||||
|
||||
|
||||
|
||||
template <mcc::traits::mcc_input_char_range KT, typename... PTs>
|
||||
std::error_code construct(KT&& key, PTs&&... params)
|
||||
requires mcc::traits::mcc_output_char_range<BYTEREPR_T>
|
||||
{
|
||||
return construct(_defaultSerializer, std::forward<KT>(key), std::forward<PTs>(params)...);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
class Asibfm700MountNetServer : public mcc::network::MccGenericNetworkServer<Asibfm700Logger>
|
||||
{
|
||||
using _base_t = mcc::network::MccGenericNetworkServer<Asibfm700Logger>;
|
||||
|
||||
public:
|
||||
template <mcc::traits::mcc_range_of_input_char_range R = decltype(Asibfm700Logger::LOGGER_DEFAULT_FORMAT)>
|
||||
Asibfm700MountNetserver(asio::io_context& ctx,
|
||||
Asibfm700MountNetServer(asio::io_context& ctx,
|
||||
std::shared_ptr<spdlog::logger> logger,
|
||||
const R& pattern_range = Asibfm700Logger::LOGGER_DEFAULT_FORMAT);
|
||||
|
||||
~Asibfm700MountNetserver();
|
||||
~Asibfm700MountNetServer();
|
||||
|
||||
private:
|
||||
std::vector<char> handleMessage(std::string_view msg);
|
||||
|
||||
Reference in New Issue
Block a user