1 /* -*- c++ -*- */
2 /*
3  * Copyright 2007,2010,2013 Free Software Foundation, Inc.
4  *
5  * This file is part of GNU Radio
6  *
7  * GNU Radio is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3, or (at your option)
10  * any later version.
11  *
12  * GNU Radio is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with GNU Radio; see the file COPYING.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street,
20  * Boston, MA 02110-1301, USA.
21  */
22 
23 #ifdef HAVE_CONFIG_H
24 #include "config.h"
25 #endif
26 
27 #include "regenerate_bb_impl.h"
28 #include <gnuradio/io_signature.h>
29 
30 namespace gr {
31 namespace blocks {
32 
make(int period,unsigned int max_regen)33 regenerate_bb::sptr regenerate_bb::make(int period, unsigned int max_regen)
34 {
35     return gnuradio::get_initial_sptr(new regenerate_bb_impl(period, max_regen));
36 }
37 
regenerate_bb_impl(int period,unsigned int max_regen)38 regenerate_bb_impl::regenerate_bb_impl(int period, unsigned int max_regen)
39     : sync_block("regenerate_bb",
40                  io_signature::make(1, 1, sizeof(char)),
41                  io_signature::make(1, 1, sizeof(char))),
42       d_period(period),
43       d_countdown(0),
44       d_max_regen(max_regen),
45       d_regen_count(max_regen)
46 {
47 }
48 
~regenerate_bb_impl()49 regenerate_bb_impl::~regenerate_bb_impl() {}
50 
set_max_regen(unsigned int regen)51 void regenerate_bb_impl::set_max_regen(unsigned int regen)
52 {
53     d_max_regen = regen;
54     d_countdown = 0;
55     d_regen_count = d_max_regen;
56 }
57 
set_period(int period)58 void regenerate_bb_impl::set_period(int period)
59 {
60     d_period = period;
61     d_countdown = 0;
62     d_regen_count = d_max_regen;
63 }
64 
work(int noutput_items,gr_vector_const_void_star & input_items,gr_vector_void_star & output_items)65 int regenerate_bb_impl::work(int noutput_items,
66                              gr_vector_const_void_star& input_items,
67                              gr_vector_void_star& output_items)
68 {
69     const char* iptr = (const char*)input_items[0];
70     char* optr = (char*)output_items[0];
71 
72     for (int i = 0; i < noutput_items; i++) {
73         optr[i] = 0;
74 
75         if (d_regen_count < d_max_regen) {
76             d_countdown--;
77 
78             if (d_countdown == 0) {
79                 optr[i] = 1;
80                 d_countdown = d_period;
81                 d_regen_count++;
82             }
83         }
84 
85         if (iptr[i] == 1) {
86             d_countdown = d_period;
87             optr[i] = 1;
88             d_regen_count = 0;
89         }
90     }
91     return noutput_items;
92 }
93 
94 } /* namespace blocks */
95 } /* namespace gr */
96