145 lines
3.8 KiB
C++
145 lines
3.8 KiB
C++
#pragma once
|
|
|
|
#include <mcc_defaults.h>
|
|
#include <mcc_generics.h>
|
|
|
|
#include "../LibSidServo/sidservo.h"
|
|
|
|
|
|
namespace asibfm700
|
|
{
|
|
|
|
/* error codes enum definition */
|
|
|
|
enum class AsibFM700ServoControllerErrorCode : int {
|
|
// error codes from sidservo library
|
|
ERROR_OK = MCC_E_OK,
|
|
ERROR_FATAL = MCC_E_FATAL,
|
|
ERROR_BADFORMAT = MCC_E_BADFORMAT,
|
|
ERROR_ENCODERDEV = MCC_E_ENCODERDEV,
|
|
ERROR_MOUNTDEV = MCC_E_MOUNTDEV,
|
|
ERROR_FAILED = MCC_E_FAILED,
|
|
// my codes ...
|
|
ERROR_POLLING_TIMEOUT,
|
|
ERROR_NULLPTR
|
|
};
|
|
|
|
// error category
|
|
struct AsibFM700ServoControllerErrorCategory : public std::error_category {
|
|
const char* name() const noexcept;
|
|
std::string message(int ec) const;
|
|
|
|
static const AsibFM700ServoControllerErrorCategory& get();
|
|
};
|
|
|
|
|
|
static inline std::error_code make_error_code(AsibFM700ServoControllerErrorCode ec)
|
|
{
|
|
return std::error_code(static_cast<int>(ec), AsibFM700ServoControllerErrorCategory::get());
|
|
}
|
|
|
|
} // namespace asibfm700
|
|
|
|
|
|
namespace std
|
|
{
|
|
|
|
template <>
|
|
class is_error_code_enum<asibfm700::AsibFM700ServoControllerErrorCode> : public true_type
|
|
{
|
|
};
|
|
|
|
} // namespace std
|
|
|
|
|
|
namespace asibfm700
|
|
{
|
|
|
|
class AsibFM700ServoController
|
|
{
|
|
public:
|
|
typedef std::error_code error_t;
|
|
|
|
enum class hardware_moving_state_t : int {
|
|
HW_MOVE_ERROR = -1,
|
|
HW_MOVE_STOPPED = 0,
|
|
HW_MOVE_SLEWING,
|
|
HW_MOVE_ADJUSTING,
|
|
HW_MOVE_TRACKING,
|
|
HW_MOVE_GUIDING,
|
|
HW_MOVE_UNKNOWN
|
|
};
|
|
|
|
struct hardware_state_t {
|
|
static constexpr mcc::MccCoordPairKind pair_kind = mcc::MccCoordPairKind::COORDS_KIND_HADEC_APP;
|
|
mcc::MccTimePoint time_point;
|
|
|
|
double X, Y, speedX, speedY;
|
|
axis_status_t stateX, stateY; // Eddy's LibSidServo axis state
|
|
|
|
hardware_moving_state_t moving_state;
|
|
|
|
// endpoint: a point on the trajectory of movement behind the guidance point (X,Y), taking into account
|
|
// the movement vector (i.e. sign of movement speed)
|
|
// this point is needed as Sidereal controller commands require not only moving speed but
|
|
// also 'target' point (point at which mount will stop)
|
|
// double endptX, endptY;
|
|
};
|
|
|
|
|
|
struct hardware_config_t {
|
|
// the 'char*' fields from conf_t:
|
|
// wrap it to std::string
|
|
std::string MountDevPath;
|
|
std::string EncoderDevPath;
|
|
std::string EncoderXDevPath;
|
|
std::string EncoderYDevPath;
|
|
|
|
conf_t devConfig; // devices paths and PIDs parameters
|
|
hardware_configuration_t hwConfig; // EEPROM-located configuration
|
|
|
|
std::chrono::milliseconds pollingInterval{300}; // hardware polling interval
|
|
std::chrono::milliseconds pollingTimeout{30000}; // hardware polling timeout
|
|
};
|
|
|
|
/* constructors and destructor */
|
|
|
|
AsibFM700ServoController();
|
|
|
|
AsibFM700ServoController(hardware_config_t config);
|
|
|
|
AsibFM700ServoController(const AsibFM700ServoController&) = delete;
|
|
AsibFM700ServoController& operator=(const AsibFM700ServoController&) = delete;
|
|
|
|
AsibFM700ServoController(AsibFM700ServoController&&) = default;
|
|
AsibFM700ServoController& operator=(AsibFM700ServoController&&) = default;
|
|
|
|
virtual ~AsibFM700ServoController();
|
|
|
|
/* public methods */
|
|
|
|
constexpr std::string_view hardwareName() const;
|
|
|
|
error_t hardwareSetState(hardware_state_t state);
|
|
error_t hardwareGetState(hardware_state_t* state);
|
|
|
|
error_t hardwareStop();
|
|
error_t hardwareInit();
|
|
|
|
void hardwareUpdateConfig(conf_t cfg);
|
|
|
|
// save config to EEPROM
|
|
error_t hardwareUpdateConfig(hardware_configuration_t cfg);
|
|
// load config from EEPROM
|
|
error_t hardwareUpdateConfig();
|
|
|
|
hardware_config_t getHardwareConfig() const;
|
|
|
|
protected:
|
|
hardware_config_t _hardwareConfig;
|
|
|
|
std::unique_ptr<std::mutex> _setStateMutex;
|
|
};
|
|
|
|
} // namespace asibfm700
|