596 lines
17 KiB
C++
596 lines
17 KiB
C++
/* -*- c++ -*- */
|
|
/*
|
|
* gr-satnogs: SatNOGS GNU Radio Out-Of-Tree Module
|
|
*
|
|
* Copyright (C) 2018, Libre Space Foundation <http://librespacefoundation.org/>
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef INCLUDED_SATNOGS_DECODER_8B10B_IMPL_H
|
|
#define INCLUDED_SATNOGS_DECODER_8B10B_IMPL_H
|
|
|
|
#include <satnogs/decoder_8b10b.h>
|
|
|
|
namespace gr
|
|
{
|
|
namespace satnogs
|
|
{
|
|
|
|
class decoder_8b10b_impl : public decoder_8b10b
|
|
{
|
|
private:
|
|
const size_t d_max_frame_len;
|
|
size_t d_erasure_cnt;
|
|
uint16_t d_control_symbol_pos;
|
|
uint16_t d_control_symbol_neg;
|
|
uint16_t d_data_reg;
|
|
uint16_t d_wrong_bits;
|
|
uint16_t d_wrong_bits_neg;
|
|
uint8_t d_nwrong;
|
|
uint8_t d_nwrong_neg;
|
|
size_t d_word_cnt;
|
|
|
|
uint8_t *d_8b_words;
|
|
int *d_erasures_indexes;
|
|
|
|
int d_lookup_8b10b[2][256] =
|
|
{
|
|
// RD = -1 cases
|
|
{
|
|
/* 00 */0x274,
|
|
/* 01 */0x1d4,
|
|
/* 02 */0x2d4,
|
|
/* 03 */0x71b,
|
|
/* 04 */0x354,
|
|
/* 05 */0x69b,
|
|
/* 06 */0x59b,
|
|
/* 07 */0x78b,
|
|
/* 08 */0x394,
|
|
/* 09 */0x65b,
|
|
/* 0a */0x55b,
|
|
/* 0b */0x74b,
|
|
/* 0c */0x4db,
|
|
/* 0d */0x6cb,
|
|
/* 0e */0x5cb,
|
|
/* 0f */0x174,
|
|
/* 10 */0x1b4,
|
|
/* 11 */0x63b,
|
|
/* 12 */0x53b,
|
|
/* 13 */0x72b,
|
|
/* 14 */0x4bb,
|
|
/* 15 */0x6ab,
|
|
/* 16 */0x5ab,
|
|
/* 17 */0x3a4,
|
|
/* 18 */0x334,
|
|
/* 19 */0x66b,
|
|
/* 1a */0x56b,
|
|
/* 1b */0x364,
|
|
/* 1c */0x4eb,
|
|
/* 1d */0x2e4,
|
|
/* 1e */0x1e4,
|
|
/* 1f */0x2b4,
|
|
/* 20 */0x679,
|
|
/* 21 */0x5d9,
|
|
/* 22 */0x6d9,
|
|
/* 23 */0x319,
|
|
/* 24 */0x759,
|
|
/* 25 */0x299,
|
|
/* 26 */0x199,
|
|
/* 27 */0x389,
|
|
/* 28 */0x799,
|
|
/* 29 */0x259,
|
|
/* 2a */0x159,
|
|
/* 2b */0x349,
|
|
/* 2c */0x0d9,
|
|
/* 2d */0x2c9,
|
|
/* 2e */0x1c9,
|
|
/* 2f */0x579,
|
|
/* 30 */0x5b9,
|
|
/* 31 */0x239,
|
|
/* 32 */0x139,
|
|
/* 33 */0x329,
|
|
/* 34 */0x0b9,
|
|
/* 35 */0x2a9,
|
|
/* 36 */0x1a9,
|
|
/* 37 */0x7a9,
|
|
/* 38 */0x739,
|
|
/* 39 */0x269,
|
|
/* 3a */0x169,
|
|
/* 3b */0x769,
|
|
/* 3c */0x0e9,
|
|
/* 3d */0x6e9,
|
|
/* 3e */0x5e9,
|
|
/* 3f */0x6b9,
|
|
/* 40 */0x675,
|
|
/* 41 */0x5d5,
|
|
/* 42 */0x6d5,
|
|
/* 43 */0x315,
|
|
/* 44 */0x755,
|
|
/* 45 */0x295,
|
|
/* 46 */0x195,
|
|
/* 47 */0x385,
|
|
/* 48 */0x795,
|
|
/* 49 */0x255,
|
|
/* 4a */0x155,
|
|
/* 4b */0x345,
|
|
/* 4c */0x0d5,
|
|
/* 4d */0x2c5,
|
|
/* 4e */0x1c5,
|
|
/* 4f */0x575,
|
|
/* 50 */0x5b5,
|
|
/* 51 */0x235,
|
|
/* 52 */0x135,
|
|
/* 53 */0x325,
|
|
/* 54 */0x0b5,
|
|
/* 55 */0x2a5,
|
|
/* 56 */0x1a5,
|
|
/* 57 */0x7a5,
|
|
/* 58 */0x735,
|
|
/* 59 */0x265,
|
|
/* 5a */0x165,
|
|
/* 5b */0x765,
|
|
/* 5c */0x0e5,
|
|
/* 5d */0x6e5,
|
|
/* 5e */0x5e5,
|
|
/* 5f */0x6b5,
|
|
/* 60 */0x673,
|
|
/* 61 */0x5d3,
|
|
/* 62 */0x6d3,
|
|
/* 63 */0x31c,
|
|
/* 64 */0x753,
|
|
/* 65 */0x29c,
|
|
/* 66 */0x19c,
|
|
/* 67 */0x38c,
|
|
/* 68 */0x793,
|
|
/* 69 */0x25c,
|
|
/* 6a */0x15c,
|
|
/* 6b */0x34c,
|
|
/* 6c */0x0dc,
|
|
/* 6d */0x2cc,
|
|
/* 6e */0x1cc,
|
|
/* 6f */0x573,
|
|
/* 70 */0x5b3,
|
|
/* 71 */0x23c,
|
|
/* 72 */0x13c,
|
|
/* 73 */0x32c,
|
|
/* 74 */0x0bc,
|
|
/* 75 */0x2ac,
|
|
/* 76 */0x1ac,
|
|
/* 77 */0x7a3,
|
|
/* 78 */0x733,
|
|
/* 79 */0x26c,
|
|
/* 7a */0x16c,
|
|
/* 7b */0x763,
|
|
/* 7c */0x0ec,
|
|
/* 7d */0x6e3,
|
|
/* 7e */0x5e3,
|
|
/* 7f */0x6b3,
|
|
/* 80 */0x272,
|
|
/* 81 */0x1d2,
|
|
/* 82 */0x2d2,
|
|
/* 83 */0x71d,
|
|
/* 84 */0x352,
|
|
/* 85 */0x69d,
|
|
/* 86 */0x59d,
|
|
/* 87 */0x78d,
|
|
/* 88 */0x392,
|
|
/* 89 */0x65d,
|
|
/* 8a */0x55d,
|
|
/* 8b */0x74d,
|
|
/* 8c */0x4dd,
|
|
/* 8d */0x6cd,
|
|
/* 8e */0x5cd,
|
|
/* 8f */0x172,
|
|
/* 90 */0x1b2,
|
|
/* 91 */0x63d,
|
|
/* 92 */0x53d,
|
|
/* 93 */0x72d,
|
|
/* 94 */0x4bd,
|
|
/* 95 */0x6ad,
|
|
/* 96 */0x5ad,
|
|
/* 97 */0x3a2,
|
|
/* 98 */0x332,
|
|
/* 99 */0x66d,
|
|
/* 9a */0x56d,
|
|
/* 9b */0x362,
|
|
/* 9c */0x4ed,
|
|
/* 9d */0x2e2,
|
|
/* 9e */0x1e2,
|
|
/* 9f */0x2b2,
|
|
/* a0 */0x67a,
|
|
/* a1 */0x5da,
|
|
/* a2 */0x6da,
|
|
/* a3 */0x31a,
|
|
/* a4 */0x75a,
|
|
/* a5 */0x29a,
|
|
/* a6 */0x19a,
|
|
/* a7 */0x38a,
|
|
/* a8 */0x79a,
|
|
/* a9 */0x25a,
|
|
/* aa */0x15a,
|
|
/* ab */0x34a,
|
|
/* ac */0x0da,
|
|
/* ad */0x2ca,
|
|
/* ae */0x1ca,
|
|
/* af */0x57a,
|
|
/* b0 */0x5ba,
|
|
/* b1 */0x23a,
|
|
/* b2 */0x13a,
|
|
/* b3 */0x32a,
|
|
/* b4 */0x0ba,
|
|
/* b5 */0x2aa,
|
|
/* b6 */0x1aa,
|
|
/* b7 */0x7aa,
|
|
/* b8 */0x73a,
|
|
/* b9 */0x26a,
|
|
/* ba */0x16a,
|
|
/* bb */0x76a,
|
|
/* bc */0x0ea,
|
|
/* bd */0x6ea,
|
|
/* be */0x5ea,
|
|
/* bf */0x6ba,
|
|
/* c0 */0x676,
|
|
/* c1 */0x5d6,
|
|
/* c2 */0x6d6,
|
|
/* c3 */0x316,
|
|
/* c4 */0x756,
|
|
/* c5 */0x296,
|
|
/* c6 */0x196,
|
|
/* c7 */0x386,
|
|
/* c8 */0x796,
|
|
/* c9 */0x256,
|
|
/* ca */0x156,
|
|
/* cb */0x346,
|
|
/* cc */0x0d6,
|
|
/* cd */0x2c6,
|
|
/* ce */0x1c6,
|
|
/* cf */0x576,
|
|
/* d0 */0x5b6,
|
|
/* d1 */0x236,
|
|
/* d2 */0x136,
|
|
/* d3 */0x326,
|
|
/* d4 */0x0b6,
|
|
/* d5 */0x2a6,
|
|
/* d6 */0x1a6,
|
|
/* d7 */0x7a6,
|
|
/* d8 */0x736,
|
|
/* d9 */0x266,
|
|
/* da */0x166,
|
|
/* db */0x766,
|
|
/* dc */0x0e6,
|
|
/* dd */0x6e6,
|
|
/* de */0x5e6,
|
|
/* df */0x6b6,
|
|
/* e0 */0x271,
|
|
/* e1 */0x1d1,
|
|
/* e2 */0x2d1,
|
|
/* e3 */0x71e,
|
|
/* e4 */0x351,
|
|
/* e5 */0x69e,
|
|
/* e6 */0x59e,
|
|
/* e7 */0x78e,
|
|
/* e8 */0x391,
|
|
/* e9 */0x65e,
|
|
/* ea */0x55e,
|
|
/* eb */0x74e,
|
|
/* ec */0x4de,
|
|
/* ed */0x6ce,
|
|
/* ee */0x5ce,
|
|
/* ef */0x171,
|
|
/* f0 */0x1b1,
|
|
/* f1 */0x637,
|
|
/* f2 */0x537,
|
|
/* f3 */0x72e,
|
|
/* f4 */0x4b7,
|
|
/* f5 */0x6ae,
|
|
/* f6 */0x5ae,
|
|
/* f7 */0x3a1,
|
|
/* f8 */0x331,
|
|
/* f9 */0x66e,
|
|
/* fa */0x56e,
|
|
/* fb */0x361,
|
|
/* fc */0x4ee,
|
|
/* fd */0x2e1,
|
|
/* fe */0x1e1,
|
|
/* ff */0x2b1, }, // RD = +1 cases
|
|
{
|
|
/* 00 */0x58b,
|
|
/* 01 */0x62b,
|
|
/* 02 */0x52b,
|
|
/* 03 */0x314,
|
|
/* 04 */0x4ab,
|
|
/* 05 */0x294,
|
|
/* 06 */0x194,
|
|
/* 07 */0x074,
|
|
/* 08 */0x46b,
|
|
/* 09 */0x254,
|
|
/* 0a */0x154,
|
|
/* 0b */0x344,
|
|
/* 0c */0x0d4,
|
|
/* 0d */0x2c4,
|
|
/* 0e */0x1c4,
|
|
/* 0f */0x68b,
|
|
/* 10 */0x64b,
|
|
/* 11 */0x234,
|
|
/* 12 */0x134,
|
|
/* 13 */0x324,
|
|
/* 14 */0x0b4,
|
|
/* 15 */0x2a4,
|
|
/* 16 */0x1a4,
|
|
/* 17 */0x45b,
|
|
/* 18 */0x4cb,
|
|
/* 19 */0x264,
|
|
/* 1a */0x164,
|
|
/* 1b */0x49b,
|
|
/* 1c */0x0e4,
|
|
/* 1d */0x51b,
|
|
/* 1e */0x61b,
|
|
/* 1f */0x54b,
|
|
/* 20 */0x189,
|
|
/* 21 */0x229,
|
|
/* 22 */0x129,
|
|
/* 23 */0x719,
|
|
/* 24 */0x0a9,
|
|
/* 25 */0x699,
|
|
/* 26 */0x599,
|
|
/* 27 */0x479,
|
|
/* 28 */0x069,
|
|
/* 29 */0x659,
|
|
/* 2a */0x559,
|
|
/* 2b */0x749,
|
|
/* 2c */0x4d9,
|
|
/* 2d */0x6c9,
|
|
/* 2e */0x5c9,
|
|
/* 2f */0x289,
|
|
/* 30 */0x249,
|
|
/* 31 */0x639,
|
|
/* 32 */0x539,
|
|
/* 33 */0x729,
|
|
/* 34 */0x4b9,
|
|
/* 35 */0x6a9,
|
|
/* 36 */0x5a9,
|
|
/* 37 */0x059,
|
|
/* 38 */0x0c9,
|
|
/* 39 */0x669,
|
|
/* 3a */0x569,
|
|
/* 3b */0x099,
|
|
/* 3c */0x4e9,
|
|
/* 3d */0x119,
|
|
/* 3e */0x219,
|
|
/* 3f */0x149,
|
|
/* 40 */0x185,
|
|
/* 41 */0x225,
|
|
/* 42 */0x125,
|
|
/* 43 */0x715,
|
|
/* 44 */0x0a5,
|
|
/* 45 */0x695,
|
|
/* 46 */0x595,
|
|
/* 47 */0x475,
|
|
/* 48 */0x065,
|
|
/* 49 */0x655,
|
|
/* 4a */0x555,
|
|
/* 4b */0x745,
|
|
/* 4c */0x4d5,
|
|
/* 4d */0x6c5,
|
|
/* 4e */0x5c5,
|
|
/* 4f */0x285,
|
|
/* 50 */0x245,
|
|
/* 51 */0x635,
|
|
/* 52 */0x535,
|
|
/* 53 */0x725,
|
|
/* 54 */0x4b5,
|
|
/* 55 */0x6a5,
|
|
/* 56 */0x5a5,
|
|
/* 57 */0x055,
|
|
/* 58 */0x0c5,
|
|
/* 59 */0x665,
|
|
/* 5a */0x565,
|
|
/* 5b */0x095,
|
|
/* 5c */0x4e5,
|
|
/* 5d */0x115,
|
|
/* 5e */0x215,
|
|
/* 5f */0x145,
|
|
/* 60 */0x18c,
|
|
/* 61 */0x22c,
|
|
/* 62 */0x12c,
|
|
/* 63 */0x713,
|
|
/* 64 */0x0ac,
|
|
/* 65 */0x693,
|
|
/* 66 */0x593,
|
|
/* 67 */0x473,
|
|
/* 68 */0x06c,
|
|
/* 69 */0x653,
|
|
/* 6a */0x553,
|
|
/* 6b */0x743,
|
|
/* 6c */0x4d3,
|
|
/* 6d */0x6c3,
|
|
/* 6e */0x5c3,
|
|
/* 6f */0x28c,
|
|
/* 70 */0x24c,
|
|
/* 71 */0x633,
|
|
/* 72 */0x533,
|
|
/* 73 */0x723,
|
|
/* 74 */0x4b3,
|
|
/* 75 */0x6a3,
|
|
/* 76 */0x5a3,
|
|
/* 77 */0x05c,
|
|
/* 78 */0x0cc,
|
|
/* 79 */0x663,
|
|
/* 7a */0x563,
|
|
/* 7b */0x09c,
|
|
/* 7c */0x4e3,
|
|
/* 7d */0x11c,
|
|
/* 7e */0x21c,
|
|
/* 7f */0x14c,
|
|
/* 80 */0x58d,
|
|
/* 81 */0x62d,
|
|
/* 82 */0x52d,
|
|
/* 83 */0x312,
|
|
/* 84 */0x4ad,
|
|
/* 85 */0x292,
|
|
/* 86 */0x192,
|
|
/* 87 */0x072,
|
|
/* 88 */0x46d,
|
|
/* 89 */0x252,
|
|
/* 8a */0x152,
|
|
/* 8b */0x342,
|
|
/* 8c */0x0d2,
|
|
/* 8d */0x2c2,
|
|
/* 8e */0x1c2,
|
|
/* 8f */0x68d,
|
|
/* 90 */0x64d,
|
|
/* 91 */0x232,
|
|
/* 92 */0x132,
|
|
/* 93 */0x322,
|
|
/* 94 */0x0b2,
|
|
/* 95 */0x2a2,
|
|
/* 96 */0x1a2,
|
|
/* 97 */0x45d,
|
|
/* 98 */0x4cd,
|
|
/* 99 */0x262,
|
|
/* 9a */0x162,
|
|
/* 9b */0x49d,
|
|
/* 9c */0x0e2,
|
|
/* 9d */0x51d,
|
|
/* 9e */0x61d,
|
|
/* 9f */0x54d,
|
|
/* a0 */0x18a,
|
|
/* a1 */0x22a,
|
|
/* a2 */0x12a,
|
|
/* a3 */0x71a,
|
|
/* a4 */0x0aa,
|
|
/* a5 */0x69a,
|
|
/* a6 */0x59a,
|
|
/* a7 */0x47a,
|
|
/* a8 */0x06a,
|
|
/* a9 */0x65a,
|
|
/* aa */0x55a,
|
|
/* ab */0x74a,
|
|
/* ac */0x4da,
|
|
/* ad */0x6ca,
|
|
/* ae */0x5ca,
|
|
/* af */0x28a,
|
|
/* b0 */0x24a,
|
|
/* b1 */0x63a,
|
|
/* b2 */0x53a,
|
|
/* b3 */0x72a,
|
|
/* b4 */0x4ba,
|
|
/* b5 */0x6aa,
|
|
/* b6 */0x5aa,
|
|
/* b7 */0x05a,
|
|
/* b8 */0x0ca,
|
|
/* b9 */0x66a,
|
|
/* ba */0x56a,
|
|
/* bb */0x09a,
|
|
/* bc */0x4ea,
|
|
/* bd */0x11a,
|
|
/* be */0x21a,
|
|
/* bf */0x14a,
|
|
/* c0 */0x186,
|
|
/* c1 */0x226,
|
|
/* c2 */0x126,
|
|
/* c3 */0x716,
|
|
/* c4 */0x0a6,
|
|
/* c5 */0x696,
|
|
/* c6 */0x596,
|
|
/* c7 */0x476,
|
|
/* c8 */0x066,
|
|
/* c9 */0x656,
|
|
/* ca */0x556,
|
|
/* cb */0x746,
|
|
/* cc */0x4d6,
|
|
/* cd */0x6c6,
|
|
/* ce */0x5c6,
|
|
/* cf */0x286,
|
|
/* d0 */0x246,
|
|
/* d1 */0x636,
|
|
/* d2 */0x536,
|
|
/* d3 */0x726,
|
|
/* d4 */0x4b6,
|
|
/* d5 */0x6a6,
|
|
/* d6 */0x5a6,
|
|
/* d7 */0x056,
|
|
/* d8 */0x0c6,
|
|
/* d9 */0x666,
|
|
/* da */0x566,
|
|
/* db */0x096,
|
|
/* dc */0x4e6,
|
|
/* dd */0x116,
|
|
/* de */0x216,
|
|
/* df */0x146,
|
|
/* e0 */0x58e,
|
|
/* e1 */0x62e,
|
|
/* e2 */0x52e,
|
|
/* e3 */0x311,
|
|
/* e4 */0x4ae,
|
|
/* e5 */0x291,
|
|
/* e6 */0x191,
|
|
/* e7 */0x071,
|
|
/* e8 */0x46e,
|
|
/* e9 */0x251,
|
|
/* ea */0x151,
|
|
/* eb */0x348,
|
|
/* ec */0x0d1,
|
|
/* ed */0x2c8,
|
|
/* ee */0x1c8,
|
|
/* ef */0x68e,
|
|
/* f0 */0x64e,
|
|
/* f1 */0x231,
|
|
/* f2 */0x131,
|
|
/* f3 */0x321,
|
|
/* f4 */0x0b1,
|
|
/* f5 */0x2a1,
|
|
/* f6 */0x1a1,
|
|
/* f7 */0x45e,
|
|
/* f8 */0x4ce,
|
|
/* f9 */0x261,
|
|
/* fa */0x161,
|
|
/* fb */0x49e,
|
|
/* fc */0x0e1,
|
|
/* fd */0x51e,
|
|
/* fe */0x61e,
|
|
/* ff */0x54e, } };
|
|
|
|
typedef enum
|
|
{
|
|
IN_SYNC, DECODING
|
|
} d_state_t;
|
|
|
|
d_state_t d_state;
|
|
|
|
public:
|
|
decoder_8b10b_impl (const std::string& control_symbol,
|
|
size_t max_frame_len);
|
|
~decoder_8b10b_impl ();
|
|
|
|
bool
|
|
set_access_code (const std::string &access_code);
|
|
|
|
uint8_t
|
|
process_10b (uint16_t word, int write_pos);
|
|
|
|
// Where all the action really happens
|
|
int
|
|
work (int noutput_items, gr_vector_const_void_star &input_items,
|
|
gr_vector_void_star &output_items);
|
|
};
|
|
|
|
}
|
|
// namespace satnogs
|
|
}// namespace gr
|
|
|
|
#endif /* INCLUDED_SATNOGS_DECODER_8B10B_IMPL_H */
|
|
|