diff --git a/CMakeLists.txt b/CMakeLists.txt index c15af6366..0eaf95702 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -228,11 +228,11 @@ list(APPEND trunk_recorder_sources trunk-recorder/systems/p25_parser.cc trunk-recorder/systems/smartnet_decode.cc trunk-recorder/systems/system_impl.cc - trunk-recorder/recorders/debug_recorder.cc - trunk-recorder/recorders/sigmf_recorder.cc + trunk-recorder/recorders/debug_recorder_impl.cc + trunk-recorder/recorders/sigmf_recorder_impl.cc trunk-recorder/recorders/analog_recorder.cc - trunk-recorder/recorders/dmr_recorder.cc - trunk-recorder/recorders/p25_recorder.cc + trunk-recorder/recorders/dmr_recorder_impl.cc + trunk-recorder/recorders/p25_recorder_impl.cc trunk-recorder/recorders/p25_recorder_fsk4_demod.cc trunk-recorder/recorders/p25_recorder_qpsk_demod.cc trunk-recorder/recorders/p25_recorder_decode.cc diff --git a/trunk-recorder/recorders/analog_recorder.h b/trunk-recorder/recorders/analog_recorder.h index 096dacf44..ebfcd379f 100644 --- a/trunk-recorder/recorders/analog_recorder.h +++ b/trunk-recorder/recorders/analog_recorder.h @@ -45,7 +45,6 @@ class Source; class analog_recorder; #include "../systems/system.h" -#include "../systems/system_impl.h" #include "recorder.h" #include "../gr_blocks/decoder_wrapper.h" #include "../gr_blocks/plugin_wrapper.h" diff --git a/trunk-recorder/recorders/debug_recorder.h b/trunk-recorder/recorders/debug_recorder.h index 143b2166b..38817eba3 100644 --- a/trunk-recorder/recorders/debug_recorder.h +++ b/trunk-recorder/recorders/debug_recorder.h @@ -1,5 +1,5 @@ -#ifndef debug_RECORDER_H -#define debug_RECORDER_H +#ifndef DEBUG_RECORDER_H +#define DEBUG_RECORDER_H #define _USE_MATH_DEFINES @@ -18,43 +18,6 @@ #include #include -#include -#include -#include -#include -#include -#include - -#if GNURADIO_VERSION < 0x030800 -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include #include "recorder.h" #include "../gr_blocks/freq_xlating_fft_filter.h" @@ -72,78 +35,30 @@ class debug_recorder; debug_recorder_sptr make_debug_recorder(Source *src, std::string address, int port); #include "../source.h" -class debug_recorder : public gr::hier_block2, public Recorder { - friend debug_recorder_sptr make_debug_recorder(Source *src, std::string address, int port); +class debug_recorder : virtual public gr::hier_block2, virtual public Recorder { + static debug_recorder_sptr make_debug_recorder(Source *src, std::string address, int port); -protected: - debug_recorder(Source *src, std::string address, int port); public: - ~debug_recorder(); - - void tune_freq(double f); - void tune_offset(double f); - bool start(Call *call); - void stop(); - double get_freq(); - int get_num(); - double get_current_length(); - bool is_active(); - State get_state(); - int lastupdate(); - long elapsed(); - Source *get_source(); - long get_source_count(); - Call_Source *get_source_list(); - void initialize_prefilter(); - DecimSettings get_decim(long speed); - void generate_arb_taps(); - //void forecast(int noutput_items, gr_vector_int &ninput_items_required); - -private: - double chan_freq; - double center_freq; - long talkgroup; - time_t timestamp; - time_t starttime; - - Config *config; - Source *source; - - //int num; - State state; - - double system_channel_rate; - double arb_rate; - double samples_per_symbol; - double symbol_rate; - - long decim; - double resampled_rate; - bool double_decim; - long if1; - long if2; - long input_rate; - const int phase1_samples_per_symbol = 5; - const double phase1_symbol_rate = 4800; - - std::vector arb_taps; - std::vector sym_taps; - std::vector baseband_noise_filter_taps; - std::vector bandpass_filter_coeffs; - std::vector lowpass_filter_coeffs; - std::vector cutoff_filter_coeffs; - - gr::filter::fft_filter_ccc::sptr bandpass_filter; - gr::filter::fft_filter_ccf::sptr lowpass_filter; - gr::filter::fft_filter_ccf::sptr cutoff_filter; - - gr::blocks::copy::sptr valve; - gr::analog::sig_source_c::sptr lo; - gr::analog::sig_source_c::sptr bfo; - gr::blocks::multiply_cc::sptr mixer; - gr::blocks::udp_sink::sptr udp_sink; - gr::filter::pfb_arb_resampler_ccf::sptr arb_resampler; + virtual ~debug_recorder() {}; + + virtual void tune_freq(double f) = 0; + virtual void tune_offset(double f) = 0; + virtual bool start(Call *call) = 0; + virtual void stop() = 0; + virtual double get_freq() = 0; + virtual int get_num() = 0; + virtual double get_current_length() = 0; + virtual bool is_active() = 0; + virtual State get_state() = 0; + virtual int lastupdate() = 0; + virtual long elapsed() = 0; + virtual Source *get_source() = 0; + virtual long get_source_count() = 0; + virtual Call_Source *get_source_list() = 0; + virtual void initialize_prefilter() = 0; + virtual DecimSettings get_decim(long speed) = 0; + virtual void generate_arb_taps() = 0; }; #endif diff --git a/trunk-recorder/recorders/debug_recorder.cc b/trunk-recorder/recorders/debug_recorder_impl.cc similarity index 87% rename from trunk-recorder/recorders/debug_recorder.cc rename to trunk-recorder/recorders/debug_recorder_impl.cc index ca9276030..f53c5266b 100644 --- a/trunk-recorder/recorders/debug_recorder.cc +++ b/trunk-recorder/recorders/debug_recorder_impl.cc @@ -1,13 +1,17 @@ #include "debug_recorder.h" +#include "debug_recorder_impl.h" #include //static int rec_counter=0; debug_recorder_sptr make_debug_recorder(Source *src, std::string address, int port) { - return gnuradio::get_initial_sptr(new debug_recorder(src, address, port)); + debug_recorder *recorder = new debug_recorder_impl(src, address, port); + + return gnuradio::get_initial_sptr(recorder); + } -void debug_recorder::generate_arb_taps() { +void debug_recorder_impl::generate_arb_taps() { double arb_size = 32; double arb_atten = 100; @@ -41,7 +45,7 @@ void debug_recorder::generate_arb_taps() { } } -debug_recorder::DecimSettings debug_recorder::get_decim(long speed) { +debug_recorder_impl::DecimSettings debug_recorder_impl::get_decim(long speed) { long s = speed; long if_freqs[] = {32000}; DecimSettings decim_settings = {-1, -1}; @@ -69,7 +73,7 @@ debug_recorder::DecimSettings debug_recorder::get_decim(long speed) { return decim_settings; } -void debug_recorder::initialize_prefilter() { +void debug_recorder_impl::initialize_prefilter() { //double phase1_channel_rate = phase1_symbol_rate * phase1_samples_per_symbol; //double phase2_channel_rate = phase2_symbol_rate * phase2_samples_per_symbol; long if_rate = 32000; @@ -86,7 +90,7 @@ void debug_recorder::initialize_prefilter() { lo = gr::analog::sig_source_c::make(input_rate, gr::analog::GR_SIN_WAVE, 0, 1.0, 0.0); mixer = gr::blocks::multiply_cc::make(); - debug_recorder::DecimSettings decim_settings = get_decim(input_rate); + debug_recorder_impl::DecimSettings decim_settings = get_decim(input_rate); if (decim_settings.decim != -1) { double_decim = true; decim = decim_settings.decim; @@ -138,7 +142,7 @@ void debug_recorder::initialize_prefilter() { connect(lowpass_filter, 0, arb_resampler, 0); } -debug_recorder::debug_recorder(Source *src, std::string address, int port) +debug_recorder_impl::debug_recorder_impl(Source *src, std::string address, int port) : gr::hier_block2("debug_recorder", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(0, 0, sizeof(float))), @@ -160,25 +164,24 @@ debug_recorder::debug_recorder(Source *src, std::string address, int port) connect(arb_resampler, 0, udp_sink, 0); } -debug_recorder::~debug_recorder() {} -long debug_recorder::get_source_count() { +long debug_recorder_impl::get_source_count() { return 0; } -Call_Source *debug_recorder::get_source_list() { +Call_Source *debug_recorder_impl::get_source_list() { return NULL; //wav_sink->get_source_list(); } -Source *debug_recorder::get_source() { +Source *debug_recorder_impl::get_source() { return source; } -int debug_recorder::get_num() { +int debug_recorder_impl::get_num() { return rec_num; } -bool debug_recorder::is_active() { +bool debug_recorder_impl::is_active() { if (state == ACTIVE) { return true; } else { @@ -186,28 +189,28 @@ bool debug_recorder::is_active() { } } -double debug_recorder::get_freq() { +double debug_recorder_impl::get_freq() { return chan_freq; } -double debug_recorder::get_current_length() { +double debug_recorder_impl::get_current_length() { return 0; //wav_sink->length_in_seconds(); } -int debug_recorder::lastupdate() { +int debug_recorder_impl::lastupdate() { return time(NULL) - timestamp; } -long debug_recorder::elapsed() { +long debug_recorder_impl::elapsed() { return time(NULL) - starttime; } -void debug_recorder::tune_freq(double f) { +void debug_recorder_impl::tune_freq(double f) { chan_freq = f; float freq = (center_freq - f); tune_offset(freq); } -void debug_recorder::tune_offset(double f) { +void debug_recorder_impl::tune_offset(double f) { float freq = static_cast(f); @@ -232,11 +235,11 @@ void debug_recorder::tune_offset(double f) { } } -State debug_recorder::get_state() { +State debug_recorder_impl::get_state() { return state; } -void debug_recorder::stop() { +void debug_recorder_impl::stop() { if (state == ACTIVE) { BOOST_LOG_TRIVIAL(error) << "debug_recorder.cc: Stopping Logger \t[ " << rec_num << " ] - freq[ " << chan_freq << "] \t talkgroup[ " << talkgroup << " ]"; state = INACTIVE; @@ -246,7 +249,7 @@ void debug_recorder::stop() { } } -bool debug_recorder::start(Call *call) { +bool debug_recorder_impl::start(Call *call) { if (state == INACTIVE) { timestamp = time(NULL); starttime = time(NULL); diff --git a/trunk-recorder/recorders/debug_recorder_impl.h b/trunk-recorder/recorders/debug_recorder_impl.h new file mode 100644 index 000000000..236c84bc6 --- /dev/null +++ b/trunk-recorder/recorders/debug_recorder_impl.h @@ -0,0 +1,151 @@ +#ifndef DEBUG_RECORDER_IMPL_H +#define DEBUG_RECORDER_IMPL_H + +#define _USE_MATH_DEFINES + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include +#include +#include +#include + +#if GNURADIO_VERSION < 0x030800 +#include +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#endif + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "recorder.h" +#include "debug_recorder.h" +#include "../source.h" +#include "../gr_blocks/freq_xlating_fft_filter.h" + + +class Source; +class debug_recorder; + + #if GNURADIO_VERSION < 0x030900 + typedef boost::shared_ptr debug_recorder_sptr; + #else + typedef std::shared_ptr debug_recorder_sptr; + #endif + + + + +class debug_recorder_impl : public debug_recorder { + friend debug_recorder_sptr make_debug_recorder(Source *src, std::string address, int port); + +protected: + debug_recorder_impl(Source *src, std::string address, int port); + +public: + + + void tune_freq(double f); + void tune_offset(double f); + bool start(Call *call); + void stop(); + double get_freq(); + int get_num(); + double get_current_length(); + bool is_active(); + State get_state(); + int lastupdate(); + long elapsed(); + Source *get_source(); + long get_source_count(); + Call_Source *get_source_list(); + void initialize_prefilter(); + DecimSettings get_decim(long speed); + void generate_arb_taps(); + //void forecast(int noutput_items, gr_vector_int &ninput_items_required); + +private: + double chan_freq; + double center_freq; + long talkgroup; + time_t timestamp; + time_t starttime; + + Config *config; + Source *source; + + //int num; + State state; + + double system_channel_rate; + double arb_rate; + double samples_per_symbol; + double symbol_rate; + + long decim; + double resampled_rate; + bool double_decim; + long if1; + long if2; + long input_rate; + const int phase1_samples_per_symbol = 5; + const double phase1_symbol_rate = 4800; + + std::vector arb_taps; + std::vector sym_taps; + std::vector baseband_noise_filter_taps; + std::vector bandpass_filter_coeffs; + std::vector lowpass_filter_coeffs; + std::vector cutoff_filter_coeffs; + + gr::filter::fft_filter_ccc::sptr bandpass_filter; + gr::filter::fft_filter_ccf::sptr lowpass_filter; + gr::filter::fft_filter_ccf::sptr cutoff_filter; + + gr::blocks::copy::sptr valve; + gr::analog::sig_source_c::sptr lo; + gr::analog::sig_source_c::sptr bfo; + gr::blocks::multiply_cc::sptr mixer; + gr::blocks::udp_sink::sptr udp_sink; + gr::filter::pfb_arb_resampler_ccf::sptr arb_resampler; +}; + +#endif diff --git a/trunk-recorder/recorders/dmr_recorder.h b/trunk-recorder/recorders/dmr_recorder.h index 4982f85b2..94a2cb296 100644 --- a/trunk-recorder/recorders/dmr_recorder.h +++ b/trunk-recorder/recorders/dmr_recorder.h @@ -13,71 +13,10 @@ #include #include #include - -#include -#include -#include - -#include -#include -#include -#include - - -#include -#include - -//#include - -#if GNURADIO_VERSION < 0x030800 -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif - - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - - - -#if GNURADIO_VERSION < 0x030800 -#include -#include -#else -#include -#include -#endif -#include -#include - - -#include -#include -#include -#include - +#include "../source.h" #include "recorder.h" #include "../gr_blocks/plugin_wrapper_impl.h" -#include "../gr_blocks/transmission_sink.h" -#include "../gr_blocks/selector.h" + class Source; class dmr_recorder; @@ -90,140 +29,33 @@ class dmr_recorder; dmr_recorder_sptr make_dmr_recorder(Source *src); -#include "../source.h" -class dmr_recorder : public gr::hier_block2, public Recorder { - friend dmr_recorder_sptr make_dmr_recorder(Source *src); +class dmr_recorder : virtual public gr::hier_block2, virtual public Recorder { -protected: - dmr_recorder(); - dmr_recorder(std::string type); - virtual void initialize(Source *src); public: - virtual ~dmr_recorder(); - DecimSettings get_decim(long speed); - void initialize_prefilter(); - void initialize_qpsk(); - void initialize_fsk4(); - void initialize_p25(); - void tune_offset(double f); - void tune_freq(double f); - bool start(Call *call); - void stop(); - double get_freq(); - int get_num(); - void set_tdma(bool phase2); - void switch_tdma(bool phase2); - void set_tdma_slot(int slot); - void set_record_more_transmissions(bool more); - double since_last_write(); - void generate_arb_taps(); - double get_current_length(); - bool is_active(); - bool is_idle(); - bool is_squelched(); - std::vector get_transmission_list(); - State get_state(); - int lastupdate(); - long elapsed(); - Source *get_source(); - - void plugin_callback_handler(int16_t *samples, int sampleCount); - -protected: - State state; - time_t timestamp; - time_t starttime; - long talkgroup; - std::string short_name; - Call *call; - Config *config; - Source *source; - double chan_freq; - double center_freq; - bool qpsk_mod; - bool conventional; - double squelch_db; - gr::analog::pwr_squelch_cc::sptr squelch; - gr::blocks::selector::sptr modulation_selector; - gr::blocks::copy::sptr valve; - //gr::blocks::multiply_const_ss::sptr levels; - - -gr::op25_repeater::gardner_costas_cc::sptr costas_clock; -private: - double system_channel_rate; - double arb_rate; - double samples_per_symbol; - double symbol_rate; - double initial_rate; - long decim; - double resampled_rate; - - int silence_frames; - int tdma_slot; - bool d_phase2_tdma; - bool double_decim; - long if1; - long if2; - long input_rate; - const int phase1_samples_per_symbol = 5; - const int phase2_samples_per_symbol = 4; - const double phase1_symbol_rate = 4800; - const double phase2_symbol_rate = 6000; - - std::vector arb_taps; - - - - std::vector bandpass_filter_coeffs; - std::vector lowpass_filter_coeffs; - std::vector cutoff_filter_coeffs; - - gr::analog::sig_source_c::sptr lo; - gr::analog::sig_source_c::sptr bfo; - gr::blocks::multiply_cc::sptr mixer; - - /* GR blocks */ - gr::filter::fft_filter_ccc::sptr bandpass_filter; - gr::filter::fft_filter_ccf::sptr lowpass_filter; - gr::filter::fft_filter_ccf::sptr cutoff_filter; - - gr::filter::pfb_arb_resampler_ccf::sptr arb_resampler; - - - gr::blocks::multiply_const_ff::sptr rescale; - - - /* FSK4 Stuff */ - - std::vector baseband_noise_filter_taps; - std::vector sym_taps; - gr::msg_queue::sptr tune_queue; - - gr::filter::fft_filter_fff::sptr noise_filter; - gr::filter::fir_filter_fff::sptr sym_filter; - - - gr::blocks::multiply_const_ff::sptr pll_amp; - gr::analog::pll_freqdet_cf::sptr pll_freq_lock; - gr::op25_repeater::fsk4_demod_ff::sptr fsk4_demod; - gr::op25_repeater::fsk4_slicer_fb::sptr slicer; - - - /* P25 Decoder */ - gr::op25_repeater::frame_assembler::sptr framer; - gr::op25_repeater::p25_frame_assembler::sptr op25_frame_assembler; - gr::msg_queue::sptr traffic_queue; - gr::msg_queue::sptr rx_queue; - - gr::blocks::short_to_float::sptr converter_slot0; - gr::blocks::short_to_float::sptr converter_slot1; - gr::blocks::multiply_const_ff::sptr levels; - gr::blocks::transmission_sink::sptr wav_sink_slot0; - gr::blocks::transmission_sink::sptr wav_sink_slot1; - gr::blocks::plugin_wrapper::sptr plugin_sink; + virtual ~dmr_recorder() {}; + virtual void tune_offset(double f) = 0; + virtual void tune_freq(double f) = 0; + virtual bool start(Call *call) = 0; + virtual void stop() = 0; + virtual double get_freq() = 0; + virtual int get_num() = 0; + virtual void set_tdma(bool phase2) = 0; + virtual void switch_tdma(bool phase2) = 0; + virtual void set_tdma_slot(int slot) = 0; + virtual void set_record_more_transmissions(bool more) = 0; + virtual double since_last_write() = 0; + virtual void generate_arb_taps() = 0; + virtual double get_current_length() = 0; + virtual bool is_active() = 0; + virtual bool is_idle() = 0; + virtual bool is_squelched() = 0; + virtual std::vector get_transmission_list() = 0; + virtual State get_state() = 0; + virtual int lastupdate() = 0; + virtual long elapsed() = 0; + virtual Source *get_source() = 0; }; diff --git a/trunk-recorder/recorders/dmr_recorder.cc b/trunk-recorder/recorders/dmr_recorder_impl.cc similarity index 89% rename from trunk-recorder/recorders/dmr_recorder.cc rename to trunk-recorder/recorders/dmr_recorder_impl.cc index adad03ef5..177ddfc65 100644 --- a/trunk-recorder/recorders/dmr_recorder.cc +++ b/trunk-recorder/recorders/dmr_recorder_impl.cc @@ -1,17 +1,18 @@ -#include "dmr_recorder.h" +#include "dmr_recorder_impl.h" + #include "../formatter.h" #include #include "../gr_blocks/plugin_wrapper_impl.h" #include "../plugin_manager/plugin_manager.h" dmr_recorder_sptr make_dmr_recorder(Source *src) { - dmr_recorder *recorder = new dmr_recorder(); - recorder->initialize(src); + dmr_recorder *recorder = new dmr_recorder_impl(src); + return gnuradio::get_initial_sptr(recorder); } -void dmr_recorder::generate_arb_taps() { +void dmr_recorder_impl::generate_arb_taps() { double arb_size = 32; double arb_atten = 100; @@ -45,21 +46,16 @@ void dmr_recorder::generate_arb_taps() { } } -dmr_recorder::dmr_recorder() - : gr::hier_block2("dmr_recorder", - gr::io_signature::make(1, 1, sizeof(gr_complex)), - gr::io_signature::make(0, 0, sizeof(float))), - Recorder("DMR") { -} -dmr_recorder::dmr_recorder(std::string type) +dmr_recorder_impl::dmr_recorder_impl(Source *src) : gr::hier_block2("dmr_recorder", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(0, 0, sizeof(float))), - Recorder(type) { + Recorder("DMR") { + initialize(src); } -dmr_recorder::DecimSettings dmr_recorder::get_decim(long speed) { +dmr_recorder_impl::DecimSettings dmr_recorder_impl::get_decim(long speed) { long s = speed; long if_freqs[] = {24000, 25000, 32000}; DecimSettings decim_settings = {-1, -1}; @@ -86,7 +82,7 @@ dmr_recorder::DecimSettings dmr_recorder::get_decim(long speed) { BOOST_LOG_TRIVIAL(error) << "DMR recorder Decim: Nothing found"; return decim_settings; } -void dmr_recorder::initialize_prefilter() { +void dmr_recorder_impl::initialize_prefilter() { double phase1_channel_rate = phase1_symbol_rate * phase1_samples_per_symbol; long if_rate = phase1_channel_rate; long fa = 0; @@ -99,7 +95,7 @@ void dmr_recorder::initialize_prefilter() { lo = gr::analog::sig_source_c::make(input_rate, gr::analog::GR_SIN_WAVE, 0, 1.0, 0.0); mixer = gr::blocks::multiply_cc::make(); - dmr_recorder::DecimSettings decim_settings = get_decim(input_rate); + dmr_recorder_impl::DecimSettings decim_settings = get_decim(input_rate); if (decim_settings.decim != -1) { double_decim = true; decim = decim_settings.decim; @@ -150,7 +146,7 @@ void dmr_recorder::initialize_prefilter() { connect(arb_resampler, 0, cutoff_filter, 0); } -void dmr_recorder::initialize(Source *src) { +void dmr_recorder_impl::initialize(Source *src) { source = src; chan_freq = source->get_center(); center_freq = source->get_center(); @@ -224,7 +220,7 @@ void dmr_recorder::initialize(Source *src) { framer = gr::op25_repeater::frame_assembler::make(0,"file:///tmp/out1.raw", verbosity, 1, rx_queue); //op25_frame_assembler = gr::op25_repeater::p25_frame_assembler::make(0, silence_frames, udp_host, udp_port, verbosity, do_imbe, do_output, do_msgq, rx_queue, do_audio_output, do_tdma, do_nocrypt); levels = gr::blocks::multiply_const_ff::make(1); - plugin_sink = gr::blocks::plugin_wrapper_impl::make(std::bind(&dmr_recorder::plugin_callback_handler, this, std::placeholders::_1, std::placeholders::_2)); + plugin_sink = gr::blocks::plugin_wrapper_impl::make(std::bind(&dmr_recorder_impl::plugin_callback_handler, this, std::placeholders::_1, std::placeholders::_2)); // Squelch DB @@ -247,11 +243,11 @@ void dmr_recorder::initialize(Source *src) { connect(framer, 1, wav_sink_slot1, 0); } -void dmr_recorder::plugin_callback_handler(int16_t *samples, int sampleCount) { +void dmr_recorder_impl::plugin_callback_handler(int16_t *samples, int sampleCount) { //plugman_audio_callback(_recorder, samples, sampleCount); } -void dmr_recorder::switch_tdma(bool phase2) { +void dmr_recorder_impl::switch_tdma(bool phase2) { double phase1_channel_rate = phase1_symbol_rate * phase1_samples_per_symbol; long if_rate = phase1_channel_rate; @@ -269,7 +265,7 @@ void dmr_recorder::switch_tdma(bool phase2) { //op25_frame_assembler->set_phase2_tdma(d_phase2_tdma); } -void dmr_recorder::set_tdma(bool phase2) { +void dmr_recorder_impl::set_tdma(bool phase2) { if (phase2 != d_phase2_tdma) { switch_tdma(phase2); } @@ -277,26 +273,24 @@ void dmr_recorder::set_tdma(bool phase2) { -dmr_recorder::~dmr_recorder() {} - -Source *dmr_recorder::get_source() { +Source *dmr_recorder_impl::get_source() { return source; } -int dmr_recorder::get_num() { +int dmr_recorder_impl::get_num() { return rec_num; } -double dmr_recorder::since_last_write() { +double dmr_recorder_impl::since_last_write() { time_t now = time(NULL); return now - wav_sink_slot0->get_stop_time(); } -State dmr_recorder::get_state() { +State dmr_recorder_impl::get_state() { return wav_sink_slot0->get_state(); } -bool dmr_recorder::is_active() { +bool dmr_recorder_impl::is_active() { if (state == ACTIVE) { return true; } else { @@ -304,13 +298,13 @@ bool dmr_recorder::is_active() { } } -bool dmr_recorder::is_squelched() { +bool dmr_recorder_impl::is_squelched() { if (state == ACTIVE) { return !squelch->unmuted(); } return true; } -bool dmr_recorder::is_idle() { +bool dmr_recorder_impl::is_idle() { if ((wav_sink_slot0->get_state() == IDLE) || (wav_sink_slot0->get_state() == STOPPED)) { return true; @@ -319,28 +313,28 @@ bool dmr_recorder::is_idle() { return false; } -double dmr_recorder::get_freq() { +double dmr_recorder_impl::get_freq() { return chan_freq; } -double dmr_recorder::get_current_length() { +double dmr_recorder_impl::get_current_length() { return wav_sink_slot0->total_length_in_seconds(); } -int dmr_recorder::lastupdate() { +int dmr_recorder_impl::lastupdate() { return time(NULL) - timestamp; } -long dmr_recorder::elapsed() { +long dmr_recorder_impl::elapsed() { return time(NULL) - starttime; } -void dmr_recorder::tune_freq(double f) { +void dmr_recorder_impl::tune_freq(double f) { chan_freq = f; float freq = (center_freq - f); tune_offset(freq); } -void dmr_recorder::tune_offset(double f) { +void dmr_recorder_impl::tune_offset(double f) { float freq = static_cast(f); @@ -366,7 +360,7 @@ void dmr_recorder::tune_offset(double f) { } -void dmr_recorder::set_record_more_transmissions(bool more) { +void dmr_recorder_impl::set_record_more_transmissions(bool more) { return wav_sink_slot0->set_record_more_transmissions(more); } @@ -378,7 +372,7 @@ bool compareTransmissions(Transmission t1, Transmission t2) } -std::vector dmr_recorder::get_transmission_list() { +std::vector dmr_recorder_impl::get_transmission_list() { std::vector return_list = wav_sink_slot0->get_transmission_list(); std::vector second_list = wav_sink_slot1->get_transmission_list(); BOOST_LOG_TRIVIAL(info) << "Slot 0: " << return_list.size() << " Slot 1: " << second_list.size(); @@ -392,7 +386,7 @@ std::vector dmr_recorder::get_transmission_list() { -void dmr_recorder::stop() { +void dmr_recorder_impl::stop() { if (state == ACTIVE) { recording_duration += wav_sink_slot0->total_length_in_seconds(); @@ -408,12 +402,12 @@ void dmr_recorder::stop() { } } -void dmr_recorder::set_tdma_slot(int slot) { +void dmr_recorder_impl::set_tdma_slot(int slot) { tdma_slot = slot; //op25_frame_assembler->set_slotid(tdma_slot); } -bool dmr_recorder::start(Call *call) { +bool dmr_recorder_impl::start(Call *call) { if (state == INACTIVE) { System *system = call->get_system(); set_tdma_slot(0); diff --git a/trunk-recorder/recorders/dmr_recorder_impl.h b/trunk-recorder/recorders/dmr_recorder_impl.h new file mode 100644 index 000000000..6d3d6ee97 --- /dev/null +++ b/trunk-recorder/recorders/dmr_recorder_impl.h @@ -0,0 +1,215 @@ +#ifndef DMR_RECORDER_IMPL_H +#define DMR_RECORDER_IMPL_H + +#define _USE_MATH_DEFINES + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include + +//#include + +#if GNURADIO_VERSION < 0x030800 +#include +#include +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#endif + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + + +#if GNURADIO_VERSION < 0x030800 +#include +#include +#else +#include +#include +#endif + +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "recorder.h" +#include "../source.h" +#include "dmr_recorder.h" +#include "../gr_blocks/plugin_wrapper_impl.h" +#include "../gr_blocks/transmission_sink.h" +#include "../gr_blocks/selector.h" + + + +class dmr_recorder_impl : public dmr_recorder { + + +protected: + + + void initialize(Source *src); + +public: + dmr_recorder_impl(Source *src); + DecimSettings get_decim(long speed); + void initialize_prefilter(); + void tune_offset(double f); + void tune_freq(double f); + bool start(Call *call); + void stop(); + double get_freq(); + int get_num(); + void set_tdma(bool phase2); + void switch_tdma(bool phase2); + void set_tdma_slot(int slot); + void set_record_more_transmissions(bool more); + double since_last_write(); + void generate_arb_taps(); + double get_current_length(); + bool is_active(); + bool is_idle(); + bool is_squelched(); + std::vector get_transmission_list(); + State get_state(); + int lastupdate(); + long elapsed(); + Source *get_source(); + + void plugin_callback_handler(int16_t *samples, int sampleCount); + +protected: + State state; + time_t timestamp; + time_t starttime; + long talkgroup; + std::string short_name; + Call *call; + Config *config; + Source *source; + double chan_freq; + double center_freq; + bool qpsk_mod; + bool conventional; + double squelch_db; + gr::analog::pwr_squelch_cc::sptr squelch; + gr::blocks::selector::sptr modulation_selector; + gr::blocks::copy::sptr valve; + //gr::blocks::multiply_const_ss::sptr levels; + + +gr::op25_repeater::gardner_costas_cc::sptr costas_clock; +private: + double arb_rate; + long decim; + double resampled_rate; + + int silence_frames; + int tdma_slot; + bool d_phase2_tdma; + bool double_decim; + long if1; + long if2; + long input_rate; + const int phase1_samples_per_symbol = 5; + const double phase1_symbol_rate = 4800; + + std::vector arb_taps; + + + + std::vector bandpass_filter_coeffs; + std::vector lowpass_filter_coeffs; + std::vector cutoff_filter_coeffs; + + gr::analog::sig_source_c::sptr lo; + gr::analog::sig_source_c::sptr bfo; + gr::blocks::multiply_cc::sptr mixer; + + /* GR blocks */ + gr::filter::fft_filter_ccc::sptr bandpass_filter; + gr::filter::fft_filter_ccf::sptr lowpass_filter; + gr::filter::fft_filter_ccf::sptr cutoff_filter; + + gr::filter::pfb_arb_resampler_ccf::sptr arb_resampler; + + + gr::blocks::multiply_const_ff::sptr rescale; + + + /* FSK4 Stuff */ + + std::vector baseband_noise_filter_taps; + std::vector sym_taps; + gr::msg_queue::sptr tune_queue; + + gr::filter::fft_filter_fff::sptr noise_filter; + gr::filter::fir_filter_fff::sptr sym_filter; + + + gr::blocks::multiply_const_ff::sptr pll_amp; + gr::analog::pll_freqdet_cf::sptr pll_freq_lock; + gr::op25_repeater::fsk4_demod_ff::sptr fsk4_demod; + gr::op25_repeater::fsk4_slicer_fb::sptr slicer; + + + /* P25 Decoder */ + gr::op25_repeater::frame_assembler::sptr framer; + gr::op25_repeater::p25_frame_assembler::sptr op25_frame_assembler; + gr::msg_queue::sptr traffic_queue; + gr::msg_queue::sptr rx_queue; + + gr::blocks::short_to_float::sptr converter_slot0; + gr::blocks::short_to_float::sptr converter_slot1; + gr::blocks::multiply_const_ff::sptr levels; + gr::blocks::transmission_sink::sptr wav_sink_slot0; + gr::blocks::transmission_sink::sptr wav_sink_slot1; + gr::blocks::plugin_wrapper::sptr plugin_sink; + +}; + +#endif // ifndef dmr_recorder_H diff --git a/trunk-recorder/recorders/p25_recorder.h b/trunk-recorder/recorders/p25_recorder.h index 6f586d55d..7fec9ca95 100644 --- a/trunk-recorder/recorders/p25_recorder.h +++ b/trunk-recorder/recorders/p25_recorder.h @@ -14,48 +14,12 @@ #include #include -#include -#include -#include - -#include -#include -#include -#include - - -#include -#include - -//#include - -#if GNURADIO_VERSION < 0x030800 -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#endif - - -#include -#include -#include -#include + + + #include "recorder.h" -#include "p25_recorder_decode.h" -#include "p25_recorder_fsk4_demod.h" -#include "p25_recorder_qpsk_demod.h" -#include "../gr_blocks/transmission_sink.h" -#include "../gr_blocks/selector.h" + class Source; class p25_recorder; @@ -70,117 +34,36 @@ class p25_recorder; p25_recorder_sptr make_p25_recorder(Source *src); #include "../source.h" -class p25_recorder : public gr::hier_block2, public Recorder { - friend p25_recorder_sptr make_p25_recorder(Source *src); - -protected: - p25_recorder(); - p25_recorder(std::string type); - virtual void initialize(Source *src); - -public: - virtual ~p25_recorder(); - DecimSettings get_decim(long speed); - void initialize_prefilter(); - void initialize_qpsk(); - void initialize_fsk4(); - void initialize_p25(); - void tune_offset(double f); - void tune_freq(double f); - bool start(Call *call); - void stop(); - void clear(); - double get_freq(); - int get_num(); - void set_tdma(bool phase2); - void switch_tdma(bool phase2); - void set_tdma_slot(int slot); - void set_record_more_transmissions(bool more); - double since_last_write(); - void generate_arb_taps(); - double get_current_length(); - bool is_active(); - bool is_idle(); - bool is_squelched(); - std::vector get_transmission_list(); - State get_state(); - int lastupdate(); - long elapsed(); - Source *get_source(); - void autotune(); - void reset(); - -protected: - State state; - time_t timestamp; - time_t starttime; - long talkgroup; - std::string short_name; - Call *call; - Config *config; - Source *source; - double chan_freq; - double center_freq; - bool qpsk_mod; - bool conventional; - double squelch_db; - gr::analog::pwr_squelch_cc::sptr squelch; - gr::blocks::selector::sptr modulation_selector; - gr::blocks::copy::sptr valve; - //gr::blocks::multiply_const_ss::sptr levels; - - - p25_recorder_fsk4_demod_sptr fsk4_demod; - p25_recorder_decode_sptr fsk4_p25_decode; - p25_recorder_qpsk_demod_sptr qpsk_demod; - p25_recorder_decode_sptr qpsk_p25_decode; - -gr::op25_repeater::gardner_costas_cc::sptr costas_clock; -private: - double system_channel_rate; - double arb_rate; - double samples_per_symbol; - double symbol_rate; - double initial_rate; - long decim; - double resampled_rate; - - int silence_frames; - int tdma_slot; - bool d_phase2_tdma; - bool double_decim; - long if1; - long if2; - long input_rate; - const int phase1_samples_per_symbol = 5; - const int phase2_samples_per_symbol = 4; - const double phase1_symbol_rate = 4800; - const double phase2_symbol_rate = 6000; - - std::vector arb_taps; - - - - std::vector bandpass_filter_coeffs; - std::vector lowpass_filter_coeffs; - std::vector cutoff_filter_coeffs; - - gr::analog::sig_source_c::sptr lo; - gr::analog::sig_source_c::sptr bfo; - gr::blocks::multiply_cc::sptr mixer; - - /* GR blocks */ - gr::filter::fft_filter_ccc::sptr bandpass_filter; - gr::filter::fft_filter_ccf::sptr lowpass_filter; - gr::filter::fft_filter_ccf::sptr cutoff_filter; - - gr::filter::pfb_arb_resampler_ccf::sptr arb_resampler; - - - gr::blocks::multiply_const_ff::sptr rescale; +class p25_recorder : virtual public gr::hier_block2, virtual public Recorder { + static p25_recorder_sptr make_p25_recorder(Source *src); +public: + virtual ~p25_recorder() {}; + virtual DecimSettings get_decim(long speed) = 0; + virtual void tune_offset(double f) = 0; + virtual void tune_freq(double f) = 0; + virtual bool start(Call *call) = 0; + virtual void stop() = 0; + virtual void clear() = 0; + virtual double get_freq() = 0; + virtual int get_num() = 0; + virtual void set_tdma(bool phase2) = 0; + virtual void switch_tdma(bool phase2) = 0; + virtual void set_tdma_slot(int slot) = 0; + virtual void set_record_more_transmissions(bool more) = 0; + virtual double since_last_write() = 0; + virtual double get_current_length() = 0; + virtual bool is_active() = 0; + virtual bool is_idle() = 0; + virtual bool is_squelched() = 0; + virtual std::vector get_transmission_list() = 0; + virtual State get_state() = 0; + virtual int lastupdate() = 0; + virtual long elapsed() = 0; + virtual Source *get_source() = 0; + virtual void autotune() = 0; }; #endif // ifndef P25_RECORDER_H diff --git a/trunk-recorder/recorders/p25_recorder.cc b/trunk-recorder/recorders/p25_recorder_impl.cc similarity index 89% rename from trunk-recorder/recorders/p25_recorder.cc rename to trunk-recorder/recorders/p25_recorder_impl.cc index c91ec6c9f..e604812ef 100644 --- a/trunk-recorder/recorders/p25_recorder.cc +++ b/trunk-recorder/recorders/p25_recorder_impl.cc @@ -1,15 +1,16 @@ #include "p25_recorder.h" +#include "p25_recorder_impl.h" #include "../formatter.h" #include p25_recorder_sptr make_p25_recorder(Source *src) { - p25_recorder *recorder = new p25_recorder(); - recorder->initialize(src); - return gnuradio::get_initial_sptr(recorder); + p25_recorder *recorder = new p25_recorder_impl(src); + + return gnuradio::get_initial_sptr( recorder); } -void p25_recorder::generate_arb_taps() { +void p25_recorder_impl::generate_arb_taps() { double arb_size = 32; double arb_atten = 100; @@ -43,21 +44,18 @@ void p25_recorder::generate_arb_taps() { } } -p25_recorder::p25_recorder() + + +p25_recorder_impl::p25_recorder_impl(Source *src) : gr::hier_block2("p25_recorder", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(0, 0, sizeof(float))), Recorder("P25") { + initialize(src); } -p25_recorder::p25_recorder(std::string type) - : gr::hier_block2("p25_recorder", - gr::io_signature::make(1, 1, sizeof(gr_complex)), - gr::io_signature::make(0, 0, sizeof(float))), - Recorder(type) { -} -p25_recorder::DecimSettings p25_recorder::get_decim(long speed) { +p25_recorder_impl::DecimSettings p25_recorder_impl::get_decim(long speed) { long s = speed; long if_freqs[] = {24000, 25000, 32000}; DecimSettings decim_settings = {-1, -1}; @@ -84,7 +82,7 @@ p25_recorder::DecimSettings p25_recorder::get_decim(long speed) { BOOST_LOG_TRIVIAL(error) << "P25 recorder Decim: Nothing found"; return decim_settings; } -void p25_recorder::initialize_prefilter() { +void p25_recorder_impl::initialize_prefilter() { double phase1_channel_rate = phase1_symbol_rate * phase1_samples_per_symbol; long if_rate = phase1_channel_rate; long fa = 0; @@ -97,7 +95,7 @@ void p25_recorder::initialize_prefilter() { lo = gr::analog::sig_source_c::make(input_rate, gr::analog::GR_SIN_WAVE, 0, 1.0, 0.0); mixer = gr::blocks::multiply_cc::make(); - p25_recorder::DecimSettings decim_settings = get_decim(input_rate); + p25_recorder_impl::DecimSettings decim_settings = get_decim(input_rate); if (decim_settings.decim != -1) { double_decim = true; decim = decim_settings.decim; @@ -148,7 +146,7 @@ void p25_recorder::initialize_prefilter() { connect(arb_resampler, 0, cutoff_filter, 0); } -void p25_recorder::initialize(Source *src) { +void p25_recorder_impl::initialize(Source *src) { source = src; chan_freq = source->get_center(); center_freq = source->get_center(); @@ -201,7 +199,7 @@ void p25_recorder::initialize(Source *src) { connect(qpsk_demod, 0, qpsk_p25_decode, 0); } -void p25_recorder::switch_tdma(bool phase2) { +void p25_recorder_impl::switch_tdma(bool phase2) { double phase1_channel_rate = phase1_symbol_rate * phase1_samples_per_symbol; double phase2_channel_rate = phase2_symbol_rate * phase2_samples_per_symbol; long if_rate = phase1_channel_rate; @@ -226,17 +224,17 @@ void p25_recorder::switch_tdma(bool phase2) { } } -void p25_recorder::set_tdma(bool phase2) { +void p25_recorder_impl::set_tdma(bool phase2) { if (phase2 != d_phase2_tdma) { switch_tdma(phase2); } } -void p25_recorder::clear() { +void p25_recorder_impl::clear() { //op25_frame_assembler->clear(); } -void p25_recorder::autotune() { +void p25_recorder_impl::autotune() { /*if (!qpsk_mod) { gr::message::sptr msg; msg = tune_queue->delete_head_nowait(); @@ -250,17 +248,15 @@ void p25_recorder::autotune() { }*/ } -p25_recorder::~p25_recorder() {} - -Source *p25_recorder::get_source() { +Source *p25_recorder_impl::get_source() { return source; } -int p25_recorder::get_num() { +int p25_recorder_impl::get_num() { return rec_num; } -double p25_recorder::since_last_write() { +double p25_recorder_impl::since_last_write() { if (qpsk_mod) { return qpsk_p25_decode->since_last_write(); } else { @@ -268,7 +264,7 @@ double p25_recorder::since_last_write() { } } -State p25_recorder::get_state() { +State p25_recorder_impl::get_state() { if (qpsk_mod) { return qpsk_p25_decode->get_state(); } else { @@ -276,7 +272,7 @@ State p25_recorder::get_state() { } } -bool p25_recorder::is_active() { +bool p25_recorder_impl::is_active() { if (state == ACTIVE) { return true; } else { @@ -284,13 +280,13 @@ bool p25_recorder::is_active() { } } -bool p25_recorder::is_squelched() { +bool p25_recorder_impl::is_squelched() { if (state == ACTIVE) { return !squelch->unmuted(); } return true; } -bool p25_recorder::is_idle() { +bool p25_recorder_impl::is_idle() { if (qpsk_mod) { if ((qpsk_p25_decode->get_state() == IDLE) || (qpsk_p25_decode->get_state() == STOPPED)) { return true; @@ -303,11 +299,11 @@ bool p25_recorder::is_idle() { return false; } -double p25_recorder::get_freq() { +double p25_recorder_impl::get_freq() { return chan_freq; } -double p25_recorder::get_current_length() { +double p25_recorder_impl::get_current_length() { if (qpsk_mod) { return qpsk_p25_decode->get_current_length(); } else { @@ -315,20 +311,20 @@ double p25_recorder::get_current_length() { } } -int p25_recorder::lastupdate() { +int p25_recorder_impl::lastupdate() { return time(NULL) - timestamp; } -long p25_recorder::elapsed() { +long p25_recorder_impl::elapsed() { return time(NULL) - starttime; } -void p25_recorder::tune_freq(double f) { +void p25_recorder_impl::tune_freq(double f) { chan_freq = f; float freq = (center_freq - f); tune_offset(freq); } -void p25_recorder::tune_offset(double f) { +void p25_recorder_impl::tune_offset(double f) { float freq = static_cast(f); @@ -359,7 +355,7 @@ void p25_recorder::tune_offset(double f) { } } -void p25_recorder::set_record_more_transmissions(bool more) { +void p25_recorder_impl::set_record_more_transmissions(bool more) { if (qpsk_mod) { return qpsk_p25_decode->set_record_more_transmissions(more); } else { @@ -367,7 +363,7 @@ void p25_recorder::set_record_more_transmissions(bool more) { } } -std::vector p25_recorder::get_transmission_list() { +std::vector p25_recorder_impl::get_transmission_list() { if (qpsk_mod) { return qpsk_p25_decode->get_transmission_list(); } else { @@ -375,7 +371,7 @@ std::vector p25_recorder::get_transmission_list() { } } -void p25_recorder::stop() { +void p25_recorder_impl::stop() { if (state == ACTIVE) { if (qpsk_mod) { recording_duration += qpsk_p25_decode->get_current_length(); @@ -397,7 +393,7 @@ void p25_recorder::stop() { } } -void p25_recorder::set_tdma_slot(int slot) { +void p25_recorder_impl::set_tdma_slot(int slot) { if (qpsk_mod) { qpsk_p25_decode->set_tdma_slot(slot); } else { @@ -406,7 +402,7 @@ void p25_recorder::set_tdma_slot(int slot) { tdma_slot = slot; } -bool p25_recorder::start(Call *call) { +bool p25_recorder_impl::start(Call *call) { if (state == INACTIVE) { System *system = call->get_system(); qpsk_mod = system->get_qpsk_mod(); diff --git a/trunk-recorder/recorders/p25_recorder_impl.h b/trunk-recorder/recorders/p25_recorder_impl.h new file mode 100644 index 000000000..18c5ac7c7 --- /dev/null +++ b/trunk-recorder/recorders/p25_recorder_impl.h @@ -0,0 +1,179 @@ +#ifndef P25_RECORDER_IMPL_H +#define P25_RECORDER_IMPL_H + +#define _USE_MATH_DEFINES + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include +#include +#include +#include + + +#include +#include + +//#include + +#if GNURADIO_VERSION < 0x030800 +#include +#include +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#endif + + +#include +#include +#include +#include + +#include "recorder.h" +#include "p25_recorder.h" +#include "p25_recorder_decode.h" +#include "p25_recorder_fsk4_demod.h" +#include "p25_recorder_qpsk_demod.h" +#include "../gr_blocks/transmission_sink.h" +#include "../gr_blocks/selector.h" + +class Source; +class p25_recorder; + + +#include "../source.h" + +class p25_recorder_impl : public p25_recorder { + + +protected: + + void initialize(Source *src); + +public: + + p25_recorder_impl(Source *src); + DecimSettings get_decim(long speed); + void initialize_prefilter(); + void initialize_qpsk(); + void initialize_fsk4(); + void initialize_p25(); + void tune_offset(double f); + void tune_freq(double f); + bool start(Call *call); + void stop(); + void clear(); + double get_freq(); + int get_num(); + void set_tdma(bool phase2); + void switch_tdma(bool phase2); + void set_tdma_slot(int slot); + void set_record_more_transmissions(bool more); + double since_last_write(); + void generate_arb_taps(); + double get_current_length(); + bool is_active(); + bool is_idle(); + bool is_squelched(); + std::vector get_transmission_list(); + State get_state(); + int lastupdate(); + long elapsed(); + Source *get_source(); + void autotune(); + +protected: + State state; + time_t timestamp; + time_t starttime; + long talkgroup; + std::string short_name; + Call *call; + Config *config; + Source *source; + double chan_freq; + double center_freq; + bool qpsk_mod; + bool conventional; + double squelch_db; + gr::analog::pwr_squelch_cc::sptr squelch; + gr::blocks::selector::sptr modulation_selector; + gr::blocks::copy::sptr valve; + //gr::blocks::multiply_const_ss::sptr levels; + + + p25_recorder_fsk4_demod_sptr fsk4_demod; + p25_recorder_decode_sptr fsk4_p25_decode; + p25_recorder_qpsk_demod_sptr qpsk_demod; + p25_recorder_decode_sptr qpsk_p25_decode; + +gr::op25_repeater::gardner_costas_cc::sptr costas_clock; +private: + double system_channel_rate; + double arb_rate; + double samples_per_symbol; + double symbol_rate; + double initial_rate; + long decim; + double resampled_rate; + + int silence_frames; + int tdma_slot; + bool d_phase2_tdma; + bool double_decim; + long if1; + long if2; + long input_rate; + const int phase1_samples_per_symbol = 5; + const int phase2_samples_per_symbol = 4; + const double phase1_symbol_rate = 4800; + const double phase2_symbol_rate = 6000; + + std::vector arb_taps; + + + + std::vector bandpass_filter_coeffs; + std::vector lowpass_filter_coeffs; + std::vector cutoff_filter_coeffs; + + gr::analog::sig_source_c::sptr lo; + gr::analog::sig_source_c::sptr bfo; + gr::blocks::multiply_cc::sptr mixer; + + /* GR blocks */ + gr::filter::fft_filter_ccc::sptr bandpass_filter; + gr::filter::fft_filter_ccf::sptr lowpass_filter; + gr::filter::fft_filter_ccf::sptr cutoff_filter; + + gr::filter::pfb_arb_resampler_ccf::sptr arb_resampler; + + + gr::blocks::multiply_const_ff::sptr rescale; + + + +}; + +#endif // ifndef P25_RECORDER_H diff --git a/trunk-recorder/recorders/recorder.h b/trunk-recorder/recorders/recorder.h index 78a1027d1..aaeb0e01f 100644 --- a/trunk-recorder/recorders/recorder.h +++ b/trunk-recorder/recorders/recorder.h @@ -60,7 +60,7 @@ #include "../gr_blocks/transmission_sink.h" -#include +//#include diff --git a/trunk-recorder/recorders/sigmf_recorder.h b/trunk-recorder/recorders/sigmf_recorder.h index 514304ddf..e05c6e7e3 100644 --- a/trunk-recorder/recorders/sigmf_recorder.h +++ b/trunk-recorder/recorders/sigmf_recorder.h @@ -14,63 +14,6 @@ #include #include -#include -#include -#include - -#include - -#include -#include -#include -#include - -#include - -#if GNURADIO_VERSION < 0x030800 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#else -#include -#include -#include -#include -#include -#if GNURADIO_VERSION < 0x030900 -#include -#else -#include -#endif -#endif - -#include -#include - -#include -#include - -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include #include "recorder.h" #include "../gr_blocks/freq_xlating_fft_filter.h" @@ -88,90 +31,20 @@ class sigmf_recorder; sigmf_recorder_sptr make_sigmf_recorder(Source *src); #include "../source.h" -class sigmf_recorder : public gr::hier_block2, public Recorder { - friend sigmf_recorder_sptr make_sigmf_recorder(Source *src); - -protected: - sigmf_recorder(Source *src); +class sigmf_recorder : virtual public gr::hier_block2, virtual public Recorder { public: - ~sigmf_recorder(); - - void tune_offset(double f); - bool start(Call *call); - void stop(); - double get_freq(); - int get_num(); - double get_current_length(); - bool is_active(); - State get_state(); - int lastupdate(); - long elapsed(); - Source *get_source(); - long get_source_count(); - Call_Source *get_source_list(); - - gr::msg_queue::sptr tune_queue; - gr::msg_queue::sptr traffic_queue; - gr::msg_queue::sptr rx_queue; - //void forecast(int noutput_items, gr_vector_int &ninput_items_required); - -private: - double center, freq; - int silence_frames; - long talkgroup; - time_t timestamp; - time_t starttime; - - Config *config; - Source *source; - char filename[255]; - //int num; - State state; - - //std::vector lpf_coeffs; - std::vector lpf_coeffs; - std::vector arb_taps; - std::vector sym_taps; - - gr::filter::freq_xlating_fir_filter_ccf::sptr prefilter; - - /* GR blocks */ - gr::filter::fir_filter_ccf::sptr lpf; - gr::filter::fir_filter_fff::sptr sym_filter; - - gr::analog::sig_source_c::sptr lo; - - gr::digital::diff_phasor_cc::sptr diffdec; - - gr::blocks::multiply_cc::sptr mixer; - gr::blocks::file_sink::sptr fs; - - gr::filter::pfb_arb_resampler_ccf::sptr arb_resampler; - #if GNURADIO_VERSION < 0x030900 - gr::filter::rational_resampler_base_ccf::sptr downsample_sig; - gr::filter::rational_resampler_base_fff::sptr upsample_audio; - #else - gr::filter::rational_resampler_ccf::sptr downsample_sig; - gr::filter::rational_resampler_fff::sptr upsample_audio; - #endif - gr::analog::quadrature_demod_cf::sptr fm_demod; - gr::analog::feedforward_agc_cc::sptr agc; - gr::analog::agc2_ff::sptr demod_agc; - gr::analog::agc2_cc::sptr pre_demod_agc; - gr::blocks::file_sink::sptr raw_sink; - gr::blocks::short_to_float::sptr converter; - gr::blocks::copy::sptr valve; - - gr::blocks::multiply_const_ff::sptr multiplier; - gr::blocks::multiply_const_ff::sptr rescale; - gr::blocks::complex_to_arg::sptr to_float; - gr::op25_repeater::fsk4_demod_ff::sptr fsk4_demod; - gr::op25_repeater::p25_frame_assembler::sptr op25_frame_assembler; - - gr::op25_repeater::fsk4_slicer_fb::sptr slicer; - gr::op25_repeater::vocoder::sptr op25_vocoder; - gr::op25_repeater::gardner_costas_cc::sptr costas_clock; + virtual ~sigmf_recorder() {}; + virtual void tune_offset(double f) = 0; + virtual bool start(Call *call) = 0; + virtual void stop() = 0; + virtual double get_freq() = 0; + virtual int get_num() = 0; + virtual double get_current_length() = 0; + virtual bool is_active() = 0; + virtual State get_state() = 0; + virtual int lastupdate() = 0; + virtual long elapsed() = 0; }; #endif diff --git a/trunk-recorder/recorders/sigmf_recorder.cc b/trunk-recorder/recorders/sigmf_recorder_impl.cc similarity index 81% rename from trunk-recorder/recorders/sigmf_recorder.cc rename to trunk-recorder/recorders/sigmf_recorder_impl.cc index 7ebf5f69a..b770e81af 100644 --- a/trunk-recorder/recorders/sigmf_recorder.cc +++ b/trunk-recorder/recorders/sigmf_recorder_impl.cc @@ -1,14 +1,16 @@ -#include "sigmf_recorder.h" +#include "sigmf_recorder_impl.h" #include //static int rec_counter=0; sigmf_recorder_sptr make_sigmf_recorder(Source *src) { - return gnuradio::get_initial_sptr(new sigmf_recorder(src)); + sigmf_recorder *recorder = new sigmf_recorder_impl(src); + + return gnuradio::get_initial_sptr(recorder); } -sigmf_recorder::sigmf_recorder(Source *src) +sigmf_recorder_impl::sigmf_recorder_impl(Source *src) : gr::hier_block2("sigmf_recorder", gr::io_signature::make(1, 1, sizeof(gr_complex)), gr::io_signature::make(0, 0, sizeof(float))), @@ -47,25 +49,12 @@ sigmf_recorder::sigmf_recorder(Source *src) connect(valve, 0, raw_sink, 0); } -sigmf_recorder::~sigmf_recorder() {} - -long sigmf_recorder::get_source_count() { - return 0; -} - -Call_Source *sigmf_recorder::get_source_list() { - return NULL; -} - -Source *sigmf_recorder::get_source() { - return source; -} -int sigmf_recorder::get_num() { +int sigmf_recorder_impl::get_num() { return rec_num; } -bool sigmf_recorder::is_active() { +bool sigmf_recorder_impl::is_active() { if (state == ACTIVE) { return true; } else { @@ -73,33 +62,33 @@ bool sigmf_recorder::is_active() { } } -double sigmf_recorder::get_freq() { +double sigmf_recorder_impl::get_freq() { return freq; } -double sigmf_recorder::get_current_length() { +double sigmf_recorder_impl::get_current_length() { return 0; } -int sigmf_recorder::lastupdate() { +int sigmf_recorder_impl::lastupdate() { return time(NULL) - timestamp; } -long sigmf_recorder::elapsed() { +long sigmf_recorder_impl::elapsed() { return time(NULL) - starttime; } -void sigmf_recorder::tune_offset(double f) { +void sigmf_recorder_impl::tune_offset(double f) { // have to flip this for 3.7 // BOOST_LOG_TRIVIAL(info) << "Offset set to: " << offset_amount << " Freq: " // << freq; } -State sigmf_recorder::get_state() { +State sigmf_recorder_impl::get_state() { return state; } -void sigmf_recorder::stop() { +void sigmf_recorder_impl::stop() { if (state == ACTIVE) { BOOST_LOG_TRIVIAL(error) << "sigmf_recorder.cc: Stopping Logger \t[ " << rec_num << " ] - freq[ " << freq << "] \t talkgroup[ " << talkgroup << " ]"; state = INACTIVE; @@ -110,7 +99,7 @@ void sigmf_recorder::stop() { } } -bool sigmf_recorder::start(Call *call) { +bool sigmf_recorder_impl::start(Call *call) { if (state == INACTIVE) { timestamp = time(NULL); starttime = time(NULL); diff --git a/trunk-recorder/recorders/sigmf_recorder_impl.h b/trunk-recorder/recorders/sigmf_recorder_impl.h new file mode 100644 index 000000000..16d9b6abb --- /dev/null +++ b/trunk-recorder/recorders/sigmf_recorder_impl.h @@ -0,0 +1,130 @@ +#ifndef SIGMF_RECORDER_IMPL_H +#define SIGMF_RECORDER_IMPL_H + +#define _USE_MATH_DEFINES + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +#include + +#include +#include +#include +#include + +#include + +#if GNURADIO_VERSION < 0x030800 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#include +#if GNURADIO_VERSION < 0x030900 +#include +#else +#include +#endif +#endif + +#include +#include + +#include +#include + +#include + +#include +#include + +#include +#include +#include +#include + + +#include "recorder.h" +#include "../gr_blocks/freq_xlating_fft_filter.h" + +#include "../source.h" + +class sigmf_recorder_impl : public sigmf_recorder{ + +public: + sigmf_recorder_impl(Source *src); + + void tune_offset(double f); + bool start(Call *call); + void stop(); + double get_freq(); + int get_num(); + double get_current_length(); + bool is_active(); + State get_state(); + int lastupdate(); + long elapsed(); + + gr::msg_queue::sptr tune_queue; + gr::msg_queue::sptr traffic_queue; + gr::msg_queue::sptr rx_queue; + //void forecast(int noutput_items, gr_vector_int &ninput_items_required); + +private: + double center, freq; + int silence_frames; + long talkgroup; + time_t timestamp; + time_t starttime; + + Config *config; + Source *source; + char filename[255]; + //int num; + State state; + + //std::vector lpf_coeffs; + std::vector lpf_coeffs; + std::vector arb_taps; + std::vector sym_taps; + + gr::filter::freq_xlating_fir_filter_ccf::sptr prefilter; + + + + gr::analog::quadrature_demod_cf::sptr fm_demod; + gr::analog::feedforward_agc_cc::sptr agc; + gr::analog::agc2_ff::sptr demod_agc; + gr::analog::agc2_cc::sptr pre_demod_agc; + gr::blocks::file_sink::sptr raw_sink; + gr::blocks::short_to_float::sptr converter; + gr::blocks::copy::sptr valve; + + +}; + +#endif diff --git a/trunk-recorder/source.h b/trunk-recorder/source.h index 3ef05444f..471508770 100644 --- a/trunk-recorder/source.h +++ b/trunk-recorder/source.h @@ -109,18 +109,20 @@ class Source { int digital_recorder_count(); int analog_recorder_count(); Config *get_config(); - analog_recorder_sptr create_conventional_recorder(gr::top_block_sptr tb); + + void create_debug_recorder(gr::top_block_sptr tb, int source_num); + void create_sigmf_recorders(gr::top_block_sptr tb, int r); void create_analog_recorders(gr::top_block_sptr tb, int r); - Recorder *get_analog_recorder(); - Recorder *get_analog_recorder(Talkgroup *talkgroup); void create_digital_recorders(gr::top_block_sptr tb, int r); + analog_recorder_sptr create_conventional_recorder(gr::top_block_sptr tb); p25_recorder_sptr create_digital_conventional_recorder(gr::top_block_sptr tb); dmr_recorder_sptr create_dmr_conventional_recorder(gr::top_block_sptr tb); + Recorder *get_digital_recorder(); Recorder *get_digital_recorder(Talkgroup *talkgroup, int priority); - void create_debug_recorder(gr::top_block_sptr tb, int source_num); + Recorder *get_analog_recorder(); + Recorder *get_analog_recorder(Talkgroup *talkgroup); Recorder *get_debug_recorder(); - void create_sigmf_recorders(gr::top_block_sptr tb, int r); Recorder *get_sigmf_recorder(); #if GNURADIO_VERSION < 0x030900