fix mount initialization (add EEPROM reading, assign correponded mount config items) rewrite computing distance to pzones in slewing mode (add braking aceleration) add more informative errors description for serialization (network protocol)
139 lines
3.4 KiB
C++
139 lines
3.4 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;
|
|
};
|
|
|
|
|
|
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
|