diff --git a/grc/satnogs_decoder_8b10b.xml b/grc/satnogs_decoder_8b10b.xml index 3432851..03c9b95 100644 --- a/grc/satnogs_decoder_8b10b.xml +++ b/grc/satnogs_decoder_8b10b.xml @@ -4,8 +4,9 @@ satnogs_decoder_8b10b [SatNOGS] import satnogs - satnogs.decoder_8b10b($control_symbol, $max_frame_len, - $comp_type) + satnogs.decoder_8b10b($control_symbol, $max_frame_len + ) + Control symbols @@ -17,24 +18,10 @@ Maximum frame length max_frame_len - 1500 + 960 int - - Comparison type - comp_type - enum - - - - in byte diff --git a/include/satnogs/decoder_8b10b.h b/include/satnogs/decoder_8b10b.h index cc53b64..415214b 100644 --- a/include/satnogs/decoder_8b10b.h +++ b/include/satnogs/decoder_8b10b.h @@ -47,7 +47,7 @@ namespace gr * class. satnogs::decoder_8b10b::make is the public interface for * creating new instances. */ - static sptr make(const std::string& control_symbol,size_t max_frame_len,int comp_type); + static sptr make(const std::string& control_symbol,size_t max_frame_len); }; } diff --git a/lib/decoder_8b10b_impl.cc b/lib/decoder_8b10b_impl.cc index ae4f6e3..d555bd7 100644 --- a/lib/decoder_8b10b_impl.cc +++ b/lib/decoder_8b10b_impl.cc @@ -33,22 +33,21 @@ namespace gr decoder_8b10b::sptr decoder_8b10b::make (const std::string& control_symbol, - size_t max_frame_len, int comp_type) + size_t max_frame_len) { return gnuradio::get_initial_sptr ( - new decoder_8b10b_impl (control_symbol, max_frame_len, comp_type)); + new decoder_8b10b_impl (control_symbol, max_frame_len)); } /* * The private constructor */ decoder_8b10b_impl::decoder_8b10b_impl (const std::string& control_symbol, - size_t max_frame_len, int comp_type) : + size_t max_frame_len) : gr::sync_block ("decoder_8b10b", gr::io_signature::make (1, 1, sizeof(char)), gr::io_signature::make (0, 0, 0)), d_max_frame_len (max_frame_len), - d_comp_type (comp_type), d_control_symbol_pos (0), d_control_symbol_neg (0), d_data_reg (0), @@ -56,15 +55,19 @@ namespace gr d_wrong_bits_neg (0), d_nwrong (0), d_nwrong_neg (0), - d_10b_cnt (0), + d_10b_cnt (1), d_word (0), d_state (IN_SYNC) { message_port_register_out (pmt::mp ("pdu")); + if (!set_access_code (control_symbol)) { GR_LOG_ERROR(d_logger, "control_symbol is not 10 bits"); throw std::out_of_range ("control_symbol is not 10 bits"); } + + d_8b_words = (uint8_t*) malloc (d_max_frame_len / 10); + d_erasures = (uint8_t*) malloc (d_max_frame_len / 10); } /* @@ -93,12 +96,49 @@ namespace gr return true; } + uint8_t + decoder_8b10b_impl::process_10b (int write_pos) + { + uint16_t diff_bits = 0; + uint8_t min_pos = 0, temp_min_pos_rd = 0, min_pos_rd = 0; + uint8_t min_dist = 11; + uint8_t curr_dist = 0; + size_t i = 0; + + while ((i < 256) || (min_dist > 0)) { + + diff_bits = (d_word ^ (d_lookup_8b10b[0][i])) & 0x3FF; + curr_dist = gr::blocks::count_bits16 (diff_bits); + + if (curr_dist > 5) { + curr_dist = 10 - curr_dist; + temp_min_pos_rd = 1; + } + else { + temp_min_pos_rd = 0; + } + + if (curr_dist < min_dist) { + min_dist = curr_dist; + min_pos = i; + min_pos_rd = temp_min_pos_rd; + } + + i++; + } + + /* report that there is erasure to this 10 bits */ + d_8b_words[write_pos - 1] = min_pos; + d_erasures[write_pos - 1] = (min_dist != 0); + } + int decoder_8b10b_impl::work (int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { const uint8_t *in = (const uint8_t *) input_items[0]; + for (int i = 0; i < noutput_items; i++) { d_data_reg = (d_data_reg << 1) | (in[i] & 0x1); @@ -109,32 +149,42 @@ namespace gr d_wrong_bits = (d_data_reg ^ d_control_symbol_pos) & 0x3FF; d_wrong_bits_neg = (d_data_reg ^ d_control_symbol_neg) & 0x3FF; - d_nwrong = gr::blocks::count_bits64 (d_wrong_bits); - d_nwrong_neg = gr::blocks::count_bits64 (d_wrong_bits_neg); + d_nwrong = gr::blocks::count_bits16 (d_wrong_bits); + d_nwrong_neg = gr::blocks::count_bits16 (d_wrong_bits_neg); /* we found the controls symbol */ if ((d_nwrong == 0) || (d_nwrong_neg == 0)) { d_state = DECODING; - d_word = 0; - printf ("Packet start found! Begin decoding! \n"); } - //GR_LOG_DEBUG(d_logger, boost::format ("Wrong number: %u") % wrong_bits); - break; case DECODING: - if (d_10b_cnt < 10) { + if (d_10b_cnt <= d_max_frame_len) { + if ((d_10b_cnt % 10 == 0) && (d_10b_cnt < d_max_frame_len)) { - d_word = (d_word << 1) | (d_data_reg & 0x1); - d_10b_cnt++; + d_word = (d_data_reg & 0x3FF); - if(d_10b_cnt == 10){ - d_state = IN_SYNC; - d_10b_cnt = 0; - printf("DECODING FINISHED! BEGIN SYNC!!\n"); + /* Revert 10b to 8b and accumulate! */ + process_10b (d_10b_cnt / 10); } + + if (d_10b_cnt == d_max_frame_len) { + d_state = IN_SYNC; + d_10b_cnt = 0; // one is added after the if + d_word = 0; // zero it after you use it to prepare for next round + + pmt::pmt_t data = pmt::init_u8vector (d_max_frame_len / 10, + d_8b_words); + pmt::pmt_t erasures = pmt::init_u8vector (d_max_frame_len / 10, + d_erasures); + + pmt::pmt_t out = pmt::cons (data, erasures); + message_port_pub (pmt::mp ("pdu"), out); + } + + d_10b_cnt++; } break; diff --git a/lib/decoder_8b10b_impl.h b/lib/decoder_8b10b_impl.h index 3667cc4..4bcf91a 100644 --- a/lib/decoder_8b10b_impl.h +++ b/lib/decoder_8b10b_impl.h @@ -32,15 +32,535 @@ namespace gr { private: size_t d_max_frame_len; - int d_comp_type; uint16_t d_control_symbol_pos; uint16_t d_control_symbol_neg; uint16_t d_data_reg; - unsigned long long d_wrong_bits, d_wrong_bits_neg; - unsigned int d_nwrong, d_nwrong_neg; - uint d_10b_cnt; + uint16_t d_wrong_bits, d_wrong_bits_neg; + uint8_t d_nwrong, d_nwrong_neg; + uint16_t d_10b_cnt; uint16_t d_word; + uint8_t *d_8b_words; + uint8_t *d_erasures; + + 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 @@ -50,12 +570,15 @@ namespace gr public: decoder_8b10b_impl (const std::string& control_symbol, - size_t max_frame_len, int comp_type); + size_t max_frame_len); ~decoder_8b10b_impl (); bool set_access_code (const std::string &access_code); + uint8_t + process_10b (int write_pos); + // Where all the action really happens int work (int noutput_items, gr_vector_const_void_star &input_items,