diff options
Diffstat (limited to 'gr-trellis/lib/siso_combined_f_impl.cc')
-rw-r--r-- | gr-trellis/lib/siso_combined_f_impl.cc | 109 |
1 files changed, 90 insertions, 19 deletions
diff --git a/gr-trellis/lib/siso_combined_f_impl.cc b/gr-trellis/lib/siso_combined_f_impl.cc index d30f5cc4bb..3b89684bf0 100644 --- a/gr-trellis/lib/siso_combined_f_impl.cc +++ b/gr-trellis/lib/siso_combined_f_impl.cc @@ -48,23 +48,9 @@ namespace gr { SISO_TYPE, D, TABLE, TYPE)); } - siso_combined_f_impl::siso_combined_f_impl(const fsm &FSM, int K, - int S0, int SK, - bool POSTI, bool POSTO, - siso_type_t SISO_TYPE, - int D, const std::vector<float> &TABLE, - digital::trellis_metric_type_t TYPE) - : block("siso_combined_f", - io_signature::make(1, -1, sizeof(float)), - io_signature::make(1, -1, sizeof(float))), - d_FSM(FSM), d_K(K), d_S0(S0), d_SK(SK), - d_POSTI(POSTI), d_POSTO(POSTO), - d_SISO_TYPE(SISO_TYPE), - d_D(D), d_TABLE(TABLE), d_TYPE(TYPE)//, - //d_alpha(FSM.S()*(K+1)), - //d_beta(FSM.S()*(K+1)) + void siso_combined_f_impl::recalculate() { - int multiple; + int multiple; if(d_POSTI && d_POSTO) multiple = d_FSM.I()+d_FSM.O(); else if(d_POSTI) @@ -74,7 +60,6 @@ namespace gr { else throw std::runtime_error ("Not both POSTI and POSTO can be false."); - //printf("constructor: Multiple = %d\n",multiple); set_output_multiple(d_K*multiple); //what is the meaning of relative rate for a block with 2 inputs? @@ -84,9 +69,94 @@ namespace gr { //set_relative_rate ( multiple / ((double) d_FSM.O()) ); // I am tempted to automate like this if(d_FSM.I() <= d_D) - set_relative_rate(multiple / ((double)d_D)); + set_relative_rate(multiple / ((double)d_D)); else - set_relative_rate(multiple / ((double)d_FSM.I())); + set_relative_rate(multiple / ((double)d_FSM.I())); + } + + + siso_combined_f_impl::siso_combined_f_impl(const fsm &FSM, int K, + int S0, int SK, + bool POSTI, bool POSTO, + siso_type_t SISO_TYPE, + int D, const std::vector<float> &TABLE, + digital::trellis_metric_type_t TYPE) + : block("siso_combined_f", + io_signature::make(1, -1, sizeof(float)), + io_signature::make(1, -1, sizeof(float))), + d_FSM(FSM), d_K(K), d_S0(S0), d_SK(SK), + d_POSTI(POSTI), d_POSTO(POSTO), + d_SISO_TYPE(SISO_TYPE), + d_D(D), d_TABLE(TABLE), d_TYPE(TYPE)//, + //d_alpha(FSM.S()*(K+1)), + //d_beta(FSM.S()*(K+1)) + { + recalculate(); + } + + void siso_combined_f_impl::set_FSM(const fsm &FSM) + { + gr::thread::scoped_lock guard(d_setlock); + d_FSM=FSM; + recalculate(); + } + + void siso_combined_f_impl::set_K(int K) + { + gr::thread::scoped_lock guard(d_setlock); + d_K=K; + recalculate(); + } + + void siso_combined_f_impl::set_POSTI(bool POSTI) + { + gr::thread::scoped_lock guard(d_setlock); + d_POSTI = POSTI; + recalculate(); + } + + void siso_combined_f_impl::set_POSTO(bool POSTO) + { + gr::thread::scoped_lock guard(d_setlock); + d_POSTO = POSTO; + recalculate(); + } + + void siso_combined_f_impl::set_D(int D) + { + gr::thread::scoped_lock guard(d_setlock); + d_D=D; + recalculate(); + } + + void siso_combined_f_impl::set_S0(int S0) + { + gr::thread::scoped_lock guard(d_setlock); + d_S0 = S0; + } + + void siso_combined_f_impl::set_SK(int SK) + { + gr::thread::scoped_lock guard(d_setlock); + d_SK = SK; + } + + void siso_combined_f_impl::set_SISO_TYPE(trellis::siso_type_t type) + { + gr::thread::scoped_lock guard(d_setlock); + d_SISO_TYPE = type; + } + + void siso_combined_f_impl::set_TABLE(const std::vector<float> &table) + { + gr::thread::scoped_lock guard(d_setlock); + d_TABLE = table; + } + + void siso_combined_f_impl::set_TYPE(digital::trellis_metric_type_t type) + { + gr::thread::scoped_lock guard(d_setlock); + d_TYPE = type; } siso_combined_f_impl::~siso_combined_f_impl() @@ -126,6 +196,7 @@ namespace gr { gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { + gr::thread::scoped_lock guard(d_setlock); int nstreams = output_items.size(); //printf("general_work:Streams: %d\n",nstreams); |