gr-satnogs/include/satnogs/amsat_duv_decoder.h

613 lines
13 KiB
C++

/* -*- c++ -*- */
/*
* gr-satnogs: SatNOGS GNU Radio Out-Of-Tree Module
*
* Copyright (C) 2019, Libre Space Foundation <http://libre.space>
*
* 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_AMSAT_DUV_DECODER_H
#define INCLUDED_SATNOGS_AMSAT_DUV_DECODER_H
#include <satnogs/api.h>
#include <satnogs/decoder.h>
#include <string>
#include <deque>
namespace gr {
namespace satnogs {
/*!
* \brief AMSAT 8b10b + CCSDS RS DUV decoder
*
*/
class SATNOGS_API amsat_duv_decoder : public decoder {
public:
static const size_t
amsat_fox_duv_frame_size;
static const uint8_t
amsat_fox_spacecraft_id[];
static decoder::decoder_sptr
make(const std::string &control_symbol, size_t max_frame_len = 96);
amsat_duv_decoder(const std::string &control_symbol, size_t max_frame_len);
~amsat_duv_decoder();
decoder_status_t
decode(const void *in, int len);
void
reset();
private:
typedef enum {
SEARCH_SYNC, DECODING
} d_state_t;
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;
d_state_t d_state;
size_t d_bitstream_idx;
std::deque<uint8_t> d_bitstream;
bool
set_access_code(const std::string &control_symbol);
void
process_10b(uint16_t word, size_t write_pos);
inline uint16_t
pack_10b_word(size_t idx);
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,
}
};
};
} // namespace satnogs
} // namespace gr
#endif /* INCLUDED_SATNOGS_AMSAT_DUV_DECODER_H */