diff --git a/op25/gr-op25/lib/op25_imbe_frame.h b/op25/gr-op25/lib/op25_imbe_frame.h index 7c05ba1..0ee0e7a 100644 --- a/op25/gr-op25/lib/op25_imbe_frame.h +++ b/op25/gr-op25/lib/op25_imbe_frame.h @@ -10,6 +10,7 @@ #include typedef std::vector voice_codeword; +typedef std::vector packed_codeword; typedef const std::vector const_bit_vector; typedef std::vector bit_vector; @@ -344,6 +345,26 @@ imbe_header_decode(const voice_codeword& cw, uint32_t& u0, uint32_t& u1, uint32_ return errs; } +/* + * Pack 88 bit IMBE parameters into uint8_t vector + */ +static inline void +imbe_pack(packed_codeword& cw, uint32_t u0, uint32_t u1, uint32_t u2, uint32_t u3, uint32_t u4, uint32_t u5, uint32_t u6, uint32_t u7) +{ + cw.empty(); + cw.push_back(u0 >> 4); + cw.push_back(((u0 & 0xf) << 4) + (u1 >> 8)); + cw.push_back(u1 & 0xff); + cw.push_back(u2 >> 4); + cw.push_back(((u2 & 0xf) << 4) + (u3 >> 8)); + cw.push_back(u3 & 0xff); + cw.push_back(u4 >> 3); + cw.push_back(((u4 & 0x7) << 5) + (u5 >> 6)); + cw.push_back(((u5 & 0x3f) << 2) + (u6 >> 9)); + cw.push_back(u6 >> 1); + cw.push_back(((u6 & 0x1) << 7) + (u7 >> 1)); +} + /* APCO IMBE header encoder. * * given 88 bits of IMBE parameters, construct output 144-bit IMBE codeword diff --git a/op25/gr-op25_repeater/lib/p25p1_fdma.cc b/op25/gr-op25_repeater/lib/p25p1_fdma.cc index e239864..f18a99a 100644 --- a/op25/gr-op25_repeater/lib/p25p1_fdma.cc +++ b/op25/gr-op25_repeater/lib/p25p1_fdma.cc @@ -625,6 +625,15 @@ p25p1_fdma::process_voice(const bit_vector& A) imbe_deinterleave(A, cw, i); // recover 88-bit IMBE voice code word imbe_header_decode(cw, u[0], u[1], u[2], u[3], u[4], u[5], u[6], u[7], E0, ET); + + if (d_debug >= 10) { + packed_codeword p_cw; + imbe_pack(p_cw, u[0], u[1], u[2], u[3], u[4], u[5], u[6], u[7]); + sprintf(s,"%02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x", + p_cw[0], p_cw[1], p_cw[2], p_cw[3], p_cw[4], p_cw[5], + p_cw[6], p_cw[7], p_cw[8], p_cw[9], p_cw[10]); + fprintf(stderr, "%s IMBE %s\n", logts.get(), s); // print to log in one operation + } // output one 32-byte msg per 0.020 sec. // also, 32*9 = 288 byte pkts (for use via UDP) sprintf(s, "%03x %03x %03x %03x %03x %03x %03x %03x\n", u[0], u[1], u[2], u[3], u[4], u[5], u[6], u[7]);