Fix 8b10b decoding process

This commit is contained in:
Manolis Surligas 2018-02-15 00:13:10 +02:00
parent 5aae0a1b49
commit 71caec1edc
3 changed files with 36 additions and 28 deletions

View File

@ -59,6 +59,7 @@ namespace gr {
void
ccsds_rs_decoder_mm_impl::message_handler (pmt::pmt_t m)
{
int ret;
uint8_t data[255];
int erasures[255];
const uint8_t *data_ref;
@ -77,16 +78,18 @@ namespace gr {
memcpy(data, data_ref, data_len);
if( pmt::equal (pmt::PMT_NIL, pmt_erasures)) {
decode_rs_ccsds(data, NULL, 0, (int)(255 - data_len));
ret = decode_rs_8(data, NULL, 0, (int)(255 - data_len));
}
else {
erasures_len = pmt::blob_length(pmt_erasures);
erasures_ref = pmt::s32vector_elements(pmt_erasures, erasures_len);
memcpy(erasures, erasures_ref, erasures_len * sizeof(int));
decode_rs_ccsds(data, erasures, (int)erasures_len,
(int)(255 - data_len));
ret = decode_rs_8 (data, erasures, (int) erasures_len,
(int) (255 - data_len));
}
if(ret > -1) {
message_port_pub(pmt::mp("pdu"), pmt::make_blob(data, 223));
}
message_port_pub(pmt::mp("pdu"), pmt::make_blob(data, 223));
}
/*

View File

@ -58,7 +58,6 @@ namespace gr
d_wrong_bits_neg (0),
d_nwrong (0),
d_nwrong_neg (0),
d_word (0),
d_word_cnt (0),
d_state (IN_SYNC)
{
@ -102,36 +101,42 @@ namespace gr
}
uint8_t
decoder_8b10b_impl::process_10b (int write_pos)
decoder_8b10b_impl::process_10b (uint16_t word, 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_pos = 0;
uint8_t min_dist = 11;
uint8_t curr_dist = 0;
size_t i = 0;
while ((i < 256) || (min_dist > 0)) {
/* Check for the disparity -1 */
while ((i < 256) && (min_dist > 0)) {
diff_bits = (d_word ^ (d_lookup_8b10b[0][i])) & 0x3FF;
diff_bits = (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++;
}
/* Check for the disparity +1 */
i = 0;
while ((i < 256) && (min_dist > 0)) {
diff_bits = (word ^ (d_lookup_8b10b[1][i])) & 0x3FF;
curr_dist = gr::blocks::count_bits16 (diff_bits);
if (curr_dist < min_dist) {
min_dist = curr_dist;
min_pos = i;
}
i++;
}
/* report that there is erasure to this 10 bits */
d_8b_words[write_pos] = min_pos;
@ -144,11 +149,11 @@ namespace gr
static inline uint16_t
pack_10b_word(const uint8_t *in)
{
return ((in[0] & 0x1) << 9) | ((in[1] & 0x1) << 8)
| ((in[2] & 0x1) << 7) | ((in[3] & 0x1) << 6)
| ((in[4] & 0x1) << 5) | ((in[5] & 0x1) << 4)
| ((in[6] & 0x1) << 3) | ((in[7] & 0x1) << 2)
| ((in[8] & 0x1) << 1) | (in[9] & 0x1);
return (((uint16_t)in[0] & 0x1) << 9) | (((uint16_t)in[1] & 0x1) << 8)
| (((uint16_t)in[2] & 0x1) << 7) | (((uint16_t)in[3] & 0x1) << 6)
| (((uint16_t)in[4] & 0x1) << 5) | (((uint16_t)in[5] & 0x1) << 4)
| (((uint16_t)in[6] & 0x1) << 3) | (((uint16_t)in[7] & 0x1) << 2)
| (((uint16_t)in[8] & 0x1) << 1) | (in[9] & 0x1);
}
int
@ -157,6 +162,7 @@ namespace gr
gr_vector_void_star &output_items)
{
int i;
uint16_t word;
const uint8_t *in = (const uint8_t *) input_items[0];
/* Search for the Comma symbol */
@ -184,10 +190,10 @@ namespace gr
* in chunks of 10 bits
*/
for(i = 0; i < noutput_items / 10; i++) {
d_word = pack_10b_word(&in[i * 10]);
word = pack_10b_word(&in[i * 10]);
/* Revert 10b to 8b and accumulate! */
process_10b (d_word_cnt);
process_10b (word, d_word_cnt);
d_word_cnt++;

View File

@ -40,7 +40,6 @@ namespace gr
uint16_t d_wrong_bits_neg;
uint8_t d_nwrong;
uint8_t d_nwrong_neg;
uint16_t d_word;
size_t d_word_cnt;
uint8_t *d_8b_words;
@ -580,7 +579,7 @@ namespace gr
set_access_code (const std::string &access_code);
uint8_t
process_10b (int write_pos);
process_10b (uint16_t word, int write_pos);
// Where all the action really happens
int