Hi Josh,

I've figured out this question. I just need to post

    this->post_msg(0,_msg);

Since, _msg is a gr_tag_t. But, still is not clear for me how can I post a
message as follows:

this->post_msg(0, BLOB_METADATA,blob_data, _id); ?

I generated the BLOB_METADATA as pmt::pmt_t type. However, I cannot post
blob_data because is related to _msg (in the previous example), which is a
gr_tag_t type.

If a copy this blob for example to a new blob as you suggested previously,
can I then post using: this->post_msg(0, BLOB_METADATA,blob_data, _id); ?.
I mean, will it change to pmt_t type?.

Many thanks again,

Jose


On Tue, Oct 9, 2012 at 11:06 AM, Jose Torres Diaz <torresdiaz.j...@gmail.com
> wrote:

> Hi Josh,
>
> Thanks for the info. So, for example if I want to modify the
> blob_to_stream example as blob_to_blob (ie. input a message and then output
> a message). The .cc files is as shown below, but I got errors when I
> compile because of the type of variables:
>
>  In member function ‘virtual int blob_to_blob_impl::work(const
> InputItems&, const OutputItems&)’:
> /lib/blob_to_blob.cc:78:43: error: no matching function for call to
> ‘blob_to_blob_impl::post_msg(int, const pmt_t&, const char*&, pmt::pmt_t&)’
> /lib/blob_to_blob.cc:78:43: note: candidates are:
> /grextras/include/gnuradio/block.h:204:10: note: void
> gnuradio::block::post_msg(size_t, const gr_tag_t&)
> /grextras/include/gnuradio/block.h:204:10: note:   candidate expects 2
> arguments, 4 provided
> /grextras/include/gnuradio/block.h:215:10: note: void
> gnuradio::block::post_msg(size_t, const pmt_t&, const pmt_t&, const pmt_t&)
> /grextras/include/gnuradio/block.h:215:10: note:   no known conversion for
> argument 3 from ‘const char*’ to ‘const pmt_t& {aka const
> boost::intrusive_ptr<pmt::pmt_base>&}’
>
> The file blob_to_blob.cc is:
>
> #include <gnuradio/extras/blob_to_blob.h>
> #include <gr_io_signature.h>
> #include <cstring> //std::memcpy
>
> using namespace gnuradio::extras;
>
> static const pmt::pmt_t BLOB_KEY =
> pmt::pmt_string_to_symbol("blob_stream"); //From stream to blob
>
> class blob_to_blob_impl : public blob_to_blob{
> public:
>    blob_to_blob_impl(const size_t item_size):
>         block(
>   "blob_to_blob",
>             gr_make_io_signature(0, 0, 0),
>             gr_make_io_signature(1, 1, item_size),
>             msg_signature(true, 1)
>         ),
>         _item_size(item_size)
>     {
>         _offset = 0;
>
>     //From stream to blob example
>     std::stringstream str;
>         str << name() << unique_id();
>         _id = pmt::pmt_string_to_symbol(str.str());
>
>
>     }
>
>     int work(
>         const InputItems &input_items,
>         const OutputItems &output_items
>     ){
>         //Here the blob is received
>
>         //loop until we get a blob or interrupted
>         while (_offset == 0){
>       _msg = this->pop_msg_queue(); //Reading the incoming blob
>
>             if (pmt::pmt_is_blob(_msg.value)) break;
>         }
>         if (pmt::pmt_blob_length(_msg.value) == 0) return -1; //empty
> blob, we are done here
>
>
>         //calculate the number of bytes to copy
>         const size_t nblob_items = (pmt::pmt_blob_length(_msg.value) -
> _offset)/_item_size;
>         const size_t noutput_bytes =
> _item_size*std::min<size_t>(output_items[0].size(), nblob_items);
>
>         //perform memcpy from blob to output items
>         const char *blob_mem = reinterpret_cast<const char
> *>(pmt::pmt_blob_data(_msg.value)) + _offset;
>         //std::memcpy(output_items[0].get(), blob_mem, noutput_bytes);
> //Putting in the output blob_mem
>
>
>     //post the message to downstream subscribers
>         //this->post_msg(0, BLOB_KEY, blob, _id);
>     this->post_msg(0, BLOB_KEY, blob_mem, _id); //Using blob mem
>
>
>         //adjust the offset into the blob memory
>         _offset += noutput_bytes;
>         if (pmt::pmt_blob_length(_msg.value) == _offset) _offset = 0;
>
>         return noutput_bytes/_item_size;
>     }
>
> private:
>     const size_t _item_size;
>     gr_tag_t _msg;
>     size_t _offset;
>   pmt::pmt_t _id; //From strem to blob example
> };
>
> blob_to_blob::sptr blob_to_blob::make(const size_t item_size){
>   return gnuradio::get_initial_sptr(new blob_to_blob_impl(item_size));
> }
>
> Many thanks again for your kind help,
>
> Jose
>
>
>
> On Tue, Oct 9, 2012 at 4:25 AM, Josh Blum <j...@ettus.com> wrote:
>
>>
>>
>> On 10/07/2012 09:56 PM, Jose Torres Diaz wrote:
>> > Hi All,
>> >
>> > I have another question about the message passing technique. In this
>> > opportunity, I would like to create a block that takes message as input,
>> > but also that post message downstream as output. In my initial attempt,
>> I'm
>> > using the original blob_to_stream example (see below), the incoming
>> message
>> > is taken using:
>> >
>> > _msg = this->pop_msg_queue();
>> >
>> > and then, in order to output the incoming message, it is used:
>> >
>> > std::memcpy(output_items[0].get(), blob_mem, noutput_bytes);
>> >
>> > However,
>> >
>> > *(1) Is it possible to use an alternative way like this:
>> >
>> > post_msg(0,_msg.key, _msg.value,_id);   ?
>>
>>
>> Yes, absolutely. This is the correct way to pass the message downstream.
>>
>> -josh
>>
>
>
>
>
>
_______________________________________________
Discuss-gnuradio mailing list
Discuss-gnuradio@gnu.org
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to