satdump/src-core/common/ccsds/ccsds_time.cpp
2021-10-22 18:02:59 +02:00

39 lines
No EOL
1.8 KiB
C++

#include "ccsds_time.h"
namespace ccsds
{
time_t parseCCSDSTime(CCSDSPacket &pkt, int offset, int ms_scale)
{
uint16_t days = pkt.payload[0] << 8 | pkt.payload[1];
uint32_t milliseconds_of_day = pkt.payload[2] << 24 | pkt.payload[3] << 16 | pkt.payload[4] << 8 | pkt.payload[5];
return (offset + days) * 86400 + milliseconds_of_day / ms_scale;
}
double parseCCSDSTimeFull(CCSDSPacket &pkt, int offset, int ms_scale, int us_of_ms_scale)
{
uint16_t days = pkt.payload[0] << 8 | pkt.payload[1];
uint32_t milliseconds_of_day = pkt.payload[2] << 24 | pkt.payload[3] << 16 | pkt.payload[4] << 8 | pkt.payload[5];
uint16_t microseconds_of_millisecond = pkt.payload[6] << 8 | pkt.payload[7];
return double(offset + days) * 86400.0 + double(milliseconds_of_day) / double(ms_scale) + double(microseconds_of_millisecond) / double(us_of_ms_scale);
}
double parseCCSDSTimeFullRaw(uint8_t *data, int offset, int ms_scale, int us_of_ms_scale)
{
uint16_t days = data[0] << 8 | data[1];
uint32_t milliseconds_of_day = data[2] << 24 | data[3] << 16 | data[4] << 8 | data[5];
uint16_t microseconds_of_millisecond = data[6] << 8 | data[7];
return double(offset + days) * 86400.0 + double(milliseconds_of_day) / double(ms_scale) + double(microseconds_of_millisecond) / double(us_of_ms_scale);
}
double parseCCSDSTimeFullRawUnsegmented(uint8_t *data, int offset, double ms_scale)
{
uint8_t seconds_to_convert = data[1] & 0b1111111;
uint32_t seconds_since_epoch = data[2] << 24 | data[3] << 16 | data[4] << 8 | data[5];
uint16_t subsecond_time = data[6] << 8 | data[7];
return offset * 86400.0 + double(seconds_since_epoch - seconds_to_convert) + double(subsecond_time) * double(ms_scale);
}
}