1 /* -*- c++ -*- */
2 /*
3  * Copyright 2015 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 #ifndef INCLUDED_TPC_ENCODER_H
24 #define INCLUDED_TPC_ENCODER_H
25 
26 #include <gnuradio/fec/encoder.h>
27 #include <gnuradio/fec/generic_encoder.h>
28 #include <map>
29 #include <string>
30 #include <vector>
31 
32 
33 namespace gr {
34 namespace fec {
35 
36 class FEC_API tpc_encoder : public generic_encoder
37 {
38 
39     // private constructor
40     tpc_encoder(std::vector<int> row_polys,
41                 std::vector<int> col_polys,
42                 int krow,
43                 int kcol,
44                 int bval,
45                 int qval);
46 
47     // plug into the generic fec api
48     void generic_work(void* inBuffer, void* outbuffer);
49     int get_output_size();
50     int get_input_size();
51 
52     std::vector<int> d_rowpolys;
53     std::vector<int> d_colpolys;
54 
55     unsigned int d_krow;
56     unsigned int d_kcol;
57 
58     unsigned int d_bval;
59     unsigned int d_qval;
60 
61     // store the state transitions & outputs
62     int rowNumStates;
63     std::vector<std::vector<int>> rowOutputs;
64     std::vector<std::vector<int>> rowNextStates;
65     int colNumStates;
66     std::vector<std::vector<int>> colOutputs;
67     std::vector<std::vector<int>> colNextStates;
68 
69     std::vector<int> rowTail;
70     std::vector<int> colTail;
71 
72     int rowEncoder_K;
73     size_t rowEncoder_n;
74     int rowEncoder_m;
75     int colEncoder_K;
76     size_t colEncoder_n;
77     int colEncoder_m;
78     int outputSize;
79     int inputSize;
80 
81     // memory allocated for processing
82     int inputSizeWithPad;
83     std::vector<unsigned char> inputWithPad;
84 
85     std::vector<std::vector<uint8_t>> rowEncodedBits;
86     std::vector<unsigned char> rowToEncode;
87     size_t numRowsToEncode;
88     std::vector<uint8_t> rowEncoded_block;
89 
90     std::vector<std::vector<uint8_t>> colEncodedBits;
91     std::vector<unsigned char> colToEncode;
92     int numColsToEncode;
93     std::vector<uint8_t> colEncoded_block;
94 
95     void block_conv_encode(std::vector<uint8_t>& output,
96                            std::vector<uint8_t> input,
97                            std::vector<std::vector<int>> transOutputVec,
98                            std::vector<std::vector<int>> transNextStateVec,
99                            std::vector<int> tail,
100                            size_t KK,
101                            size_t nn);
102 
103     FILE* fp;
104 
105 public:
106     ~tpc_encoder();
107     static generic_encoder::sptr make(std::vector<int> row_poly,
108                                       std::vector<int> col_poly,
109                                       int krow,
110                                       int kcol,
111                                       int bval,
112                                       int qval);
rate()113     double rate() { return (1.0 * get_input_size() / get_output_size()); }
set_frame_size(unsigned int)114     bool set_frame_size(unsigned int) { return false; }
115 };
116 
117 
118 } // namespace fec
119 } // namespace gr
120 
121 #endif /* INCLUDED_TPC_ENCODER_H */
122