diff options
Diffstat (limited to 'op25/gr-op25_repeater/lib/p25_frame_assembler_impl.cc')
-rw-r--r-- | op25/gr-op25_repeater/lib/p25_frame_assembler_impl.cc | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/op25/gr-op25_repeater/lib/p25_frame_assembler_impl.cc b/op25/gr-op25_repeater/lib/p25_frame_assembler_impl.cc index 1c1acf7..43086c2 100644 --- a/op25/gr-op25_repeater/lib/p25_frame_assembler_impl.cc +++ b/op25/gr-op25_repeater/lib/p25_frame_assembler_impl.cc @@ -39,12 +39,23 @@ namespace gr { void p25_frame_assembler_impl::p25p2_queue_msg(int duid) { - static const char wbuf[2] = {0xff, 0xff}; // dummy NAC + unsigned char wbuf[8]; + int p=0; + if (!d_do_msgq) return; if (d_msg_queue->full_p()) return; - gr::message::sptr msg = gr::message::make_from_string(std::string(wbuf, 2), duid, 0, 0); + if (!d_nac) + return; + + wbuf[p++] = 0xaa; + wbuf[p++] = 0x55; + wbuf[p++] = (d_msgq_id >> 8) & 0xff; + wbuf[p++] = d_msgq_id & 0xff; + wbuf[p++] = (d_nac >> 8) & 0xff; + wbuf[p++] = d_nac & 0xff; + gr::message::sptr msg = gr::message::make_from_string(std::string((const char *)wbuf, p), duid, 0, 0); d_msg_queue->insert_tail(msg); } @@ -52,15 +63,20 @@ namespace gr { p2tdma.set_xormask(p); } + void p25_frame_assembler_impl::set_nac(int nac) { + d_nac = nac; + p2tdma.set_nac(nac); + } + void p25_frame_assembler_impl::set_slotid(int slotid) { p2tdma.set_slotid(slotid); } p25_frame_assembler::sptr - p25_frame_assembler::make(const char* udp_host, int port, int debug, bool do_imbe, bool do_output, bool do_msgq, gr::msg_queue::sptr queue, bool do_audio_output, bool do_phase2_tdma) + p25_frame_assembler::make(const char* udp_host, int port, int debug, bool do_imbe, bool do_output, bool do_msgq, gr::msg_queue::sptr queue, bool do_audio_output, bool do_phase2_tdma, int msgq_id) { return gnuradio::get_initial_sptr - (new p25_frame_assembler_impl(udp_host, port, debug, do_imbe, do_output, do_msgq, queue, do_audio_output, do_phase2_tdma)); + (new p25_frame_assembler_impl(udp_host, port, debug, do_imbe, do_output, do_msgq, queue, do_audio_output, do_phase2_tdma, msgq_id)); } /* @@ -80,24 +96,24 @@ static const int MAX_IN = 1; // maximum number of input streams /* * The private constructor */ - p25_frame_assembler_impl::p25_frame_assembler_impl(const char* udp_host, int port, int debug, bool do_imbe, bool do_output, bool do_msgq, gr::msg_queue::sptr queue, bool do_audio_output, bool do_phase2_tdma) + p25_frame_assembler_impl::p25_frame_assembler_impl(const char* udp_host, int port, int debug, bool do_imbe, bool do_output, bool do_msgq, gr::msg_queue::sptr queue, bool do_audio_output, bool do_phase2_tdma, int msgq_id) : gr::block("p25_frame_assembler", gr::io_signature::make (MIN_IN, MAX_IN, sizeof (char)), gr::io_signature::make ((do_output) ? 1 : 0, (do_output) ? 1 : 0, (do_audio_output && do_output) ? sizeof(int16_t) : ((do_output) ? sizeof(char) : 0 ))), d_do_imbe(do_imbe), d_do_output(do_output), output_queue(), - p1fdma(udp_host, port, debug, do_imbe, do_output, do_msgq, queue, output_queue, do_audio_output), + op25audio(udp_host, port, debug), + p1fdma(op25audio, debug, do_imbe, do_output, do_msgq, queue, output_queue, do_audio_output, msgq_id), d_do_audio_output(do_audio_output), d_do_phase2_tdma(do_phase2_tdma), - p2tdma(udp_host, port, 0, debug, output_queue), + p2tdma(op25audio, 0, debug, do_msgq, queue, output_queue, do_audio_output, msgq_id), d_do_msgq(do_msgq), - d_msg_queue(queue) + d_msg_queue(queue), + d_nac(0), + d_msgq_id(msgq_id) { - if (d_do_audio_output && !d_do_imbe) - fprintf(stderr, "p25_frame_assembler: error: do_imbe must be enabled if do_audio_output is enabled\n"); - if (d_do_phase2_tdma && !d_do_audio_output) - fprintf(stderr, "p25_frame_assembler: error: do_audio_output must be enabled if do_phase2_tdma is enabled\n"); + fprintf(stderr, "p25_frame_assembler_impl: do_imbe[%d], do_output[%d], do_audio_output[%d], do_phase2_tdma[%d]\n", do_imbe, do_output, do_audio_output, do_phase2_tdma); } void @@ -113,6 +129,7 @@ p25_frame_assembler_impl::forecast(int nof_output_items, gr_vector_int &nof_inpu nof_samples_reqd = nof_output_items; if (d_do_audio_output) nof_samples_reqd = 0.6 * nof_output_items; + nof_samples_reqd = std::max(nof_samples_reqd, 256); std::fill(&nof_input_items_reqd[0], &nof_input_items_reqd[nof_inputs], nof_samples_reqd); } @@ -130,9 +147,10 @@ p25_frame_assembler_impl::general_work (int noutput_items, for (int i = 0; i < ninput_items[0]; i++) { if(p2tdma.rx_sym(in[i])) { int rc = p2tdma.handle_frame(); - if (rc > -1) + if (rc > -1) { p25p2_queue_msg(rc); p1fdma.reset_timer(); // prevent P1 timeouts due to long TDMA transmissions + } } } } |