reapply clang format
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@ -3,15 +3,16 @@
|
||||
|
||||
// COULDDO: have calls in Clock.h which return time quality and use timespec accordingly
|
||||
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
|
||||
#include "../returnvalues/HasReturnvaluesIF.h"
|
||||
#include "Clock.h"
|
||||
#include "clockDefinitions.h"
|
||||
#include "../returnvalues/HasReturnvaluesIF.h"
|
||||
#include <cstdint>
|
||||
#include <cstddef>
|
||||
|
||||
bool operator<(const timeval& lhs, const timeval& rhs);
|
||||
bool operator<=(const timeval& lhs, const timeval& rhs);
|
||||
bool operator==(const timeval& lhs, const timeval& rhs);
|
||||
bool operator<(const timeval &lhs, const timeval &rhs);
|
||||
bool operator<=(const timeval &lhs, const timeval &rhs);
|
||||
bool operator==(const timeval &lhs, const timeval &rhs);
|
||||
/**
|
||||
* static helper class for CCSDS Time Code Formats
|
||||
*
|
||||
@ -19,217 +20,208 @@ bool operator==(const timeval& lhs, const timeval& rhs);
|
||||
*
|
||||
* Still work in progress
|
||||
*/
|
||||
class CCSDSTime: public HasReturnvaluesIF {
|
||||
public:
|
||||
/**
|
||||
* The Time code identifications, bits 4-6 in the P-Field
|
||||
*/
|
||||
enum TimeCodeIdentification {
|
||||
CCS = 0b101,
|
||||
CUC_LEVEL1 = 0b001,
|
||||
CUC_LEVEL2 = 0b010,
|
||||
CDS = 0b100,
|
||||
AGENCY_DEFINED = 0b110
|
||||
};
|
||||
static const uint8_t P_FIELD_CUC_6B_CCSDS = (CUC_LEVEL1 << 4) + (3 << 2)
|
||||
+ 2;
|
||||
static const uint8_t P_FIELD_CUC_6B_AGENCY = (CUC_LEVEL2 << 4) + (3 << 2)
|
||||
+ 2;
|
||||
static const uint8_t P_FIELD_CDS_SHORT = (CDS << 4);
|
||||
/**
|
||||
* Struct for CDS day-segmented format.
|
||||
*/
|
||||
struct CDS_short {
|
||||
uint8_t pField;
|
||||
uint8_t dayMSB;
|
||||
uint8_t dayLSB;
|
||||
uint8_t msDay_hh;
|
||||
uint8_t msDay_h;
|
||||
uint8_t msDay_l;
|
||||
uint8_t msDay_ll;
|
||||
};
|
||||
/**
|
||||
* Struct for the CCS fromat in day of month variation with max resolution
|
||||
*/
|
||||
struct Ccs_seconds {
|
||||
uint8_t pField;
|
||||
uint8_t yearMSB;
|
||||
uint8_t yearLSB;
|
||||
uint8_t month;
|
||||
uint8_t day;
|
||||
uint8_t hour;
|
||||
uint8_t minute;
|
||||
uint8_t second;
|
||||
};
|
||||
class CCSDSTime : public HasReturnvaluesIF {
|
||||
public:
|
||||
/**
|
||||
* The Time code identifications, bits 4-6 in the P-Field
|
||||
*/
|
||||
enum TimeCodeIdentification {
|
||||
CCS = 0b101,
|
||||
CUC_LEVEL1 = 0b001,
|
||||
CUC_LEVEL2 = 0b010,
|
||||
CDS = 0b100,
|
||||
AGENCY_DEFINED = 0b110
|
||||
};
|
||||
static const uint8_t P_FIELD_CUC_6B_CCSDS = (CUC_LEVEL1 << 4) + (3 << 2) + 2;
|
||||
static const uint8_t P_FIELD_CUC_6B_AGENCY = (CUC_LEVEL2 << 4) + (3 << 2) + 2;
|
||||
static const uint8_t P_FIELD_CDS_SHORT = (CDS << 4);
|
||||
/**
|
||||
* Struct for CDS day-segmented format.
|
||||
*/
|
||||
struct CDS_short {
|
||||
uint8_t pField;
|
||||
uint8_t dayMSB;
|
||||
uint8_t dayLSB;
|
||||
uint8_t msDay_hh;
|
||||
uint8_t msDay_h;
|
||||
uint8_t msDay_l;
|
||||
uint8_t msDay_ll;
|
||||
};
|
||||
/**
|
||||
* Struct for the CCS fromat in day of month variation with max resolution
|
||||
*/
|
||||
struct Ccs_seconds {
|
||||
uint8_t pField;
|
||||
uint8_t yearMSB;
|
||||
uint8_t yearLSB;
|
||||
uint8_t month;
|
||||
uint8_t day;
|
||||
uint8_t hour;
|
||||
uint8_t minute;
|
||||
uint8_t second;
|
||||
};
|
||||
|
||||
/**
|
||||
* Struct for the CCS fromat in day of month variation with 10E-4 seconds resolution
|
||||
*/
|
||||
struct Ccs_mseconds {
|
||||
uint8_t pField;
|
||||
uint8_t yearMSB;
|
||||
uint8_t yearLSB;
|
||||
uint8_t month;
|
||||
uint8_t day;
|
||||
uint8_t hour;
|
||||
uint8_t minute;
|
||||
uint8_t second;
|
||||
uint8_t secondEminus2;
|
||||
uint8_t secondEminus4;
|
||||
};
|
||||
/**
|
||||
* Struct for the CCS fromat in day of month variation with 10E-4 seconds resolution
|
||||
*/
|
||||
struct Ccs_mseconds {
|
||||
uint8_t pField;
|
||||
uint8_t yearMSB;
|
||||
uint8_t yearLSB;
|
||||
uint8_t month;
|
||||
uint8_t day;
|
||||
uint8_t hour;
|
||||
uint8_t minute;
|
||||
uint8_t second;
|
||||
uint8_t secondEminus2;
|
||||
uint8_t secondEminus4;
|
||||
};
|
||||
|
||||
struct OBT_FLP {
|
||||
uint8_t pFiled;
|
||||
uint8_t seconds_hh;
|
||||
uint8_t seconds_h;
|
||||
uint8_t seconds_l;
|
||||
uint8_t seconds_ll;
|
||||
uint8_t subsecondsMSB;
|
||||
uint8_t subsecondsLSB;
|
||||
};
|
||||
struct OBT_FLP {
|
||||
uint8_t pFiled;
|
||||
uint8_t seconds_hh;
|
||||
uint8_t seconds_h;
|
||||
uint8_t seconds_l;
|
||||
uint8_t seconds_ll;
|
||||
uint8_t subsecondsMSB;
|
||||
uint8_t subsecondsLSB;
|
||||
};
|
||||
|
||||
struct TimevalLess {
|
||||
bool operator()(const timeval& lhs, const timeval& rhs) const {
|
||||
return (lhs < rhs);
|
||||
}
|
||||
};
|
||||
struct TimevalLess {
|
||||
bool operator()(const timeval &lhs, const timeval &rhs) const { return (lhs < rhs); }
|
||||
};
|
||||
|
||||
static const uint8_t INTERFACE_ID = CLASS_ID::CCSDS_TIME_HELPER_CLASS;
|
||||
static const ReturnValue_t UNSUPPORTED_TIME_FORMAT = MAKE_RETURN_CODE(0);
|
||||
static const ReturnValue_t NOT_ENOUGH_INFORMATION_FOR_TARGET_FORMAT =
|
||||
MAKE_RETURN_CODE(1);
|
||||
static const ReturnValue_t LENGTH_MISMATCH = MAKE_RETURN_CODE(2);
|
||||
static const ReturnValue_t INVALID_TIME_FORMAT = MAKE_RETURN_CODE(3);
|
||||
static const ReturnValue_t INVALID_DAY_OF_YEAR = MAKE_RETURN_CODE(4);
|
||||
static const ReturnValue_t TIME_DOES_NOT_FIT_FORMAT = MAKE_RETURN_CODE(5);
|
||||
static const uint8_t INTERFACE_ID = CLASS_ID::CCSDS_TIME_HELPER_CLASS;
|
||||
static const ReturnValue_t UNSUPPORTED_TIME_FORMAT = MAKE_RETURN_CODE(0);
|
||||
static const ReturnValue_t NOT_ENOUGH_INFORMATION_FOR_TARGET_FORMAT = MAKE_RETURN_CODE(1);
|
||||
static const ReturnValue_t LENGTH_MISMATCH = MAKE_RETURN_CODE(2);
|
||||
static const ReturnValue_t INVALID_TIME_FORMAT = MAKE_RETURN_CODE(3);
|
||||
static const ReturnValue_t INVALID_DAY_OF_YEAR = MAKE_RETURN_CODE(4);
|
||||
static const ReturnValue_t TIME_DOES_NOT_FIT_FORMAT = MAKE_RETURN_CODE(5);
|
||||
|
||||
/**
|
||||
* convert a TimeofDay struct to ccs with seconds resolution
|
||||
*
|
||||
* @param to pointer to a CCS struct
|
||||
* @param from pointer to a TimeOfDay Struct
|
||||
* @return
|
||||
* - @c RETURN_OK if OK
|
||||
* - @c INVALID_TIMECODE if not OK
|
||||
*/
|
||||
static ReturnValue_t convertToCcsds(Ccs_seconds *to,
|
||||
Clock::TimeOfDay_t const *from);
|
||||
/**
|
||||
* convert a TimeofDay struct to ccs with seconds resolution
|
||||
*
|
||||
* @param to pointer to a CCS struct
|
||||
* @param from pointer to a TimeOfDay Struct
|
||||
* @return
|
||||
* - @c RETURN_OK if OK
|
||||
* - @c INVALID_TIMECODE if not OK
|
||||
*/
|
||||
static ReturnValue_t convertToCcsds(Ccs_seconds *to, Clock::TimeOfDay_t const *from);
|
||||
|
||||
/**
|
||||
* Converts to CDS format from timeval.
|
||||
* @param to pointer to the CDS struct to generate
|
||||
* @param from pointer to a timeval struct which comprises a time of day since UNIX epoch.
|
||||
* @return
|
||||
* - @c RETURN_OK as it assumes a valid timeval.
|
||||
*/
|
||||
static ReturnValue_t convertToCcsds(CDS_short* to, timeval const *from);
|
||||
/**
|
||||
* Converts to CDS format from timeval.
|
||||
* @param to pointer to the CDS struct to generate
|
||||
* @param from pointer to a timeval struct which comprises a time of day since UNIX epoch.
|
||||
* @return
|
||||
* - @c RETURN_OK as it assumes a valid timeval.
|
||||
*/
|
||||
static ReturnValue_t convertToCcsds(CDS_short *to, timeval const *from);
|
||||
|
||||
static ReturnValue_t convertToCcsds(OBT_FLP* to, timeval const *from);
|
||||
static ReturnValue_t convertToCcsds(OBT_FLP *to, timeval const *from);
|
||||
|
||||
/**
|
||||
* convert a TimeofDay struct to ccs with 10E-3 seconds resolution
|
||||
*
|
||||
* The 10E-4 seconds in the CCS Struct are 0 as the TimeOfDay only has ms resolution
|
||||
*
|
||||
* @param to pointer to a CCS struct
|
||||
* @param from pointer to a TimeOfDay Struct
|
||||
* @return
|
||||
* - @c RETURN_OK if OK
|
||||
* - @c INVALID_TIMECODE if not OK
|
||||
*/
|
||||
static ReturnValue_t convertToCcsds(Ccs_mseconds *to,
|
||||
Clock::TimeOfDay_t const *from);
|
||||
/**
|
||||
* convert a TimeofDay struct to ccs with 10E-3 seconds resolution
|
||||
*
|
||||
* The 10E-4 seconds in the CCS Struct are 0 as the TimeOfDay only has ms resolution
|
||||
*
|
||||
* @param to pointer to a CCS struct
|
||||
* @param from pointer to a TimeOfDay Struct
|
||||
* @return
|
||||
* - @c RETURN_OK if OK
|
||||
* - @c INVALID_TIMECODE if not OK
|
||||
*/
|
||||
static ReturnValue_t convertToCcsds(Ccs_mseconds *to, Clock::TimeOfDay_t const *from);
|
||||
|
||||
/**
|
||||
* SHOULDDO: can this be modified to recognize padding?
|
||||
* Tries to interpret a Level 1 CCSDS time code
|
||||
*
|
||||
* It assumes binary formats contain a valid P Field and recognizes the ASCII format
|
||||
* by the lack of one.
|
||||
*
|
||||
* @param to an empty TimeOfDay struct
|
||||
* @param from pointer to an CCSDS Time code
|
||||
* @param length length of the Time code
|
||||
* @return
|
||||
* - @c RETURN_OK if successful
|
||||
* - @c UNSUPPORTED_TIME_FORMAT if a (possibly valid) time code is not supported
|
||||
* - @c LENGTH_MISMATCH if the length does not match the P Field
|
||||
* - @c INVALID_TIME_FORMAT if the format or a value is invalid
|
||||
*/
|
||||
static ReturnValue_t convertFromCcsds(Clock::TimeOfDay_t *to,
|
||||
uint8_t const *from, size_t length);
|
||||
/**
|
||||
* SHOULDDO: can this be modified to recognize padding?
|
||||
* Tries to interpret a Level 1 CCSDS time code
|
||||
*
|
||||
* It assumes binary formats contain a valid P Field and recognizes the ASCII format
|
||||
* by the lack of one.
|
||||
*
|
||||
* @param to an empty TimeOfDay struct
|
||||
* @param from pointer to an CCSDS Time code
|
||||
* @param length length of the Time code
|
||||
* @return
|
||||
* - @c RETURN_OK if successful
|
||||
* - @c UNSUPPORTED_TIME_FORMAT if a (possibly valid) time code is not supported
|
||||
* - @c LENGTH_MISMATCH if the length does not match the P Field
|
||||
* - @c INVALID_TIME_FORMAT if the format or a value is invalid
|
||||
*/
|
||||
static ReturnValue_t convertFromCcsds(Clock::TimeOfDay_t *to, uint8_t const *from, size_t length);
|
||||
|
||||
/**
|
||||
* not implemented yet
|
||||
*
|
||||
* @param to
|
||||
* @param from
|
||||
* @return
|
||||
*/
|
||||
static ReturnValue_t convertFromCcsds(timeval *to, uint8_t const *from,
|
||||
size_t* foundLength, size_t maxLength);
|
||||
/**
|
||||
* not implemented yet
|
||||
*
|
||||
* @param to
|
||||
* @param from
|
||||
* @return
|
||||
*/
|
||||
static ReturnValue_t convertFromCcsds(timeval *to, uint8_t const *from, size_t *foundLength,
|
||||
size_t maxLength);
|
||||
|
||||
static ReturnValue_t convertFromCUC(Clock::TimeOfDay_t *to,
|
||||
uint8_t const *from, uint8_t length);
|
||||
static ReturnValue_t convertFromCUC(Clock::TimeOfDay_t *to, uint8_t const *from, uint8_t length);
|
||||
|
||||
static ReturnValue_t convertFromCUC(timeval *to, uint8_t const *from,
|
||||
size_t* foundLength, size_t maxLength);
|
||||
static ReturnValue_t convertFromCUC(timeval *to, uint8_t const *from, size_t *foundLength,
|
||||
size_t maxLength);
|
||||
|
||||
static ReturnValue_t convertFromCUC(timeval *to, uint8_t pField,
|
||||
uint8_t const *from, size_t* foundLength, size_t maxLength);
|
||||
static ReturnValue_t convertFromCUC(timeval *to, uint8_t pField, uint8_t const *from,
|
||||
size_t *foundLength, size_t maxLength);
|
||||
|
||||
static ReturnValue_t convertFromCCS(timeval *to, uint8_t const *from,
|
||||
size_t* foundLength, size_t maxLength);
|
||||
static ReturnValue_t convertFromCCS(timeval *to, uint8_t const *from, size_t *foundLength,
|
||||
size_t maxLength);
|
||||
|
||||
static ReturnValue_t convertFromCCS(timeval *to, uint8_t pField,
|
||||
uint8_t const *from, size_t* foundLength, size_t maxLength);
|
||||
static ReturnValue_t convertFromCCS(timeval *to, uint8_t pField, uint8_t const *from,
|
||||
size_t *foundLength, size_t maxLength);
|
||||
|
||||
static ReturnValue_t convertFromCDS(Clock::TimeOfDay_t *to,
|
||||
uint8_t const *from, uint8_t length);
|
||||
static ReturnValue_t convertFromCDS(Clock::TimeOfDay_t *to, uint8_t const *from, uint8_t length);
|
||||
|
||||
static ReturnValue_t convertFromCDS(timeval *to, uint8_t const *from,
|
||||
size_t* foundLength, size_t maxLength);
|
||||
static ReturnValue_t convertFromCDS(timeval *to, uint8_t const *from, size_t *foundLength,
|
||||
size_t maxLength);
|
||||
|
||||
static ReturnValue_t convertFromCCS(Clock::TimeOfDay_t *to,
|
||||
uint8_t const *from, size_t* foundLength, size_t maxLength);
|
||||
static ReturnValue_t convertFromCCS(Clock::TimeOfDay_t *to, uint8_t const *from,
|
||||
size_t *foundLength, size_t maxLength);
|
||||
|
||||
static ReturnValue_t convertFromASCII(Clock::TimeOfDay_t *to,
|
||||
uint8_t const *from, uint8_t length);
|
||||
static ReturnValue_t convertFromASCII(Clock::TimeOfDay_t *to, uint8_t const *from,
|
||||
uint8_t length);
|
||||
|
||||
static uint32_t subsecondsToMicroseconds(uint16_t subseconds);
|
||||
private:
|
||||
CCSDSTime();
|
||||
virtual ~CCSDSTime();
|
||||
/**
|
||||
* checks a ccs time stream for validity
|
||||
*
|
||||
* Stream may be longer than the actual timecode
|
||||
*
|
||||
* @param time pointer to an Ccs stream
|
||||
* @param length length of stream
|
||||
* @return
|
||||
*/
|
||||
static ReturnValue_t checkCcs(const uint8_t* time, uint8_t length);
|
||||
static uint32_t subsecondsToMicroseconds(uint16_t subseconds);
|
||||
|
||||
static ReturnValue_t checkTimeOfDay(const Clock::TimeOfDay_t *time);
|
||||
private:
|
||||
CCSDSTime();
|
||||
virtual ~CCSDSTime();
|
||||
/**
|
||||
* checks a ccs time stream for validity
|
||||
*
|
||||
* Stream may be longer than the actual timecode
|
||||
*
|
||||
* @param time pointer to an Ccs stream
|
||||
* @param length length of stream
|
||||
* @return
|
||||
*/
|
||||
static ReturnValue_t checkCcs(const uint8_t *time, uint8_t length);
|
||||
|
||||
static const uint32_t SECONDS_PER_DAY = 24 * 60 * 60;
|
||||
static const uint32_t SECONDS_PER_NON_LEAP_YEAR = SECONDS_PER_DAY * 365;
|
||||
static const uint32_t DAYS_CCSDS_TO_UNIX_EPOCH = 4383; //!< Time difference between CCSDS and POSIX epoch. This is exact, because leap-seconds where not introduced before 1972.
|
||||
static const uint32_t SECONDS_CCSDS_TO_UNIX_EPOCH = DAYS_CCSDS_TO_UNIX_EPOCH
|
||||
* SECONDS_PER_DAY;
|
||||
/**
|
||||
* @param dayofYear
|
||||
* @param year
|
||||
* @param month
|
||||
* @param day
|
||||
*/
|
||||
static ReturnValue_t convertDaysOfYear(uint16_t dayofYear, uint16_t year,
|
||||
uint8_t *month, uint8_t *day);
|
||||
static ReturnValue_t checkTimeOfDay(const Clock::TimeOfDay_t *time);
|
||||
|
||||
static bool isLeapYear(uint32_t year);
|
||||
static ReturnValue_t convertTimevalToTimeOfDay(Clock::TimeOfDay_t* to,
|
||||
timeval* from);
|
||||
static const uint32_t SECONDS_PER_DAY = 24 * 60 * 60;
|
||||
static const uint32_t SECONDS_PER_NON_LEAP_YEAR = SECONDS_PER_DAY * 365;
|
||||
static const uint32_t DAYS_CCSDS_TO_UNIX_EPOCH =
|
||||
4383; //!< Time difference between CCSDS and POSIX epoch. This is exact, because leap-seconds
|
||||
//!< where not introduced before 1972.
|
||||
static const uint32_t SECONDS_CCSDS_TO_UNIX_EPOCH = DAYS_CCSDS_TO_UNIX_EPOCH * SECONDS_PER_DAY;
|
||||
/**
|
||||
* @param dayofYear
|
||||
* @param year
|
||||
* @param month
|
||||
* @param day
|
||||
*/
|
||||
static ReturnValue_t convertDaysOfYear(uint16_t dayofYear, uint16_t year, uint8_t *month,
|
||||
uint8_t *day);
|
||||
|
||||
static bool isLeapYear(uint32_t year);
|
||||
static ReturnValue_t convertTimevalToTimeOfDay(Clock::TimeOfDay_t *to, timeval *from);
|
||||
};
|
||||
|
||||
#endif /* FSFW_TIMEMANAGER_CCSDSTIME_H_ */
|
||||
|
@ -1,13 +1,13 @@
|
||||
#ifndef FSFW_TIMEMANAGER_CLOCK_H_
|
||||
#define FSFW_TIMEMANAGER_CLOCK_H_
|
||||
|
||||
#include "clockDefinitions.h"
|
||||
#include "fsfw/returnvalues/HasReturnvaluesIF.h"
|
||||
#include "fsfw/ipc/MutexFactory.h"
|
||||
#include "fsfw/globalfunctions/timevalOperations.h"
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
#include "clockDefinitions.h"
|
||||
#include "fsfw/globalfunctions/timevalOperations.h"
|
||||
#include "fsfw/ipc/MutexFactory.h"
|
||||
#include "fsfw/returnvalues/HasReturnvaluesIF.h"
|
||||
|
||||
#ifdef WIN32
|
||||
#include <winsock2.h>
|
||||
#else
|
||||
@ -15,158 +15,157 @@
|
||||
#endif
|
||||
|
||||
class Clock {
|
||||
public:
|
||||
typedef struct {
|
||||
uint32_t year; //!< Year, A.D.
|
||||
uint32_t month; //!< Month, 1 .. 12.
|
||||
uint32_t day; //!< Day, 1 .. 31.
|
||||
uint32_t hour; //!< Hour, 0 .. 23.
|
||||
uint32_t minute; //!< Minute, 0 .. 59.
|
||||
uint32_t second; //!< Second, 0 .. 59.
|
||||
uint32_t usecond; //!< Microseconds, 0 .. 999999
|
||||
} TimeOfDay_t;
|
||||
public:
|
||||
typedef struct {
|
||||
uint32_t year; //!< Year, A.D.
|
||||
uint32_t month; //!< Month, 1 .. 12.
|
||||
uint32_t day; //!< Day, 1 .. 31.
|
||||
uint32_t hour; //!< Hour, 0 .. 23.
|
||||
uint32_t minute; //!< Minute, 0 .. 59.
|
||||
uint32_t second; //!< Second, 0 .. 59.
|
||||
uint32_t usecond; //!< Microseconds, 0 .. 999999
|
||||
} TimeOfDay_t;
|
||||
|
||||
/**
|
||||
* This method returns the number of clock ticks per second.
|
||||
* In RTEMS, this is typically 1000.
|
||||
* @return The number of ticks.
|
||||
*
|
||||
* @deprecated, we should not worry about ticks, but only time
|
||||
*/
|
||||
static uint32_t getTicksPerSecond(void);
|
||||
/**
|
||||
* This system call sets the system time.
|
||||
* To set the time, it uses a TimeOfDay_t struct.
|
||||
* @param time The struct with the time settings to set.
|
||||
* @return -@c RETURN_OK on success. Otherwise, the OS failure code
|
||||
* is returned.
|
||||
*/
|
||||
static ReturnValue_t setClock(const TimeOfDay_t *time);
|
||||
/**
|
||||
* This system call sets the system time.
|
||||
* To set the time, it uses a timeval struct.
|
||||
* @param time The struct with the time settings to set.
|
||||
* @return -@c RETURN_OK on success. Otherwise, the OS failure code is returned.
|
||||
*/
|
||||
static ReturnValue_t setClock(const timeval *time);
|
||||
/**
|
||||
* This system call returns the current system clock in timeval format.
|
||||
* The timval format has the fields @c tv_sec with seconds and @c tv_usec with
|
||||
* microseconds since an OS-defined epoch.
|
||||
* @param time A pointer to a timeval struct where the current time is stored.
|
||||
* @return @c RETURN_OK on success. Otherwise, the OS failure code is returned.
|
||||
*/
|
||||
static ReturnValue_t getClock_timeval(timeval *time);
|
||||
/**
|
||||
* This method returns the number of clock ticks per second.
|
||||
* In RTEMS, this is typically 1000.
|
||||
* @return The number of ticks.
|
||||
*
|
||||
* @deprecated, we should not worry about ticks, but only time
|
||||
*/
|
||||
static uint32_t getTicksPerSecond(void);
|
||||
/**
|
||||
* This system call sets the system time.
|
||||
* To set the time, it uses a TimeOfDay_t struct.
|
||||
* @param time The struct with the time settings to set.
|
||||
* @return -@c RETURN_OK on success. Otherwise, the OS failure code
|
||||
* is returned.
|
||||
*/
|
||||
static ReturnValue_t setClock(const TimeOfDay_t *time);
|
||||
/**
|
||||
* This system call sets the system time.
|
||||
* To set the time, it uses a timeval struct.
|
||||
* @param time The struct with the time settings to set.
|
||||
* @return -@c RETURN_OK on success. Otherwise, the OS failure code is returned.
|
||||
*/
|
||||
static ReturnValue_t setClock(const timeval *time);
|
||||
/**
|
||||
* This system call returns the current system clock in timeval format.
|
||||
* The timval format has the fields @c tv_sec with seconds and @c tv_usec with
|
||||
* microseconds since an OS-defined epoch.
|
||||
* @param time A pointer to a timeval struct where the current time is stored.
|
||||
* @return @c RETURN_OK on success. Otherwise, the OS failure code is returned.
|
||||
*/
|
||||
static ReturnValue_t getClock_timeval(timeval *time);
|
||||
|
||||
/**
|
||||
* Get the time since boot in a timeval struct
|
||||
*
|
||||
* @param[out] time A pointer to a timeval struct where the uptime is stored.
|
||||
* @return @c RETURN_OK on success. Otherwise, the OS failure code is returned.
|
||||
*
|
||||
* @deprecated, I do not think this should be able to fail, use timeval getUptime()
|
||||
*/
|
||||
static ReturnValue_t getUptime(timeval *uptime);
|
||||
/**
|
||||
* Get the time since boot in a timeval struct
|
||||
*
|
||||
* @param[out] time A pointer to a timeval struct where the uptime is stored.
|
||||
* @return @c RETURN_OK on success. Otherwise, the OS failure code is returned.
|
||||
*
|
||||
* @deprecated, I do not think this should be able to fail, use timeval getUptime()
|
||||
*/
|
||||
static ReturnValue_t getUptime(timeval *uptime);
|
||||
|
||||
static timeval getUptime();
|
||||
static timeval getUptime();
|
||||
|
||||
/**
|
||||
* Get the time since boot in milliseconds
|
||||
*
|
||||
* This value can overflow! Still, it can be used to calculate time intervalls
|
||||
* between two calls up to 49 days by always using uint32_t in the calculation
|
||||
*
|
||||
* @param ms uptime in ms
|
||||
* @return RETURN_OK on success. Otherwise, the OS failure code is returned.
|
||||
*/
|
||||
static ReturnValue_t getUptime(uint32_t *uptimeMs);
|
||||
/**
|
||||
* Get the time since boot in milliseconds
|
||||
*
|
||||
* This value can overflow! Still, it can be used to calculate time intervalls
|
||||
* between two calls up to 49 days by always using uint32_t in the calculation
|
||||
*
|
||||
* @param ms uptime in ms
|
||||
* @return RETURN_OK on success. Otherwise, the OS failure code is returned.
|
||||
*/
|
||||
static ReturnValue_t getUptime(uint32_t *uptimeMs);
|
||||
|
||||
/**
|
||||
* Returns the time in microseconds since an OS-defined epoch.
|
||||
* The time is returned in a 64 bit unsigned integer.
|
||||
* @param time A pointer to a 64 bit unisigned integer where the data is stored.
|
||||
* @return
|
||||
* - @c RETURN_OK on success.
|
||||
* - Otherwise, the OS failure code is returned.
|
||||
*/
|
||||
static ReturnValue_t getClock_usecs(uint64_t *time);
|
||||
/**
|
||||
* Returns the time in a TimeOfDay_t struct.
|
||||
* @param time A pointer to a TimeOfDay_t struct.
|
||||
* @return
|
||||
* - @c RETURN_OK on success.
|
||||
* - Otherwise, the OS failure code is returned.
|
||||
*/
|
||||
static ReturnValue_t getDateAndTime(TimeOfDay_t *time);
|
||||
/**
|
||||
* Returns the time in microseconds since an OS-defined epoch.
|
||||
* The time is returned in a 64 bit unsigned integer.
|
||||
* @param time A pointer to a 64 bit unisigned integer where the data is stored.
|
||||
* @return
|
||||
* - @c RETURN_OK on success.
|
||||
* - Otherwise, the OS failure code is returned.
|
||||
*/
|
||||
static ReturnValue_t getClock_usecs(uint64_t *time);
|
||||
/**
|
||||
* Returns the time in a TimeOfDay_t struct.
|
||||
* @param time A pointer to a TimeOfDay_t struct.
|
||||
* @return
|
||||
* - @c RETURN_OK on success.
|
||||
* - Otherwise, the OS failure code is returned.
|
||||
*/
|
||||
static ReturnValue_t getDateAndTime(TimeOfDay_t *time);
|
||||
|
||||
/**
|
||||
* Converts a time of day struct to POSIX seconds.
|
||||
* @param time The time of day as input
|
||||
* @param timeval The corresponding seconds since the epoch.
|
||||
* @return
|
||||
* - @c RETURN_OK on success.
|
||||
* - Otherwise, the OS failure code is returned.
|
||||
*/
|
||||
static ReturnValue_t convertTimeOfDayToTimeval(const TimeOfDay_t *from,
|
||||
timeval *to);
|
||||
/**
|
||||
* Converts a time of day struct to POSIX seconds.
|
||||
* @param time The time of day as input
|
||||
* @param timeval The corresponding seconds since the epoch.
|
||||
* @return
|
||||
* - @c RETURN_OK on success.
|
||||
* - Otherwise, the OS failure code is returned.
|
||||
*/
|
||||
static ReturnValue_t convertTimeOfDayToTimeval(const TimeOfDay_t *from, timeval *to);
|
||||
|
||||
/**
|
||||
* Converts a time represented as seconds and subseconds since unix
|
||||
* epoch to days since J2000
|
||||
*
|
||||
* @param time seconds since unix epoch
|
||||
* @param[out] JD2000 days since J2000
|
||||
* @return @c RETURN_OK
|
||||
*/
|
||||
static ReturnValue_t convertTimevalToJD2000(timeval time, double *JD2000);
|
||||
/**
|
||||
* Converts a time represented as seconds and subseconds since unix
|
||||
* epoch to days since J2000
|
||||
*
|
||||
* @param time seconds since unix epoch
|
||||
* @param[out] JD2000 days since J2000
|
||||
* @return @c RETURN_OK
|
||||
*/
|
||||
static ReturnValue_t convertTimevalToJD2000(timeval time, double *JD2000);
|
||||
|
||||
/**
|
||||
* Calculates and adds the offset between UTC and TT
|
||||
*
|
||||
* Depends on the leap seconds to be set correctly.
|
||||
* Therefore, it does not work for historic
|
||||
* dates as only the current leap seconds are known.
|
||||
*
|
||||
* @param utc timeval, corresponding to UTC time
|
||||
* @param[out] tt timeval, corresponding to Terrestial Time
|
||||
* @return
|
||||
* - @c RETURN_OK on success
|
||||
* - @c RETURN_FAILED if leapSeconds are not set
|
||||
*/
|
||||
static ReturnValue_t convertUTCToTT(timeval utc, timeval *tt);
|
||||
/**
|
||||
* Calculates and adds the offset between UTC and TT
|
||||
*
|
||||
* Depends on the leap seconds to be set correctly.
|
||||
* Therefore, it does not work for historic
|
||||
* dates as only the current leap seconds are known.
|
||||
*
|
||||
* @param utc timeval, corresponding to UTC time
|
||||
* @param[out] tt timeval, corresponding to Terrestial Time
|
||||
* @return
|
||||
* - @c RETURN_OK on success
|
||||
* - @c RETURN_FAILED if leapSeconds are not set
|
||||
*/
|
||||
static ReturnValue_t convertUTCToTT(timeval utc, timeval *tt);
|
||||
|
||||
/**
|
||||
* Set the Leap Seconds since 1972
|
||||
*
|
||||
* @param leapSeconds_
|
||||
* @return
|
||||
* - @c RETURN_OK on success.
|
||||
*/
|
||||
static ReturnValue_t setLeapSeconds(const uint16_t leapSeconds_);
|
||||
/**
|
||||
* Set the Leap Seconds since 1972
|
||||
*
|
||||
* @param leapSeconds_
|
||||
* @return
|
||||
* - @c RETURN_OK on success.
|
||||
*/
|
||||
static ReturnValue_t setLeapSeconds(const uint16_t leapSeconds_);
|
||||
|
||||
/**
|
||||
* Get the Leap Seconds since 1972
|
||||
*
|
||||
* Setter must be called before
|
||||
*
|
||||
* @param[out] leapSeconds_
|
||||
* @return
|
||||
* - @c RETURN_OK on success.
|
||||
* - @c RETURN_FAILED on error
|
||||
*/
|
||||
static ReturnValue_t getLeapSeconds(uint16_t *leapSeconds_);
|
||||
/**
|
||||
* Get the Leap Seconds since 1972
|
||||
*
|
||||
* Setter must be called before
|
||||
*
|
||||
* @param[out] leapSeconds_
|
||||
* @return
|
||||
* - @c RETURN_OK on success.
|
||||
* - @c RETURN_FAILED on error
|
||||
*/
|
||||
static ReturnValue_t getLeapSeconds(uint16_t *leapSeconds_);
|
||||
|
||||
private:
|
||||
/**
|
||||
* Function to check and create the Mutex for the clock
|
||||
* @return
|
||||
* - @c RETURN_OK on success.
|
||||
* - Otherwise @c RETURN_FAILED if not able to create one
|
||||
*/
|
||||
static ReturnValue_t checkOrCreateClockMutex();
|
||||
private:
|
||||
/**
|
||||
* Function to check and create the Mutex for the clock
|
||||
* @return
|
||||
* - @c RETURN_OK on success.
|
||||
* - Otherwise @c RETURN_FAILED if not able to create one
|
||||
*/
|
||||
static ReturnValue_t checkOrCreateClockMutex();
|
||||
|
||||
static MutexIF *timeMutex;
|
||||
static uint16_t leapSeconds;
|
||||
static MutexIF *timeMutex;
|
||||
static uint16_t leapSeconds;
|
||||
};
|
||||
|
||||
#endif /* FSFW_TIMEMANAGER_CLOCK_H_ */
|
||||
|
@ -1,57 +1,57 @@
|
||||
#include "fsfw/timemanager/Clock.h"
|
||||
#include "fsfw/ipc/MutexGuard.h"
|
||||
#include "fsfw/timemanager/Clock.h"
|
||||
|
||||
ReturnValue_t Clock::convertUTCToTT(timeval utc, timeval *tt) {
|
||||
uint16_t leapSeconds;
|
||||
ReturnValue_t result = getLeapSeconds(&leapSeconds);
|
||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||
return result;
|
||||
}
|
||||
timeval leapSeconds_timeval = { 0, 0 };
|
||||
leapSeconds_timeval.tv_sec = leapSeconds;
|
||||
uint16_t leapSeconds;
|
||||
ReturnValue_t result = getLeapSeconds(&leapSeconds);
|
||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||
return result;
|
||||
}
|
||||
timeval leapSeconds_timeval = {0, 0};
|
||||
leapSeconds_timeval.tv_sec = leapSeconds;
|
||||
|
||||
//initial offset between UTC and TAI
|
||||
timeval UTCtoTAI1972 = { 10, 0 };
|
||||
// initial offset between UTC and TAI
|
||||
timeval UTCtoTAI1972 = {10, 0};
|
||||
|
||||
timeval TAItoTT = { 32, 184000 };
|
||||
timeval TAItoTT = {32, 184000};
|
||||
|
||||
*tt = utc + leapSeconds_timeval + UTCtoTAI1972 + TAItoTT;
|
||||
*tt = utc + leapSeconds_timeval + UTCtoTAI1972 + TAItoTT;
|
||||
|
||||
return HasReturnvaluesIF::RETURN_OK;
|
||||
return HasReturnvaluesIF::RETURN_OK;
|
||||
}
|
||||
|
||||
ReturnValue_t Clock::setLeapSeconds(const uint16_t leapSeconds_) {
|
||||
if (checkOrCreateClockMutex() != HasReturnvaluesIF::RETURN_OK) {
|
||||
return HasReturnvaluesIF::RETURN_FAILED;
|
||||
}
|
||||
MutexGuard helper(timeMutex);
|
||||
if (checkOrCreateClockMutex() != HasReturnvaluesIF::RETURN_OK) {
|
||||
return HasReturnvaluesIF::RETURN_FAILED;
|
||||
}
|
||||
MutexGuard helper(timeMutex);
|
||||
|
||||
leapSeconds = leapSeconds_;
|
||||
leapSeconds = leapSeconds_;
|
||||
|
||||
return HasReturnvaluesIF::RETURN_OK;
|
||||
return HasReturnvaluesIF::RETURN_OK;
|
||||
}
|
||||
|
||||
ReturnValue_t Clock::getLeapSeconds(uint16_t *leapSeconds_) {
|
||||
if (timeMutex == nullptr) {
|
||||
return HasReturnvaluesIF::RETURN_FAILED;
|
||||
}
|
||||
MutexGuard helper(timeMutex);
|
||||
if (timeMutex == nullptr) {
|
||||
return HasReturnvaluesIF::RETURN_FAILED;
|
||||
}
|
||||
MutexGuard helper(timeMutex);
|
||||
|
||||
*leapSeconds_ = leapSeconds;
|
||||
*leapSeconds_ = leapSeconds;
|
||||
|
||||
return HasReturnvaluesIF::RETURN_OK;
|
||||
return HasReturnvaluesIF::RETURN_OK;
|
||||
}
|
||||
|
||||
ReturnValue_t Clock::checkOrCreateClockMutex() {
|
||||
if (timeMutex == nullptr) {
|
||||
MutexFactory *mutexFactory = MutexFactory::instance();
|
||||
if (mutexFactory == nullptr) {
|
||||
return HasReturnvaluesIF::RETURN_FAILED;
|
||||
}
|
||||
timeMutex = mutexFactory->createMutex();
|
||||
if (timeMutex == nullptr) {
|
||||
return HasReturnvaluesIF::RETURN_FAILED;
|
||||
}
|
||||
}
|
||||
return HasReturnvaluesIF::RETURN_OK;
|
||||
if (timeMutex == nullptr) {
|
||||
MutexFactory *mutexFactory = MutexFactory::instance();
|
||||
if (mutexFactory == nullptr) {
|
||||
return HasReturnvaluesIF::RETURN_FAILED;
|
||||
}
|
||||
timeMutex = mutexFactory->createMutex();
|
||||
if (timeMutex == nullptr) {
|
||||
return HasReturnvaluesIF::RETURN_FAILED;
|
||||
}
|
||||
}
|
||||
return HasReturnvaluesIF::RETURN_OK;
|
||||
}
|
||||
|
@ -1,51 +1,43 @@
|
||||
#include "fsfw/timemanager/Countdown.h"
|
||||
|
||||
Countdown::Countdown(uint32_t initialTimeout): timeout(initialTimeout) {
|
||||
}
|
||||
Countdown::Countdown(uint32_t initialTimeout) : timeout(initialTimeout) {}
|
||||
|
||||
Countdown::~Countdown() {
|
||||
}
|
||||
Countdown::~Countdown() {}
|
||||
|
||||
ReturnValue_t Countdown::setTimeout(uint32_t milliseconds) {
|
||||
ReturnValue_t returnValue = Clock::getUptime( &startTime );
|
||||
timeout = milliseconds;
|
||||
return returnValue;
|
||||
ReturnValue_t returnValue = Clock::getUptime(&startTime);
|
||||
timeout = milliseconds;
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
bool Countdown::hasTimedOut() const {
|
||||
if ( uint32_t( this->getCurrentTime() - startTime) >= timeout) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
if (uint32_t(this->getCurrentTime() - startTime) >= timeout) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool Countdown::isBusy() const {
|
||||
return !hasTimedOut();
|
||||
}
|
||||
bool Countdown::isBusy() const { return !hasTimedOut(); }
|
||||
|
||||
ReturnValue_t Countdown::resetTimer() {
|
||||
return setTimeout(timeout);
|
||||
}
|
||||
ReturnValue_t Countdown::resetTimer() { return setTimeout(timeout); }
|
||||
|
||||
void Countdown::timeOut() {
|
||||
startTime = this->getCurrentTime() - timeout;
|
||||
}
|
||||
void Countdown::timeOut() { startTime = this->getCurrentTime() - timeout; }
|
||||
|
||||
uint32_t Countdown::getRemainingMillis() const {
|
||||
// We fetch the time before the if-statement
|
||||
// to be sure that the return is in
|
||||
// range 0 <= number <= timeout
|
||||
uint32_t currentTime = this->getCurrentTime();
|
||||
if (this->hasTimedOut()){
|
||||
return 0;
|
||||
}else{
|
||||
return (startTime + timeout) - currentTime;
|
||||
}
|
||||
// We fetch the time before the if-statement
|
||||
// to be sure that the return is in
|
||||
// range 0 <= number <= timeout
|
||||
uint32_t currentTime = this->getCurrentTime();
|
||||
if (this->hasTimedOut()) {
|
||||
return 0;
|
||||
} else {
|
||||
return (startTime + timeout) - currentTime;
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t Countdown::getCurrentTime() const {
|
||||
uint32_t currentTime;
|
||||
Clock::getUptime( ¤tTime );
|
||||
return currentTime;
|
||||
uint32_t currentTime;
|
||||
Clock::getUptime(¤tTime);
|
||||
return currentTime;
|
||||
}
|
||||
|
@ -17,64 +17,65 @@
|
||||
*
|
||||
*/
|
||||
class Countdown {
|
||||
public:
|
||||
/**
|
||||
* Constructor which sets the countdown duration in milliseconds
|
||||
*
|
||||
* It does not start the countdown!
|
||||
* Call resetTimer or setTimeout before usage!
|
||||
* Otherwise a call to hasTimedOut might return True.
|
||||
*
|
||||
* @param initialTimeout Countdown duration in milliseconds
|
||||
*/
|
||||
Countdown(uint32_t initialTimeout = 0);
|
||||
~Countdown();
|
||||
/**
|
||||
* Call to set a new countdown duration.
|
||||
*
|
||||
* Resets the countdown!
|
||||
*
|
||||
* @param milliseconds new countdown duration in milliseconds
|
||||
* @return Returnvalue from Clock::getUptime
|
||||
*/
|
||||
ReturnValue_t setTimeout(uint32_t milliseconds);
|
||||
/**
|
||||
* Returns true if the countdown duration has passed.
|
||||
*
|
||||
* @return True if the countdown has passed
|
||||
* False if it is still running
|
||||
*/
|
||||
bool hasTimedOut() const;
|
||||
/**
|
||||
* Complementary to hasTimedOut.
|
||||
*
|
||||
* @return True if the countdown is till running
|
||||
* False if it is still running
|
||||
*/
|
||||
bool isBusy() const;
|
||||
/**
|
||||
* Uses last set timeout value and restarts timer.
|
||||
*/
|
||||
ReturnValue_t resetTimer();
|
||||
/**
|
||||
* Returns the remaining milliseconds (0 if timeout)
|
||||
*/
|
||||
uint32_t getRemainingMillis() const;
|
||||
/**
|
||||
* Makes hasTimedOut() return true
|
||||
*/
|
||||
void timeOut();
|
||||
/**
|
||||
* Internal countdown duration in milliseconds
|
||||
*/
|
||||
uint32_t timeout;
|
||||
private:
|
||||
/**
|
||||
* Last time the timer was started (uptime)
|
||||
*/
|
||||
uint32_t startTime = 0;
|
||||
public:
|
||||
/**
|
||||
* Constructor which sets the countdown duration in milliseconds
|
||||
*
|
||||
* It does not start the countdown!
|
||||
* Call resetTimer or setTimeout before usage!
|
||||
* Otherwise a call to hasTimedOut might return True.
|
||||
*
|
||||
* @param initialTimeout Countdown duration in milliseconds
|
||||
*/
|
||||
Countdown(uint32_t initialTimeout = 0);
|
||||
~Countdown();
|
||||
/**
|
||||
* Call to set a new countdown duration.
|
||||
*
|
||||
* Resets the countdown!
|
||||
*
|
||||
* @param milliseconds new countdown duration in milliseconds
|
||||
* @return Returnvalue from Clock::getUptime
|
||||
*/
|
||||
ReturnValue_t setTimeout(uint32_t milliseconds);
|
||||
/**
|
||||
* Returns true if the countdown duration has passed.
|
||||
*
|
||||
* @return True if the countdown has passed
|
||||
* False if it is still running
|
||||
*/
|
||||
bool hasTimedOut() const;
|
||||
/**
|
||||
* Complementary to hasTimedOut.
|
||||
*
|
||||
* @return True if the countdown is till running
|
||||
* False if it is still running
|
||||
*/
|
||||
bool isBusy() const;
|
||||
/**
|
||||
* Uses last set timeout value and restarts timer.
|
||||
*/
|
||||
ReturnValue_t resetTimer();
|
||||
/**
|
||||
* Returns the remaining milliseconds (0 if timeout)
|
||||
*/
|
||||
uint32_t getRemainingMillis() const;
|
||||
/**
|
||||
* Makes hasTimedOut() return true
|
||||
*/
|
||||
void timeOut();
|
||||
/**
|
||||
* Internal countdown duration in milliseconds
|
||||
*/
|
||||
uint32_t timeout;
|
||||
|
||||
uint32_t getCurrentTime() const;
|
||||
private:
|
||||
/**
|
||||
* Last time the timer was started (uptime)
|
||||
*/
|
||||
uint32_t startTime = 0;
|
||||
|
||||
uint32_t getCurrentTime() const;
|
||||
};
|
||||
|
||||
#endif /* FSFW_TIMEMANAGER_COUNTDOWN_H_ */
|
||||
|
@ -8,19 +8,16 @@
|
||||
* with the help of a dedicated message queue.
|
||||
*/
|
||||
class ReceivesTimeInfoIF {
|
||||
public:
|
||||
/**
|
||||
* Returns the id of the queue which receives the timing information.
|
||||
* @return Queue id of the timing queue.
|
||||
*/
|
||||
virtual MessageQueueId_t getTimeReceptionQueue() const = 0;
|
||||
/**
|
||||
* Empty virtual destructor.
|
||||
*/
|
||||
virtual ~ReceivesTimeInfoIF() {
|
||||
}
|
||||
|
||||
public:
|
||||
/**
|
||||
* Returns the id of the queue which receives the timing information.
|
||||
* @return Queue id of the timing queue.
|
||||
*/
|
||||
virtual MessageQueueId_t getTimeReceptionQueue() const = 0;
|
||||
/**
|
||||
* Empty virtual destructor.
|
||||
*/
|
||||
virtual ~ReceivesTimeInfoIF() {}
|
||||
};
|
||||
|
||||
|
||||
#endif /* FSFW_TIMEMANAGER_RECEIVESTIMEINFOIF_H_ */
|
||||
|
@ -1,74 +1,68 @@
|
||||
#include "fsfw/timemanager/Stopwatch.h"
|
||||
|
||||
#include "fsfw/serviceinterface/ServiceInterface.h"
|
||||
|
||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
||||
#include <iomanip>
|
||||
#endif
|
||||
|
||||
Stopwatch::Stopwatch(bool displayOnDestruction,
|
||||
StopwatchDisplayMode displayMode): displayOnDestruction(
|
||||
displayOnDestruction), displayMode(displayMode) {
|
||||
// Measures start time on initialization.
|
||||
Clock::getUptime(&startTime);
|
||||
Stopwatch::Stopwatch(bool displayOnDestruction, StopwatchDisplayMode displayMode)
|
||||
: displayOnDestruction(displayOnDestruction), displayMode(displayMode) {
|
||||
// Measures start time on initialization.
|
||||
Clock::getUptime(&startTime);
|
||||
}
|
||||
|
||||
void Stopwatch::start() {
|
||||
Clock::getUptime(&startTime);
|
||||
}
|
||||
void Stopwatch::start() { Clock::getUptime(&startTime); }
|
||||
|
||||
dur_millis_t Stopwatch::stop(bool display) {
|
||||
stopInternal();
|
||||
if(display) {
|
||||
this->display();
|
||||
}
|
||||
return elapsedTime.tv_sec * 1000 + elapsedTime.tv_usec / 1000;
|
||||
stopInternal();
|
||||
if (display) {
|
||||
this->display();
|
||||
}
|
||||
return elapsedTime.tv_sec * 1000 + elapsedTime.tv_usec / 1000;
|
||||
}
|
||||
|
||||
double Stopwatch::stopSeconds() {
|
||||
stopInternal();
|
||||
return timevalOperations::toDouble(elapsedTime);
|
||||
stopInternal();
|
||||
return timevalOperations::toDouble(elapsedTime);
|
||||
}
|
||||
|
||||
void Stopwatch::display() {
|
||||
if(displayMode == StopwatchDisplayMode::MILLIS) {
|
||||
dur_millis_t timeMillis = static_cast<dur_millis_t>(
|
||||
elapsedTime.tv_sec * 1000 + elapsedTime.tv_usec / 1000);
|
||||
if (displayMode == StopwatchDisplayMode::MILLIS) {
|
||||
dur_millis_t timeMillis =
|
||||
static_cast<dur_millis_t>(elapsedTime.tv_sec * 1000 + elapsedTime.tv_usec / 1000);
|
||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
||||
sif::info << "Stopwatch: Operation took " << timeMillis << " milliseconds" << std::endl;
|
||||
sif::info << "Stopwatch: Operation took " << timeMillis << " milliseconds" << std::endl;
|
||||
#else
|
||||
sif::printInfo("Stopwatch: Operation took %lu milliseconds\n\r",
|
||||
static_cast<unsigned int>(timeMillis));
|
||||
sif::printInfo("Stopwatch: Operation took %lu milliseconds\n\r",
|
||||
static_cast<unsigned int>(timeMillis));
|
||||
#endif
|
||||
}
|
||||
else if(displayMode == StopwatchDisplayMode::SECONDS) {
|
||||
} else if (displayMode == StopwatchDisplayMode::SECONDS) {
|
||||
#if FSFW_CPP_OSTREAM_ENABLED == 1
|
||||
sif::info <<"Stopwatch: Operation took " << std::setprecision(3)
|
||||
<< std::fixed << timevalOperations::toDouble(elapsedTime)
|
||||
<< " seconds" << std::endl;
|
||||
sif::info << "Stopwatch: Operation took " << std::setprecision(3) << std::fixed
|
||||
<< timevalOperations::toDouble(elapsedTime) << " seconds" << std::endl;
|
||||
#else
|
||||
sif::printInfo("Stopwatch: Operation took %.3f seconds\n\r",
|
||||
static_cast<float>(timevalOperations::toDouble(elapsedTime)));
|
||||
sif::printInfo("Stopwatch: Operation took %.3f seconds\n\r",
|
||||
static_cast<float>(timevalOperations::toDouble(elapsedTime)));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Stopwatch::~Stopwatch() {
|
||||
if(displayOnDestruction) {
|
||||
stopInternal();
|
||||
display();
|
||||
}
|
||||
if (displayOnDestruction) {
|
||||
stopInternal();
|
||||
display();
|
||||
}
|
||||
}
|
||||
|
||||
void Stopwatch::setDisplayMode(StopwatchDisplayMode displayMode) {
|
||||
this->displayMode = displayMode;
|
||||
this->displayMode = displayMode;
|
||||
}
|
||||
|
||||
StopwatchDisplayMode Stopwatch::getDisplayMode() const {
|
||||
return displayMode;
|
||||
}
|
||||
StopwatchDisplayMode Stopwatch::getDisplayMode() const { return displayMode; }
|
||||
|
||||
void Stopwatch::stopInternal() {
|
||||
timeval endTime;
|
||||
Clock::getUptime(&endTime);
|
||||
elapsedTime = endTime - startTime;
|
||||
timeval endTime;
|
||||
Clock::getUptime(&endTime);
|
||||
elapsedTime = endTime - startTime;
|
||||
}
|
||||
|
@ -3,10 +3,7 @@
|
||||
|
||||
#include "Clock.h"
|
||||
|
||||
enum class StopwatchDisplayMode {
|
||||
MILLIS,
|
||||
SECONDS
|
||||
};
|
||||
enum class StopwatchDisplayMode { MILLIS, SECONDS };
|
||||
|
||||
/**
|
||||
* @brief Simple Stopwatch implementation to measure elapsed time
|
||||
@ -18,53 +15,53 @@ enum class StopwatchDisplayMode {
|
||||
* @author R. Mueller
|
||||
*/
|
||||
class Stopwatch {
|
||||
public:
|
||||
/**
|
||||
* Default constructor. Call "Stopwatch stopwatch" without brackets if
|
||||
* no parameters are required!
|
||||
* @param displayOnDestruction If set to true, displays measured time on
|
||||
* object destruction
|
||||
* @param displayMode Display format is either MS rounded or MS as double
|
||||
* format
|
||||
* @param outputPrecision If using double format, specify precision here.
|
||||
*/
|
||||
Stopwatch(bool displayOnDestruction = true, StopwatchDisplayMode displayMode
|
||||
= StopwatchDisplayMode::MILLIS);
|
||||
virtual~ Stopwatch();
|
||||
public:
|
||||
/**
|
||||
* Default constructor. Call "Stopwatch stopwatch" without brackets if
|
||||
* no parameters are required!
|
||||
* @param displayOnDestruction If set to true, displays measured time on
|
||||
* object destruction
|
||||
* @param displayMode Display format is either MS rounded or MS as double
|
||||
* format
|
||||
* @param outputPrecision If using double format, specify precision here.
|
||||
*/
|
||||
Stopwatch(bool displayOnDestruction = true,
|
||||
StopwatchDisplayMode displayMode = StopwatchDisplayMode::MILLIS);
|
||||
virtual ~Stopwatch();
|
||||
|
||||
/**
|
||||
* Caches the start time
|
||||
*/
|
||||
void start();
|
||||
/**
|
||||
* Caches the start time
|
||||
*/
|
||||
void start();
|
||||
|
||||
/**
|
||||
* Calculates the elapsed time since start and returns it
|
||||
* @return elapsed time in milliseconds (rounded)
|
||||
*/
|
||||
dur_millis_t stop(bool display = false);
|
||||
/**
|
||||
* Calculates the elapsed time since start and returns it
|
||||
* @return elapsed time in seconds (double precision)
|
||||
*/
|
||||
double stopSeconds();
|
||||
/**
|
||||
* Calculates the elapsed time since start and returns it
|
||||
* @return elapsed time in milliseconds (rounded)
|
||||
*/
|
||||
dur_millis_t stop(bool display = false);
|
||||
/**
|
||||
* Calculates the elapsed time since start and returns it
|
||||
* @return elapsed time in seconds (double precision)
|
||||
*/
|
||||
double stopSeconds();
|
||||
|
||||
/**
|
||||
* Displays the elapsed times on the osstream, depending on internal display
|
||||
* mode.
|
||||
*/
|
||||
void display();
|
||||
/**
|
||||
* Displays the elapsed times on the osstream, depending on internal display
|
||||
* mode.
|
||||
*/
|
||||
void display();
|
||||
|
||||
StopwatchDisplayMode getDisplayMode() const;
|
||||
void setDisplayMode(StopwatchDisplayMode displayMode);
|
||||
bool displayOnDestruction = true;
|
||||
private:
|
||||
timeval startTime {0, 0};
|
||||
timeval elapsedTime {0, 0};
|
||||
StopwatchDisplayMode getDisplayMode() const;
|
||||
void setDisplayMode(StopwatchDisplayMode displayMode);
|
||||
bool displayOnDestruction = true;
|
||||
|
||||
StopwatchDisplayMode displayMode = StopwatchDisplayMode::MILLIS;
|
||||
private:
|
||||
timeval startTime{0, 0};
|
||||
timeval elapsedTime{0, 0};
|
||||
|
||||
void stopInternal();
|
||||
StopwatchDisplayMode displayMode = StopwatchDisplayMode::MILLIS;
|
||||
|
||||
void stopInternal();
|
||||
};
|
||||
|
||||
|
||||
#endif /* FSFW_TIMEMANAGER_STOPWATCH_H_ */
|
||||
|
@ -1,30 +1,25 @@
|
||||
#include "fsfw/timemanager/TimeMessage.h"
|
||||
|
||||
TimeMessage::TimeMessage() {
|
||||
this->messageSize += sizeof(timeval) + sizeof(uint32_t);
|
||||
}
|
||||
TimeMessage::TimeMessage() { this->messageSize += sizeof(timeval) + sizeof(uint32_t); }
|
||||
|
||||
TimeMessage::TimeMessage(timeval setTime, uint32_t CounterValue) {
|
||||
memcpy (this->getData(), &setTime, sizeof(timeval));
|
||||
this->messageSize += sizeof(timeval) + sizeof(uint32_t);
|
||||
memcpy (this->getData() + sizeof(timeval), &CounterValue, sizeof(uint32_t));
|
||||
memcpy(this->getData(), &setTime, sizeof(timeval));
|
||||
this->messageSize += sizeof(timeval) + sizeof(uint32_t);
|
||||
memcpy(this->getData() + sizeof(timeval), &CounterValue, sizeof(uint32_t));
|
||||
}
|
||||
|
||||
TimeMessage::~TimeMessage() {
|
||||
}
|
||||
TimeMessage::~TimeMessage() {}
|
||||
|
||||
timeval TimeMessage::getTime() {
|
||||
timeval temp;
|
||||
memcpy( &temp, this->getData(), sizeof(timeval));
|
||||
return temp;
|
||||
timeval temp;
|
||||
memcpy(&temp, this->getData(), sizeof(timeval));
|
||||
return temp;
|
||||
}
|
||||
|
||||
uint32_t TimeMessage::getCounterValue() {
|
||||
uint32_t temp;
|
||||
memcpy ( &temp, this->getData() + sizeof(timeval), sizeof(uint32_t));
|
||||
return temp;
|
||||
uint32_t temp;
|
||||
memcpy(&temp, this->getData() + sizeof(timeval), sizeof(uint32_t));
|
||||
return temp;
|
||||
}
|
||||
|
||||
size_t TimeMessage::getMinimumMessageSize() const {
|
||||
return this->MAX_SIZE;
|
||||
}
|
||||
size_t TimeMessage::getMinimumMessageSize() const { return this->MAX_SIZE; }
|
||||
|
@ -1,49 +1,50 @@
|
||||
#ifndef FSFW_TIMEMANAGER_TIMEMESSAGE_H_
|
||||
#define FSFW_TIMEMANAGER_TIMEMESSAGE_H_
|
||||
|
||||
#include "Clock.h"
|
||||
#include "../ipc/MessageQueueMessage.h"
|
||||
#include <cstring>
|
||||
|
||||
#include "../ipc/MessageQueueMessage.h"
|
||||
#include "Clock.h"
|
||||
|
||||
class TimeMessage : public MessageQueueMessage {
|
||||
protected:
|
||||
/**
|
||||
* @brief This call always returns the same fixed size of the message.
|
||||
* @return Returns HEADER_SIZE + \c sizeof(timeval) + sizeof(uint32_t).
|
||||
*/
|
||||
size_t getMinimumMessageSize() const override;
|
||||
public:
|
||||
protected:
|
||||
/**
|
||||
* @brief This call always returns the same fixed size of the message.
|
||||
* @return Returns HEADER_SIZE + \c sizeof(timeval) + sizeof(uint32_t).
|
||||
*/
|
||||
size_t getMinimumMessageSize() const override;
|
||||
|
||||
/**
|
||||
* @ brief the size of a TimeMessage
|
||||
*/
|
||||
static const uint32_t MAX_SIZE = HEADER_SIZE + sizeof(timeval) + sizeof(uint32_t);
|
||||
public:
|
||||
/**
|
||||
* @ brief the size of a TimeMessage
|
||||
*/
|
||||
static const uint32_t MAX_SIZE = HEADER_SIZE + sizeof(timeval) + sizeof(uint32_t);
|
||||
|
||||
/**
|
||||
* @brief In the default constructor, only the message_size is set.
|
||||
*/
|
||||
TimeMessage();
|
||||
/**
|
||||
* @brief With this constructor, the passed time information is directly put
|
||||
* into the message.
|
||||
* @param setTime The time information to put into the message.
|
||||
* @param counterValue The counterValue to put into the message (GPS PPS).
|
||||
*/
|
||||
TimeMessage( timeval setTime, uint32_t counterValue = 0 );
|
||||
/**
|
||||
* @brief The class's destructor is empty.
|
||||
*/
|
||||
~TimeMessage();
|
||||
/**
|
||||
* @brief This getter returns the time information in timeval format.
|
||||
* @return Returns the time stored in this packet.
|
||||
*/
|
||||
timeval getTime();
|
||||
/**
|
||||
* @brief This getter returns the CounterValue in uint32_t format.
|
||||
* @return Returns the CounterValue stored in this packet.
|
||||
*/
|
||||
uint32_t getCounterValue();
|
||||
/**
|
||||
* @brief In the default constructor, only the message_size is set.
|
||||
*/
|
||||
TimeMessage();
|
||||
/**
|
||||
* @brief With this constructor, the passed time information is directly put
|
||||
* into the message.
|
||||
* @param setTime The time information to put into the message.
|
||||
* @param counterValue The counterValue to put into the message (GPS PPS).
|
||||
*/
|
||||
TimeMessage(timeval setTime, uint32_t counterValue = 0);
|
||||
/**
|
||||
* @brief The class's destructor is empty.
|
||||
*/
|
||||
~TimeMessage();
|
||||
/**
|
||||
* @brief This getter returns the time information in timeval format.
|
||||
* @return Returns the time stored in this packet.
|
||||
*/
|
||||
timeval getTime();
|
||||
/**
|
||||
* @brief This getter returns the CounterValue in uint32_t format.
|
||||
* @return Returns the CounterValue stored in this packet.
|
||||
*/
|
||||
uint32_t getCounterValue();
|
||||
};
|
||||
|
||||
#endif /* FSFW_TIMEMANAGER_TIMEMESSAGE_H_ */
|
||||
|
@ -1,24 +1,23 @@
|
||||
#include "fsfw/timemanager/TimeStamper.h"
|
||||
#include "fsfw/timemanager/Clock.h"
|
||||
|
||||
#include <cstring>
|
||||
|
||||
TimeStamper::TimeStamper(object_id_t objectId): SystemObject(objectId) {}
|
||||
#include "fsfw/timemanager/Clock.h"
|
||||
|
||||
TimeStamper::TimeStamper(object_id_t objectId) : SystemObject(objectId) {}
|
||||
|
||||
ReturnValue_t TimeStamper::addTimeStamp(uint8_t* buffer,
|
||||
const uint8_t maxSize) {
|
||||
if(maxSize < TimeStamperIF::MISSION_TIMESTAMP_SIZE){
|
||||
return HasReturnvaluesIF::RETURN_FAILED;
|
||||
}
|
||||
ReturnValue_t TimeStamper::addTimeStamp(uint8_t* buffer, const uint8_t maxSize) {
|
||||
if (maxSize < TimeStamperIF::MISSION_TIMESTAMP_SIZE) {
|
||||
return HasReturnvaluesIF::RETURN_FAILED;
|
||||
}
|
||||
|
||||
timeval now;
|
||||
Clock::getClock_timeval(&now);
|
||||
CCSDSTime::CDS_short cds;
|
||||
ReturnValue_t result = CCSDSTime::convertToCcsds(&cds,&now);
|
||||
if(result != HasReturnvaluesIF::RETURN_OK){
|
||||
return result;
|
||||
}
|
||||
std::memcpy(buffer,&cds,sizeof(cds));
|
||||
return result;
|
||||
timeval now;
|
||||
Clock::getClock_timeval(&now);
|
||||
CCSDSTime::CDS_short cds;
|
||||
ReturnValue_t result = CCSDSTime::convertToCcsds(&cds, &now);
|
||||
if (result != HasReturnvaluesIF::RETURN_OK) {
|
||||
return result;
|
||||
}
|
||||
std::memcpy(buffer, &cds, sizeof(cds));
|
||||
return result;
|
||||
}
|
||||
|
@ -1,9 +1,9 @@
|
||||
#ifndef FSFW_TIMEMANAGER_TIMESTAMPER_H_
|
||||
#define FSFW_TIMEMANAGER_TIMESTAMPER_H_
|
||||
|
||||
#include "TimeStamperIF.h"
|
||||
#include "CCSDSTime.h"
|
||||
#include "../objectmanager/SystemObject.h"
|
||||
#include "CCSDSTime.h"
|
||||
#include "TimeStamperIF.h"
|
||||
|
||||
/**
|
||||
* @brief Time stamper which can be used to add any timestamp to a
|
||||
@ -14,23 +14,23 @@
|
||||
* overriding the #addTimeStamp function.
|
||||
* @ingroup utility
|
||||
*/
|
||||
class TimeStamper: public TimeStamperIF, public SystemObject {
|
||||
public:
|
||||
/**
|
||||
* @brief Default constructor which also registers the time stamper as a
|
||||
* system object so it can be found with the #objectManager.
|
||||
* @param objectId
|
||||
*/
|
||||
TimeStamper(object_id_t objectId);
|
||||
class TimeStamper : public TimeStamperIF, public SystemObject {
|
||||
public:
|
||||
/**
|
||||
* @brief Default constructor which also registers the time stamper as a
|
||||
* system object so it can be found with the #objectManager.
|
||||
* @param objectId
|
||||
*/
|
||||
TimeStamper(object_id_t objectId);
|
||||
|
||||
/**
|
||||
* Adds a CCSDS CDC short 8 byte timestamp to the given buffer.
|
||||
* This function can be overriden to use a custom timestamp.
|
||||
* @param buffer
|
||||
* @param maxSize
|
||||
* @return
|
||||
*/
|
||||
virtual ReturnValue_t addTimeStamp(uint8_t* buffer, const uint8_t maxSize);
|
||||
/**
|
||||
* Adds a CCSDS CDC short 8 byte timestamp to the given buffer.
|
||||
* This function can be overriden to use a custom timestamp.
|
||||
* @param buffer
|
||||
* @param maxSize
|
||||
* @return
|
||||
*/
|
||||
virtual ReturnValue_t addTimeStamp(uint8_t* buffer, const uint8_t maxSize);
|
||||
};
|
||||
|
||||
#endif /* FSFW_TIMEMANAGER_TIMESTAMPER_H_ */
|
||||
|
@ -2,8 +2,8 @@
|
||||
#define FSFW_TIMEMANAGER_TIMESTAMPERIF_H_
|
||||
|
||||
#include <FSFWConfig.h>
|
||||
|
||||
#include "../returnvalues/HasReturnvaluesIF.h"
|
||||
#include <FSFWConfig.h>
|
||||
|
||||
/**
|
||||
* A class implementing this IF provides facilities to add a time stamp to the
|
||||
@ -12,19 +12,16 @@
|
||||
* addTimeStamp may be called in parallel from a different context.
|
||||
*/
|
||||
class TimeStamperIF {
|
||||
public:
|
||||
static const uint8_t INTERFACE_ID = CLASS_ID::TIME_STAMPER_IF;
|
||||
static const ReturnValue_t BAD_TIMESTAMP = MAKE_RETURN_CODE(1);
|
||||
public:
|
||||
static const uint8_t INTERFACE_ID = CLASS_ID::TIME_STAMPER_IF;
|
||||
static const ReturnValue_t BAD_TIMESTAMP = MAKE_RETURN_CODE(1);
|
||||
|
||||
//! This is a mission-specific constant and determines the total
|
||||
//! size reserved for timestamps.
|
||||
static const uint8_t MISSION_TIMESTAMP_SIZE = fsfwconfig::FSFW_MISSION_TIMESTAMP_SIZE;
|
||||
//! This is a mission-specific constant and determines the total
|
||||
//! size reserved for timestamps.
|
||||
static const uint8_t MISSION_TIMESTAMP_SIZE = fsfwconfig::FSFW_MISSION_TIMESTAMP_SIZE;
|
||||
|
||||
virtual ReturnValue_t addTimeStamp(uint8_t* buffer,
|
||||
const uint8_t maxSize) = 0;
|
||||
virtual ~TimeStamperIF() {}
|
||||
virtual ReturnValue_t addTimeStamp(uint8_t* buffer, const uint8_t maxSize) = 0;
|
||||
virtual ~TimeStamperIF() {}
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif /* FSFW_TIMEMANAGER_TIMESTAMPERIF_H_ */
|
||||
|
Reference in New Issue
Block a user