...
This commit is contained in:
parent
78e1a7d71d
commit
3205db3ee1
@ -137,6 +137,7 @@ if (WITH_TESTS)
|
|||||||
add_executable(${CFGFILE_TEST_APP} tests/configfile_test.cpp)
|
add_executable(${CFGFILE_TEST_APP} tests/configfile_test.cpp)
|
||||||
|
|
||||||
set(ASTROM_TEST_APP astrom_test)
|
set(ASTROM_TEST_APP astrom_test)
|
||||||
add_executable(${ASTROM_TEST_APP} tests/astrom_test.cpp)
|
add_executable(${ASTROM_TEST_APP} tests/astrom_test.cpp
|
||||||
|
mount_pz.h)
|
||||||
target_link_libraries(${ASTROM_TEST_APP} ERFA_LIB)
|
target_link_libraries(${ASTROM_TEST_APP} ERFA_LIB)
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@ -129,15 +129,26 @@ public:
|
|||||||
return sexagesimal<std::string>(hms, prec);
|
return sexagesimal<std::string>(hms, prec);
|
||||||
}
|
}
|
||||||
|
|
||||||
friend MccCoordinate operator+(const MccCoordinate& left, const MccCoordinate& right)
|
friend MccCoordinate operator+(std::convertible_to<MccCoordinate> auto&& left,
|
||||||
|
std::convertible_to<MccCoordinate> auto&& right)
|
||||||
{
|
{
|
||||||
return left._angleInRads + right._angleInRads;
|
return std::forward<decltype(left)>(left)._angleInRads + std::forward<decltype(right)>(right)._angleInRads;
|
||||||
}
|
}
|
||||||
|
// friend MccCoordinate operator+(const MccCoordinate& left, const MccCoordinate& right)
|
||||||
|
// {
|
||||||
|
// return left._angleInRads + right._angleInRads;
|
||||||
|
// }
|
||||||
|
|
||||||
friend MccCoordinate operator-(const MccCoordinate& left, const MccCoordinate& right)
|
|
||||||
|
friend MccCoordinate operator-(std::convertible_to<MccCoordinate> auto&& left,
|
||||||
|
std::convertible_to<MccCoordinate> auto&& right)
|
||||||
{
|
{
|
||||||
return left._angleInRads + right._angleInRads;
|
return std::forward<decltype(left)>(left)._angleInRads - std::forward<decltype(right)>(right)._angleInRads;
|
||||||
}
|
}
|
||||||
|
// friend MccCoordinate operator-(const MccCoordinate& left, const MccCoordinate& right)
|
||||||
|
// {
|
||||||
|
// return left._angleInRads + right._angleInRads;
|
||||||
|
// }
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
MccCoordinate operator*(T&& scalar)
|
MccCoordinate operator*(T&& scalar)
|
||||||
@ -187,6 +198,26 @@ public:
|
|||||||
_angleInRads /= scalar;
|
_angleInRads /= scalar;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto operator<=>(const MccCoordinate& other) const
|
||||||
|
{
|
||||||
|
return _angleInRads <=> other._angleInRads;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto operator==(const MccCoordinate& other) const
|
||||||
|
{
|
||||||
|
return _angleInRads == other._angleInRads;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto operator<=>(double other) const
|
||||||
|
{
|
||||||
|
return _angleInRads <=> other;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto operator==(double other) const
|
||||||
|
{
|
||||||
|
return _angleInRads == other;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
42
cxx/mount.h
42
cxx/mount.h
@ -155,6 +155,28 @@ struct MccProhibitedZoneContext {
|
|||||||
pzcoords_t coordType;
|
pzcoords_t coordType;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
struct MccProhibitedZone1 {
|
||||||
|
// type of prohibited zone
|
||||||
|
enum pztype_t {
|
||||||
|
PZ_MINALT, // trivial minimal altitude
|
||||||
|
PZ_MAXALT, // trivial maximal altitude (e.g. near-zenith zone for alt-azimuthal types)
|
||||||
|
PZ_ELLIPSE, // simple circular/elliptical zone
|
||||||
|
PZ_PIER_MERIDIAN, // pier-side or cross-meridian
|
||||||
|
PZ_CONVEXHULL // general convex hull polygonal zone
|
||||||
|
};
|
||||||
|
|
||||||
|
pztype_t type;
|
||||||
|
|
||||||
|
struct pzminalt_t {
|
||||||
|
double minalt{0.0};
|
||||||
|
};
|
||||||
|
|
||||||
|
union {
|
||||||
|
} geometry;
|
||||||
|
};
|
||||||
|
|
||||||
/* MOUNT BASE TEMPLATED CLASS WITH BASIC FUNCTIONALITY */
|
/* MOUNT BASE TEMPLATED CLASS WITH BASIC FUNCTIONALITY */
|
||||||
|
|
||||||
// implements a Finite State Machine Pattern
|
// implements a Finite State Machine Pattern
|
||||||
@ -337,18 +359,15 @@ public:
|
|||||||
// .time_from = time duration to exit the zone (0 - if already out of the zone, chrono::duration<>::max() if
|
// .time_from = time duration to exit the zone (0 - if already out of the zone, chrono::duration<>::max() if
|
||||||
// never exit the zone)
|
// never exit the zone)
|
||||||
|
|
||||||
auto pzCheck(const MccCoordinate& xcoord,
|
auto pzCheck(this auto&& self,
|
||||||
|
const MccCoordinate& xcoord,
|
||||||
const MccCoordinate& ycoord,
|
const MccCoordinate& ycoord,
|
||||||
std::derived_from<MccProhibitedZoneContext> auto const& context,
|
std::derived_from<MccProhibitedZoneContext> auto const& context,
|
||||||
traits::mcc_systime_c auto const& utc = std::chrono::system_clock::now())
|
traits::mcc_systime_c auto const& utc = std::chrono::system_clock::now())
|
||||||
{
|
{
|
||||||
using d_t = std::remove_cvref_t<decltype(utc)>::duration;
|
return std::forward<decltype(self)>(self).pzCheckImpl(xcoord, ycoord, context, utc);
|
||||||
|
|
||||||
return pzcheck_result_t<d_t>{.inzone = false, .time_to = d_t::max(), .time_from = d_t{0}};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// template <std::ranges::output_range<pzcheck_result_t> OR, std::ranges::input_range R1, std::ranges::input_range
|
|
||||||
// R2>
|
|
||||||
template <std::ranges::range OR, std::ranges::input_range R1, std::ranges::input_range R2>
|
template <std::ranges::range OR, std::ranges::input_range R1, std::ranges::input_range R2>
|
||||||
auto pzCheckRange(const R1& xcoord,
|
auto pzCheckRange(const R1& xcoord,
|
||||||
const R2& ycoord,
|
const R2& ycoord,
|
||||||
@ -424,6 +443,17 @@ protected:
|
|||||||
|
|
||||||
std::atomic<MccMountSiteInfo> _geoLocation;
|
std::atomic<MccMountSiteInfo> _geoLocation;
|
||||||
std::atomic<MccMountMeteo> _currentMeteo;
|
std::atomic<MccMountMeteo> _currentMeteo;
|
||||||
|
|
||||||
|
// default implementation
|
||||||
|
auto pzCheckImpl(const MccCoordinate& xcoord,
|
||||||
|
const MccCoordinate& ycoord,
|
||||||
|
std::derived_from<MccProhibitedZoneContext> auto const& context,
|
||||||
|
traits::mcc_systime_c auto const& utc = std::chrono::system_clock::now())
|
||||||
|
{
|
||||||
|
using d_t = std::remove_cvref_t<decltype(utc)>::duration;
|
||||||
|
|
||||||
|
return pzcheck_result_t<d_t>{.inzone = false, .time_to = d_t::max(), .time_from = d_t{0}};
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace mcc
|
} // namespace mcc
|
||||||
|
|||||||
91
cxx/mount_pz.h
Normal file
91
cxx/mount_pz.h
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "mcc_coord.h"
|
||||||
|
|
||||||
|
namespace mcc
|
||||||
|
{
|
||||||
|
class MccProhibitedZone
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual ~MccProhibitedZone() = default;
|
||||||
|
|
||||||
|
bool inZone(this auto&& self, const MccCoordinate& x, const MccCoordinate& y)
|
||||||
|
{
|
||||||
|
return std::forward<decltype(self)>(self).inZoneImpl(x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
bool inZoneImpl(const MccCoordinate&, const MccCoordinate&)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class MccMinAltPZ : public MccProhibitedZone
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MccMinAltPZ(const MccCoordinate& min_alt) : _minAlt(min_alt) {}
|
||||||
|
|
||||||
|
MccCoordinate minAlt() const
|
||||||
|
{
|
||||||
|
return _minAlt;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
double _minAlt;
|
||||||
|
|
||||||
|
bool inZoneImpl(const MccCoordinate& alt, const MccCoordinate&)
|
||||||
|
{
|
||||||
|
return alt <= _minAlt;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class MccMaxAltPZ
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MccMaxAltPZ(double max_alt) : _maxAlt(max_alt) {}
|
||||||
|
|
||||||
|
double maxAlt() const
|
||||||
|
{
|
||||||
|
return _maxAlt;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
double _maxAlt;
|
||||||
|
|
||||||
|
bool inZoneImpl(const MccCoordinate& alt, const MccCoordinate&)
|
||||||
|
{
|
||||||
|
return alt >= _maxAlt;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class MccElliipsePZ
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MccElliipsePZ(const MccCoordinate& xc, const MccCoordinate& yc, const MccCoordinate& a, const MccCoordinate& b)
|
||||||
|
: _xc(xc), _yc(yc), _a(a), _b(b), _a2(a * a), _b2(b * b)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// circle
|
||||||
|
MccElliipsePZ(const MccCoordinate& xc, const MccCoordinate& yc, const MccCoordinate& a)
|
||||||
|
: mcc::MccElliipsePZ(xc, yc, a, a)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private:
|
||||||
|
double _xc, _yc, _a, _b, _a2, _b2;
|
||||||
|
|
||||||
|
bool inZoneImpl(const MccCoordinate& alt, const MccCoordinate& zd)
|
||||||
|
{
|
||||||
|
auto x2 = alt - _xc;
|
||||||
|
auto y2 = zd - _yc;
|
||||||
|
|
||||||
|
return (x2 * x2 / _a2 + y2 * y2 / _b2) <= 1.0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace mcc
|
||||||
Loading…
x
Reference in New Issue
Block a user