Program Listing for File TimeKeeper.h#
↰ Return to documentation for file (include/Karana/SOADyn/TimeKeeper.h)
/*
* Copyright (c) 2024-2026 Karana Dynamics Pty Ltd. All rights reserved.
*
* NOTICE TO USER:
*
* This source code and/or documentation (the "Licensed Materials") is
* the confidential and proprietary information of Karana Dynamics Inc.
* Use of these Licensed Materials is governed by the terms and conditions
* of a separate software license agreement between Karana Dynamics and the
* Licensee ("License Agreement"). Unless expressly permitted under that
* agreement, any reproduction, modification, distribution, or disclosure
* of the Licensed Materials, in whole or in part, to any third party
* without the prior written consent of Karana Dynamics is strictly prohibited.
*
* THE LICENSED MATERIALS ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND.
* KARANA DYNAMICS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT, AND
* FITNESS FOR A PARTICULAR PURPOSE.
*
* IN NO EVENT SHALL KARANA DYNAMICS BE LIABLE FOR ANY DAMAGES WHATSOEVER,
* INCLUDING BUT NOT LIMITED TO LOSS OF PROFITS, DATA, OR USE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGES, WHETHER IN CONTRACT, TORT,
* OR OTHERWISE ARISING OUT OF OR IN CONNECTION WITH THE LICENSED MATERIALS.
*
* U.S. Government End Users: The Licensed Materials are a "commercial item"
* as defined at 48 C.F.R. 2.101, and are provided to the U.S. Government
* only as a commercial end item under the terms of this license.
*
* Any use of the Licensed Materials in individual or commercial software must
* include, in the user documentation and internal source code comments,
* this Notice, Disclaimer, and U.S. Government Use Provision.
*/
/**
* @file
* @brief Contains the declarations for the TimeKeeper and SpiceTimeKeeper classes.
*/
#pragma once
#include "Karana/Frame/FrameContainer.h"
#include "Karana/Math/Defs.h"
namespace Karana::Dynamics {
namespace km = Karana::Math;
namespace kc = Karana::Core;
namespace kf = Karana::Frame;
// Forward declaration
class SpiceTimeKeeper;
/**
* @brief Keeps track of time.
*/
class TimeKeeper : public kc::Base {
public:
/**
* @brief Constructor.
*
* @param fc FrameContainer. Used to update ephemeris in derived classes.
* The _initial_ephemeris will also be set to the FrameContainer's current ephemeris.
*/
TimeKeeper(const kc::ks_ptr<kf::FrameContainer> &fc);
/**
* @brief Copy constructor.
*
* @param other The TimeKeeper instance to copy from.
*/
TimeKeeper(const TimeKeeper &other);
/**
* @brief Get the time from TimeKeeper.
*
* @return The current time.
*/
const km::Ktime &getTime() const;
/**
* @brief Set the TimeKeeper's time.
*
* @param time The current time.
*/
virtual void setTime(const km::Ktime &time);
/**
* @brief Determine if the TimeKeeper is initialized.
*
* @return true if initialized, false otherwise.
*/
bool isReady() const override;
// Even though we don't use ephemeris in TimeKeeper, we have all the methods
// to set and change it. This is because a user may try to set the Ephemeris
// before there are any SpiceFrames.
/**
* @brief Set the initial ephemeris.
*
* @param initial_ephemeris The initial ephemeris.
*/
void setInitialEphemeris(double initial_ephemeris);
/**
* @brief Set the initial ephemeris.
*
* @param utc_time The UTC time as a string in the form
* "YYYY-MM-DDThh:mm:ss.ss" where Y is the year, M is the
* month, D is the day, h is the hour, m is the minute, and
* s is the second. The seconds can have decimals.
*/
void setInitialEphemeris(const std::string &utc_time);
/**
* @brief Convert a time in UTC to an ephemeris.
*
* @param utc_time The utc_time given as a string in the form
* "YYYY-MM-DDThh:mm:ss.ss" where Y is the year, M is the
* month, D is the day, h is the hour, m is the minute, and
* s is the second. The seconds can have decimals.
* @return The utc_time as an ephemeris.
*/
static double utcTimeToEphemeris(const std::string &utc_time);
protected:
/// The current time.
km::Ktime _time;
/// The FrameContainer to keep in sync.
kc::ks_ptr<kf::FrameContainer> _fc;
/// Initial ephemeris.
double _initial_ephemeris = km::notReadyNaN;
};
} // namespace Karana::Dynamics