#pragma once /* MOUNT CONTROL COMPONENTS LIBRARY */ /* MOUNT HARDWARE CONCEPTS */ #include #include "mcc_traits.h" namespace mcc { namespace traits { // encoder basic concept (e.g. mount axis encoder or motor shaft one) template concept mcc_hw_encoder_c = requires(T t, const T t_const) { typename T::error_t; typename T::time_point_t; typename T::coord_t; typename T::speed_t; typename T::accel_t; // typename T::high_order_deriv_t; requires requires(typename T::state_t st) { std::same_as; std::same_as; std::same_as; std::same_as; // std::same_as; }; { t_const.id() } -> mcc_formattable; { t.getState(std::declval()) } -> std::same_as; }; template concept mcc_hw_motor_c = requires(T t, const T t_const) { typename T::error_t; typename T::coord_t; typename T::speed_t; typename T::accel_t; requires requires(typename T::pos_t st) { std::same_as; std::same_as; // means maximal allowed speed std::same_as; // means a maximal allowed acceleration (jerk) }; { t_const.id() } -> mcc_formattable; { t.rotate(std::declval()) } -> std::same_as; { t.stop() } -> std::same_as; }; namespace details { template concept mcc_tuple_enc_ref_c = mcc_tuple_c && requires(T t) { []