You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
175 lines
4.6 KiB
C++
175 lines
4.6 KiB
C++
/***************************************************************************
|
|
* Copyright (C) 2012 by gempa GmbH *
|
|
* *
|
|
* All Rights Reserved. *
|
|
* *
|
|
* NOTICE: All information contained herein is, and remains *
|
|
* the property of gempa GmbH and its suppliers, if any. The intellectual *
|
|
* and technical concepts contained herein are proprietary to gempa GmbH *
|
|
* and its suppliers. *
|
|
* Dissemination of this information or reproduction of this material *
|
|
* is strictly forbidden unless prior written permission is obtained *
|
|
* from gempa GmbH. *
|
|
***************************************************************************/
|
|
|
|
|
|
#include <gempa/caps/rtcm2packet.h>
|
|
#include <gempa/caps/log.h>
|
|
#include <gempa/caps/riff.h>
|
|
#include <gempa/caps/utils.h>
|
|
|
|
#include <streambuf>
|
|
#include <iostream>
|
|
#include <cstring>
|
|
|
|
|
|
namespace Gempa {
|
|
namespace CAPS {
|
|
|
|
bool RTCM2DataRecord::RTCM2Header::put(std::streambuf &buf) const {
|
|
Endianess::Writer put(buf);
|
|
|
|
put(samplingTime.year);
|
|
put(samplingTime.yday);
|
|
put(samplingTime.hour);
|
|
put(samplingTime.minute);
|
|
put(samplingTime.second);
|
|
put(samplingTime.usec);
|
|
put(samplingFrequencyNumerator);
|
|
put(samplingFrequencyDenominator);
|
|
|
|
return put.good;
|
|
}
|
|
|
|
|
|
RTCM2DataRecord::RTCM2DataRecord() {
|
|
_header.samplingFrequencyDenominator = 0;
|
|
_header.samplingFrequencyNumerator = 0;
|
|
// Just a bunch of bytes
|
|
_header.dataType = DT_Unknown;
|
|
}
|
|
|
|
void RTCM2DataRecord::setTimeStamp(const Time &ts) {
|
|
timeToTimestamp(_header.samplingTime, ts);
|
|
_startTime = ts;
|
|
}
|
|
|
|
|
|
void RTCM2DataRecord::setSamplingFrequency(uint16_t numerator, uint16_t denominator) {
|
|
_header.samplingFrequencyNumerator = numerator;
|
|
_header.samplingFrequencyDenominator = denominator;
|
|
}
|
|
|
|
|
|
const char *RTCM2DataRecord::formatName() const {
|
|
return "RTC2";
|
|
}
|
|
|
|
|
|
bool RTCM2DataRecord::readMetaData(std::streambuf &buf, int size,
|
|
Header &header,
|
|
Time &startTime, Time &endTime) {
|
|
Endianess::Reader get(buf);
|
|
|
|
get(header.samplingTime.year);
|
|
get(header.samplingTime.yday);
|
|
get(header.samplingTime.hour);
|
|
get(header.samplingTime.minute);
|
|
get(header.samplingTime.second);
|
|
get(header.samplingTime.usec);
|
|
get(header.samplingFrequencyNumerator);
|
|
get(header.samplingFrequencyDenominator);
|
|
|
|
startTime = timestampToTime(header.samplingTime);
|
|
|
|
if ( header.samplingFrequencyDenominator == 0 ||
|
|
header.samplingFrequencyNumerator == 0 ) {
|
|
endTime = startTime;
|
|
}
|
|
else {
|
|
TimeSpan ts =
|
|
header.samplingFrequencyDenominator / header.samplingFrequencyNumerator;
|
|
endTime = startTime + ts;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
const DataRecord::Header *RTCM2DataRecord::header() const {
|
|
return &_header;
|
|
}
|
|
|
|
|
|
Time RTCM2DataRecord::startTime() const {
|
|
return _startTime;
|
|
}
|
|
|
|
|
|
Time RTCM2DataRecord::endTime() const {
|
|
return _endTime;
|
|
}
|
|
|
|
|
|
bool RTCM2DataRecord::canTrim() const {
|
|
return false;
|
|
}
|
|
|
|
|
|
bool RTCM2DataRecord::canMerge() const {
|
|
return false;
|
|
}
|
|
|
|
|
|
bool RTCM2DataRecord::trim(const Time &start,
|
|
const Time &end) const {
|
|
return false;
|
|
}
|
|
|
|
|
|
size_t RTCM2DataRecord::dataSize(bool withHeader) const {
|
|
if ( withHeader )
|
|
return _data.size() + _header.dataSize();
|
|
else
|
|
return _data.size();
|
|
}
|
|
|
|
|
|
DataRecord::ReadStatus RTCM2DataRecord::get(std::streambuf &buf, int size,
|
|
const Time &start, const Time &end,
|
|
int) {
|
|
size -= _header.dataSize();
|
|
if ( size < 0 ) return RS_Error;
|
|
if ( !_header.get(buf) ) return RS_Error;
|
|
|
|
if ( _header.samplingFrequencyNumerator == 0 ||
|
|
_header.samplingFrequencyDenominator == 0 ) {
|
|
CAPS_ERROR("Sampling frequency not set");
|
|
return RS_Error;
|
|
}
|
|
|
|
TimeSpan ts =
|
|
_header.samplingFrequencyDenominator / _header.samplingFrequencyNumerator;
|
|
_startTime = timestampToTime(_header.samplingTime);
|
|
_endTime = _startTime + ts;
|
|
|
|
if ( end.valid() && (end <= _startTime) ) return RS_AfterTimeWindow;
|
|
if ( start.valid() && (start >= _endTime) ) return RS_BeforeTimeWindow;
|
|
|
|
RIFF::VectorChunk<1,false> dataChunk(_data, 0, size);
|
|
|
|
return dataChunk.get(buf, size)?RS_Complete:RS_Error;
|
|
}
|
|
|
|
|
|
bool RTCM2DataRecord::put(std::streambuf &buf, bool withHeader) const {
|
|
if ( withHeader && !_header.put(buf) ) return false;
|
|
|
|
RIFF::CPtrChunk<1,false> dataChunk(&_data[0], _data.size());
|
|
return dataChunk.put(buf);
|
|
}
|
|
|
|
|
|
}
|
|
}
|