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.
165 lines
5.3 KiB
C++
165 lines
5.3 KiB
C++
/***************************************************************************
|
|
* Copyright (C) 2016 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. *
|
|
***************************************************************************/
|
|
|
|
#ifndef GEMPA_CAPS_ENCODERFACTORY_H
|
|
#define GEMPA_CAPS_ENCODERFACTORY_H
|
|
|
|
#include "mseed/encoder.h"
|
|
|
|
#include <gempa/caps/packet.h>
|
|
|
|
namespace Gempa {
|
|
namespace CAPS {
|
|
|
|
/**
|
|
* @brief Abstract base class of the encoder factory. Each
|
|
* derived class must implement the create and the
|
|
* supportsRecord method.
|
|
*/
|
|
class EncoderFactory {
|
|
public:
|
|
EncoderFactory();
|
|
virtual ~EncoderFactory();
|
|
/**
|
|
* @brief Creates encoder from given parameter set
|
|
* @param networkCode The nework code
|
|
* @param stationCode The station code
|
|
* @param locationCode The location code
|
|
* @param channelCode The channel code
|
|
* @param dt The data encoding
|
|
* @param samplingFrequencyNumerator The numerator
|
|
* @param samplingFrequencyDenominator The denominator
|
|
* @param samplingFrequencyDenominator The timing quality
|
|
* @return The encoder object or NULL if creation fails
|
|
*/
|
|
virtual Encoder* create(const std::string &networkCode,
|
|
const std::string &stationCode,
|
|
const std::string &locationCode,
|
|
const std::string &channelCode,
|
|
int dt,
|
|
int samplingFrequencyNumerator,
|
|
int samplingFrequencyDenominator) = 0;
|
|
|
|
/**
|
|
* @brief Checks if an encoder factory
|
|
* supports the given record.
|
|
* @param rec The record to check
|
|
* @return True if the data type is supported
|
|
*/
|
|
virtual bool supportsRecord(DataRecord *rec) = 0;
|
|
|
|
/**
|
|
* @brief Returns a human readable error description
|
|
* of the last error occured.
|
|
* @return Error description
|
|
*/
|
|
const std::string& errorString() const;
|
|
|
|
protected:
|
|
std::string _errorString;
|
|
};
|
|
|
|
|
|
/**
|
|
* @brief Base class for all MSEED encoders
|
|
*/
|
|
class MSEEDEncoderFactory : public EncoderFactory {
|
|
public:
|
|
MSEEDEncoderFactory();
|
|
|
|
/**
|
|
* @brief Sets the volume logical record length expressed as a
|
|
* power of 2. A 512 byte record would be 9.
|
|
* @param recLen The record length expressed as a power of 2
|
|
* @return True if the record length is valid
|
|
*/
|
|
bool setRecordLength(unsigned int recordLength);
|
|
|
|
protected:
|
|
uint8_t _recordLength;
|
|
};
|
|
|
|
/**
|
|
* @brief Implements a general Steim encoder factory
|
|
* interface which implements the supportsRecord method
|
|
* only.
|
|
*/
|
|
class SteimEncoderFactory : public MSEEDEncoderFactory {
|
|
public:
|
|
/**
|
|
* @brief Checks if an encoder factory
|
|
* supports the given record. In case of data type float or double we
|
|
* return true but the values will casted implicitly to int32.
|
|
* @param rec The record to check
|
|
* @return True if the data type is supported
|
|
*/
|
|
bool supportsRecord(DataRecord *rec);
|
|
};
|
|
|
|
|
|
/**
|
|
* @brief The IdentiyEncoderFactory class implements the
|
|
* encoder factory interface and supports the creation of
|
|
* identiy encoders.
|
|
*/
|
|
class IdentityEncoderFactory : public MSEEDEncoderFactory {
|
|
public:
|
|
Encoder* create(const std::string &networkCode,
|
|
const std::string &stationCode,
|
|
const std::string &locationCode,
|
|
const std::string &channelCode,
|
|
int dt,
|
|
int samplingFrequencyNumerator,
|
|
int samplingFrequencyDenominator);
|
|
bool supportsRecord(DataRecord *rec);
|
|
};
|
|
|
|
|
|
/**
|
|
* @brief The Steim1EncoderFactory class implements the
|
|
* encoder factory interface and supports the creation of
|
|
* Steim2 encoders.
|
|
*/
|
|
class Steim1EncoderFactory : public SteimEncoderFactory {
|
|
public:
|
|
Encoder* create(const std::string &networkCode,
|
|
const std::string &stationCode,
|
|
const std::string &locationCode,
|
|
const std::string &channelCode,
|
|
int dt,
|
|
int samplingFrequencyNumerator,
|
|
int samplingFrequencyDenominator);
|
|
};
|
|
|
|
/**
|
|
* @brief The Steim2EncoderFactory class implements the
|
|
* encoder factory interface and supports the creation of
|
|
* Steim2 encoders.
|
|
*/
|
|
class Steim2EncoderFactory : public SteimEncoderFactory {
|
|
public:
|
|
Encoder* create(const std::string &networkCode,
|
|
const std::string &stationCode,
|
|
const std::string &locationCode,
|
|
const std::string &channelCode,
|
|
int dt,
|
|
int samplingFrequencyNumerator,
|
|
int samplingFrequencyDenominator);
|
|
};
|
|
|
|
}
|
|
}
|
|
|
|
#endif
|