#include "asibfm700_servocontroller.h" namespace asibfm700 { AsibFM700ServoController::AsibFM700ServoController() : _hardwareConfig(), _setStateMutex(new std::mutex) {} AsibFM700ServoController::AsibFM700ServoController(hardware_config_t config) : AsibFM700ServoController() { _hardwareConfig = std::move(config); _hardwareConfig.devConfig.MountDevPath = const_cast(_hardwareConfig.MountDevPath.c_str()); _hardwareConfig.devConfig.EncoderDevPath = const_cast(_hardwareConfig.EncoderDevPath.c_str()); _hardwareConfig.devConfig.EncoderXDevPath = const_cast(_hardwareConfig.EncoderXDevPath.c_str()); _hardwareConfig.devConfig.EncoderYDevPath = const_cast(_hardwareConfig.EncoderYDevPath.c_str()); } constexpr std::string_view AsibFM700ServoController::hardwareName() const { return "Sidereal-ServoControllerII"; } AsibFM700ServoController::error_t AsibFM700ServoController::hardwareStop() { return static_cast(Mount.stop()); } AsibFM700ServoController::error_t AsibFM700ServoController::hardwareInit() { return static_cast(Mount.init(&_hardwareConfig.devConfig)); } AsibFM700ServoController::error_t AsibFM700ServoController::hardwareSetState(hardware_state_t state) { // time point from sidservo library is 'double' number represented UNIXTIME with // microseconds/nanoseconds precision double tp = std::chrono::duration(state.time_point.time_since_epoch()).count(); std::lock_guard lock{*_setStateMutex}; // according to"SiTech protocol notes" X is DEC-axis and Y is HA-axis coordval_pair_t cvalpair{.X{.val = state.Y, .t = tp}, .Y{.val = state.X, .t = tp}}; coordpair_t cpair{.X = state.Y, .Y = state.X}; // correctTo is asynchronous function!!! // // according to the Eddy's implementation of the LibSidServo library it is safe // to pass the addresses of 'cvalpair' and 'cpair' automatic variables auto err = static_cast(Mount.correctTo(&cvalpair, &cpair)); return err; } AsibFM700ServoController::error_t AsibFM700ServoController::hardwareGetState(hardware_state_t* state) { using tp_t = decltype(hardware_state_t::time_point); mountdata_t mdata; error_t err = static_cast(Mount.getMountData(&mdata)); if (!err) { // time point from sidservo library is 'double' number represented UNIXTIME with // microseconds/nanoseconds precision (must be equal for encXposition and encYposition) using secs_t = std::chrono::duration; secs_t secs = secs_t{mdata.encXposition.t}; state->time_point = tp_t{std::chrono::duration_cast(secs)}; // according to "SiTech protocol notes" X is DEC-axis and Y is HA-axis state->X = mdata.encYposition.val; state->Y = mdata.encXposition.val; state->speedX = mdata.encYspeed.val; state->speedY = mdata.encXspeed.val; } return err; } } // namespace asibfm700