diff --git a/gr-jay/lib/squelch_impl.cc b/gr-jay/lib/squelch_impl.cc new file mode 100644 index 0000000..c1a1b28 --- /dev/null +++ b/gr-jay/lib/squelch_impl.cc @@ -0,0 +1,131 @@ +/* -*- c++ -*- */ +/* + * Copyright 2019 Jay Arrowfield. + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "squelch_impl.h" + +namespace gr { + namespace jay { + + squelch::sptr + squelch::make() + { + return gnuradio::get_initial_sptr + (new squelch_impl()); + } + + /* + * The private constructor + */ + + squelch_impl::squelch_impl() + : gr::sync_block("squelch", + gr::io_signature::make(1, 1, sizeof(float)), + gr::io_signature::make(1, 1, sizeof(float))) + , m_gain_target(1.0f) + , m_gain(0.0f) + { + m_msg_port_in = pmt::mp("control"); + message_port_register_in(m_msg_port_in); + set_msg_handler(m_msg_port_in, boost::bind(&squelch_impl::on_message, this, _1)); + } + + /* + * Our virtual destructor. + */ + squelch_impl::~squelch_impl() + { + } + + void squelch_impl::print_pair(pmt::pmt_t pair) + { + pmt::pmt_t key = pmt::car(pair); + pmt::pmt_t val = pmt::cdr(pair); + + if (pmt::symbol_to_string(key) == std::string("gain")) + { + float gain_dB = pmt::to_float(val) - 50.f; + m_gain_target = std::pow(10.f, gain_dB/10); + fprintf(stderr, "Set gain to %0.2f\n", m_gain_target); + } + if (pmt::is_integer(val)) + { + fprintf(stderr, "[%s=%d]", pmt::symbol_to_string(key).c_str(), (int)pmt::to_long(val)); + } + else if (pmt::is_real(val)) + { + fprintf(stderr, "[%s=%f]", pmt::symbol_to_string(key).c_str(), pmt::to_float(val)); + } + else if (pmt::is_bool(val)) + { + fprintf(stderr, "[%s=%d]", pmt::symbol_to_string(key).c_str(), pmt::to_bool(val)); + } + fprintf(stderr, "\n"); + } + + void squelch_impl::on_message(pmt::pmt_t msg) + { + if (pmt::is_pair(msg)) + { + print_pair(msg); + } + else if (pmt::is_dict(msg)) + { + pmt::pmt_t items = pmt::dict_items(msg); + for (int i=0; i < pmt::length(items); i++) + { + pmt::pmt_t pair = pmt::nth(i, items); + print_pair(pair); + } + } + else + { + fprintf(stderr, "%s\n", pmt::symbol_to_string(msg).c_str()); + } + } + + int + squelch_impl::work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items) + { + const float *in = (const float *) input_items[0]; + float *out = (float *) output_items[0]; + + m_gain = 0.99f*m_gain + 0.01f*m_gain_target; + + // Do <+signal processing+> + for (int i=0; i < noutput_items; i++) + { + *(out++) = *(in++) * m_gain; + } + + // Tell runtime system how many output items we produced. + return noutput_items; + } + + } /* namespace jay */ +} /* namespace gr */ + diff --git a/gr-jay/lib/squelch_impl.h b/gr-jay/lib/squelch_impl.h new file mode 100644 index 0000000..a1cb5ef --- /dev/null +++ b/gr-jay/lib/squelch_impl.h @@ -0,0 +1,53 @@ +/* -*- c++ -*- */ +/* + * Copyright 2019 Jay Arrowfield. + * + * This is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3, or (at your option) + * any later version. + * + * This software is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this software; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, + * Boston, MA 02110-1301, USA. + */ + +#ifndef INCLUDED_JAY_SQUELCH_IMPL_H +#define INCLUDED_JAY_SQUELCH_IMPL_H + +#include + +namespace gr { + namespace jay { + + class squelch_impl : public squelch + { + private: + // Nothing to declare in this block. + pmt::pmt_t m_msg_port_in; + float m_gain_target; + float m_gain; + + public: + squelch_impl(); + ~squelch_impl(); + void print_pair(pmt::pmt_t pair); + void on_message(pmt::pmt_t msg); + + // Where all the action really happens + int work(int noutput_items, + gr_vector_const_void_star &input_items, + gr_vector_void_star &output_items); + }; + + } // namespace jay +} // namespace gr + +#endif /* INCLUDED_JAY_SQUELCH_IMPL_H */ +