/* * The MIT License (MIT) * * Copyright (c) 2018 Matthias P. Braendli * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ #pragma once #include #include #include #include #include #include #include "CircBufferTimestamp.hpp" class SoapyDummySession { public: SoapyDummySession(void); ~SoapyDummySession(void); }; class SoapyDummy : public SoapySDR::Device { public: SoapyDummy( const SoapySDR::Kwargs & args ); SoapyDummy(const SoapyDummy& other) = delete; SoapyDummy& operator=(const SoapyDummy& other) = delete; ~SoapyDummy( void ); /******************************************************************* * Identification API ******************************************************************/ std::string getDriverKey( void ) const; std::string getHardwareKey( void ) const; SoapySDR::Kwargs getHardwareInfo( void ) const; /******************************************************************* * Channels API ******************************************************************/ size_t getNumChannels( const int ) const; bool getFullDuplex( const int direction, const size_t channel ) const; /******************************************************************* * Stream API ******************************************************************/ std::vector getStreamFormats(const int direction, const size_t channel) const; std::string getNativeStreamFormat(const int direction, const size_t channel, double &fullScale) const; SoapySDR::ArgInfoList getStreamArgsInfo(const int direction, const size_t channel) const; SoapySDR::Stream *setupStream( const int direction, const std::string &format, const std::vector &channels = std::vector(), const SoapySDR::Kwargs &args = SoapySDR::Kwargs() ); void closeStream( SoapySDR::Stream *stream ); size_t getStreamMTU( SoapySDR::Stream *stream ) const; int activateStream( SoapySDR::Stream *stream, const int flags = 0, const long long timeNs = 0, const size_t numElems = 0 ); int deactivateStream( SoapySDR::Stream *stream, const int flags = 0, const long long timeNs = 0 ); int readStream( SoapySDR::Stream *stream, void * const *buffs, const size_t numElems, int &flags, long long &timeNs, const long timeoutUs = 100000 ); int writeStream( SoapySDR::Stream *stream, const void * const *buffs, const size_t numElems, int &flags, const long long timeNs = 0, const long timeoutUs = 100000); int readStreamStatus( SoapySDR::Stream *stream, size_t &chanMask, int &flags, long long &timeNs, const long timeoutUs ); size_t getNumDirectAccessBuffers(SoapySDR::Stream *stream); /******************************************************************* * Settings API ******************************************************************/ SoapySDR::ArgInfoList getSettingInfo(void) const; void writeSetting(const std::string &key, const std::string &value); std::string readSetting(const std::string &key) const; /******************************************************************* * Antenna API ******************************************************************/ std::vector listAntennas( const int direction, const size_t channel ) const; void setAntenna( const int direction, const size_t channel, const std::string &name ); std::string getAntenna( const int direction, const size_t channel ) const; /******************************************************************* * Frontend corrections API ******************************************************************/ bool hasDCOffsetMode( const int direction, const size_t channel ) const; /******************************************************************* * Gain API ******************************************************************/ std::vector listGains( const int direction, const size_t channel ) const; void setGainMode( const int direction, const size_t channel, const bool automatic ); bool getGainMode( const int direction, const size_t channel ) const; void setGain( const int direction, const size_t channel, const double value ); void setGain( const int direction, const size_t channel, const std::string &name, const double value ); double getGain( const int direction, const size_t channel, const std::string &name ) const; SoapySDR::Range getGainRange( const int direction, const size_t channel, const std::string &name ) const; /******************************************************************* * Frequency API ******************************************************************/ void setFrequency( const int direction, const size_t channel, const std::string &name, const double frequency, const SoapySDR::Kwargs &args = SoapySDR::Kwargs() ); double getFrequency( const int direction, const size_t channel, const std::string &name ) const; SoapySDR::ArgInfoList getFrequencyArgsInfo(const int direction, const size_t channel) const; std::vector listFrequencies( const int direction, const size_t channel ) const; SoapySDR::RangeList getFrequencyRange( const int direction, const size_t channel, const std::string &name ) const; /******************************************************************* * Sample Rate API ******************************************************************/ void setSampleRate( const int direction, const size_t channel, const double rate ); double getSampleRate( const int direction, const size_t channel ) const; std::vector listSampleRates( const int direction, const size_t channel ) const; void setBandwidth( const int direction, const size_t channel, const double bw ); double getBandwidth( const int direction, const size_t channel ) const; std::vector listBandwidths( const int direction, const size_t channel ) const; /******************************************************************* * Time API ******************************************************************/ virtual std::vector listTimeSources(void) const; virtual void setTimeSource(const std::string &source); virtual std::string getTimeSource(void) const; virtual bool hasHardwareTime(const std::string &what = "") const; virtual long long getHardwareTime(const std::string &what = "") const; virtual void setHardwareTime(const long long timeNs, const std::string &what = ""); /******************************************************************* * Dummy callback ******************************************************************/ int dummy_tx_callback( int8_t *buffer, int32_t length ); int dummy_rx_callback( int8_t *buffer, int32_t length ); private: struct DummyStream { const size_t mtu = 1024; bool active = false; }; DummyStream m_rxstream; DummyStream m_txstream; SoapySDR::Stream* const TX_STREAM = (SoapySDR::Stream*) 0x1; SoapySDR::Stream* const RX_STREAM = (SoapySDR::Stream*) 0x2; CircularBuffer > m_circ_buffer; SoapyDummySession m_session; double m_samplerate = 0; double m_frequency = 0; long long m_time_epoch; };