Program Listing for File clock.h

Return to documentation for file (devices/clock.h)

#pragma once

#include "lupnt/core/definitions.h"
#include "lupnt/devices/device.h"
#include "lupnt/dynamics/clock_dynamics.h"
#include "lupnt/states/state.h"

namespace lupnt {

  enum class ClockModel { OCXO, USO, CSAC, MINI_RAFS, RAFS, DSAC, UNDEFINED };

  class Clock : public Device {
  private:
    Real time_ = 0.0;  // [s]
    ClockState3 state_;
    ClockModel model_ = ClockModel::UNDEFINED;
    ClockBiasUnit bias_unit_ = ClockBiasUnit::SECONDS;
    bool use_relativity_ = false;
    bool relativity_center_body_set_ = false;
    BodyId relativity_center_body_ = BodyId::EARTH;
    UnitSystem relativity_units_ = SI_UNITS;
    Ptr<ClockDynamics> dynamics_;

    void ApplyClockStateUnits();

    ClockRelativityContext BuildRelativityContext(Real t0, Real tf) const;

  public:
    Clock();
    Clock(Config& config);

    Real Read(Real t);

    void Step(Real t) override;
    void Setup() override;

    void SetModel(ClockModel model);
    ClockModel GetModel() const { return model_; }

    void SetState(const ClockState3& state) {
      state_ = state;
      ApplyClockStateUnits();
    }
    ClockState3 GetState() const { return state_; }

    void SetTime(Real time) { time_ = time; }
    Real GetTime() const { return time_; }

    void SetClockBiasUnit(ClockBiasUnit unit);
    ClockBiasUnit GetClockBiasUnit() const { return bias_unit_; }

    void SetUseRelativity(bool use_relativity) { use_relativity_ = use_relativity; }
    bool GetUseRelativity() const { return use_relativity_; }

    void SetRelativityCenterBody(BodyId center_body) {
      relativity_center_body_ = center_body;
      relativity_center_body_set_ = true;
    }
    BodyId GetRelativityCenterBody() const { return relativity_center_body_; }
    bool HasRelativityCenterBody() const { return relativity_center_body_set_; }
    void ClearRelativityCenterBody() { relativity_center_body_set_ = false; }

    void SetRelativityUnits(const UnitSystem& units) { relativity_units_ = units; }
    UnitSystem GetRelativityUnits() const { return relativity_units_; }

    void SetDynamics(Ptr<ClockDynamics> dynamics);
    ClockDynamics* GetDynamics() const { return dynamics_.get(); }
    Ptr<ClockDynamics> GetDynamicsSharedPtr() const { return dynamics_; }

    virtual void Log(Real time) override;
  };

}  // namespace lupnt