summaryrefslogtreecommitdiff
path: root/gr-trellis/lib/siso_combined_f_impl.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-trellis/lib/siso_combined_f_impl.cc')
-rw-r--r--gr-trellis/lib/siso_combined_f_impl.cc109
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);