discuss-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Discuss-gnuradio] Simplest message passing possible


From: franchzilla
Subject: [Discuss-gnuradio] Simplest message passing possible
Date: Sat, 7 Feb 2015 18:41:57 -0700 (MST)

Earlier today, I've posted a question on how to do frame detection and
extraction in GNU Radio
(http://gnuradio.4.n7.nabble.com/Simple-Frame-Detection-td52233.html). I
have a feeling that the best way to accomplish what I need is using the
message passing system.

But I simply can't find an easy enough example to understand how message
passing works. So I tried to create two simple blocks in order to better
understand this system. I simply wanted a block that would receive a stream
(not neccesarily tagged) of bytes and then post them as a message. The other
one would receive this message and then output the same stream of bytes. I
know there are message source/sink blocks that do this, but as I understand,
they work on a previous message passing system.

My blocks were written this way:

Message writing:
message_write_b_impl::message_write_b_impl()
      : gr::sync_block("message_write_b",
              gr::io_signature::make(1, 1, sizeof(char)),
              gr::io_signature::make(0, 0, 0))
    {
        message_port_register_out(pmt::mp("out"));
        buffer = new char[128];
        counter = 0;
    }

    /*
     * Our virtual destructor.
     */
    message_write_b_impl::~message_write_b_impl()
    {
        delete[] buffer;
    }
    
    void
    message_write_b_impl::send_message()
    {
        pmt::pmt_t meta = pmt::make_dict();
        pmt::pmt_t payload = pmt::from_long(long(buffer[counter++]));
        message_port_pub(pmt::mp("out"), pmt::cons(meta, payload));
        std::memset(buffer, 0, sizeof(buffer));
    }

    int
    message_write_b_impl::work(int noutput_items,
                          gr_vector_const_void_star &input_items,
                          gr_vector_void_star &output_items)
    {
        const char *in = (const char *) input_items[0];

        for(int i = 0; i < noutput_items; i++)
        {
            buffer[counter] = in[i];
            this->send_message();
            
            if(counter >= 128)
            {
                counter = 0;
            }            
        }
        consume_each(noutput_items);
        
        return 0;
    }

Message read:
message_read_b_impl::message_read_b_impl()
      : gr::sync_block("message_read_b",
              gr::io_signature::make(0, 0, 0),
              gr::io_signature::make(1, 1, sizeof(char)))
    {
        message_port_register_in(pmt::mp("in"));
        set_msg_handler(pmt::mp("in"),
        boost::bind(&message_read_b_impl::in_handling, this, _1));
        
        buffer = new char[128];
        counter = 0;
        rx_check = false;
    }

    /*
     * Our virtual destructor.
     */
    message_read_b_impl::~message_read_b_impl()
    {
        delete[] buffer;
    }
    
    void
    message_read_b_impl::in_handling(pmt::pmt_t msg)
    {
        if(pmt::is_integer(msg))
        {
            buffer[counter++] = char(pmt::from_long(msg));
            rx_check = true;
        }
        if(counter == 128)
        {
            counter = 0;
            rx_check = false;
        }
    }

    int
    message_read_b_impl::work(int noutput_items,
                          gr_vector_const_void_star &input_items,
                          gr_vector_void_star &output_items)
    {
        char *out = (char *) output_items[0];

        for(int i = 0; i < noutput_items; i++)
        {      
            while(!rx_check);
            out[i] = buffer[i];
        }
        return noutput_items;
    }

As far as I understand, this could be the simplest case to send bytes
through messages. But I feel there is something wrong, as the pmt doesn't
seem to have a method to deal with chars, so I have to do lots of
conversions. Still, this didn't seem to be a reason of bigger concerns.

My python QA block simply does a message connect between their message
ports. But when I try to run the test, the tb simply freezes and I have to
finish with ctrl+C.

Is there any easier way to implement message passing?

Thanks in advance,
Dan Franch 



--
View this message in context: 
http://gnuradio.4.n7.nabble.com/Simplest-message-passing-possible-tp52236.html
Sent from the GnuRadio mailing list archive at Nabble.com.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]