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