Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

268 lines (217 sloc) 7.901 kb
/*
* Copyright 2012 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
* GNU Radio is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* GNU Radio is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU Radio; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef INCLUDED_GR_EXTRAS_BLOCK_H
#define INCLUDED_GR_EXTRAS_BLOCK_H
#include <gnuradio/extras/api.h>
#include <gruel/pmt_extras.h>
#include <gr_hier_block2.h>
#include <gr_block.h>
namespace gnuradio{
template <typename PtrType> struct Buffer
{
//! get a native pointer type to this buffer
inline PtrType get(void) const
{
return _mem;
}
//! get a pointer of the desired type to this buffer
template <typename T> inline T cast(void) const
{
return reinterpret_cast<T>(this->get());
}
//! get the number of items in this buffer
inline size_t size(void) const
{
return _len;
}
//private:
PtrType _mem;
size_t _len;
};
//! Message signature describes the inputs and outputs of message passing
struct GR_EXTRAS_API msg_signature
{
msg_signature(void):
num_inputs(0), num_outputs(0)
{
//NOP
}
msg_signature(const bool has_input, const size_t num_outputs):
num_inputs(has_input?1:0), num_outputs(num_outputs)
{
//NOP
}
msg_signature(const size_t num_inputs, const size_t num_outputs):
num_inputs(num_inputs), num_outputs(num_outputs)
{
//NOP
}
size_t num_inputs;
size_t num_outputs;
};
/*!
* The base clock class that provides message passing,
* and a more object oriented access to work buffers.
* This block implements basic and sync block functionalities.
*/
class GR_EXTRAS_API block : public gr_hier_block2{
public:
//! Make msg_signature available in block context
typedef gnuradio::msg_signature msg_signature;
//! empty constructor for virtual inheritance
block(void){}
/*!
* The block constructor.
* The message output ports creates optional output ports,
* considered to be indexed after the output IO signature.
* Additionaly, there is 1 optional input message port,
* considered to be indexed after the input IO signature.
* \param name the name of this block
* \param in_sig the input signature
* \param out_sig the output signature
* \param msg_sig the IO for msg passing
*/
block(
const std::string &name,
gr_io_signature_sptr in_sig,
gr_io_signature_sptr out_sig,
const msg_signature &msg_sig = msg_signature()
);
//! deconstructor
virtual ~block(void);
/*!
* Set the block's work mode (how it produces and consumes, and the ratio).
* When automatic, consume is automatically called, and forecast handled.
* \param automatic true to call consume and forecast automatically
*/
void set_auto_consume(const bool automatic);
/*******************************************************************
* Basic routines from basic block
******************************************************************/
long unique_id(void) const;
std::string name(void) const;
unsigned history(void) const;
void set_history(unsigned history);
void set_output_multiple(int multiple);
int output_multiple(void) const;
void consume(int which_input, int how_many_items);
void consume_each(int how_many_items);
void produce(int which_output, int how_many_items);
/*!
* The relative rate can be thought of as interpolation/decimation.
* In other words, relative rate is the ratio of output items to input items.
*/
void set_relative_rate(double relative_rate);
double relative_rate(void) const;
/*******************************************************************
* Tag related routines from basic block
******************************************************************/
uint64_t nitems_read(unsigned int which_input);
uint64_t nitems_written(unsigned int which_output);
gr_block::tag_propagation_policy_t tag_propagation_policy(void);
void set_tag_propagation_policy(gr_block::tag_propagation_policy_t p);
void add_item_tag(
unsigned int which_output, const gr_tag_t &tag
);
void add_item_tag(
unsigned int which_output,
uint64_t abs_offset,
const pmt::pmt_t &key,
const pmt::pmt_t &value,
const pmt::pmt_t &srcid=pmt::PMT_F
);
void get_tags_in_range(
std::vector<gr_tag_t> &tags,
unsigned int which_input,
uint64_t abs_start,
uint64_t abs_end
);
void get_tags_in_range(
std::vector<gr_tag_t> &tags,
unsigned int which_input,
uint64_t abs_start,
uint64_t abs_end,
const pmt::pmt_t &key
);
/*******************************************************************
* Message passing related routines from basic block
******************************************************************/
/*!
* \brief Check if a message is available to pop.
* \return true is a message is in the queue
*/
bool check_msg_queue(void);
/*!
* \brief Pop a message from the front of the queue.
* This function will block until a message is available.
* \return the message as a tag type
*/
gr_tag_t pop_msg_queue(void);
/*!
* \brief Post a message to a message source port on this block.
* All message sinks connected to this port will get this message.
* Example: the port index will be 0 for the blocks's 0th message source.
*
* \param port the index of the message source port
* \param msg the message to post to all subscribers
*/
void post_msg(const size_t port, const gr_tag_t &msg);
/*!
* \brief Post a message to a message source port on this block.
* All message sinks connected to this port will get this message.
*
* \\param port the index of the message source port
* \param key the tag key as a PMT symbol
* \param value any PMT holding any value for the given key
* \param srcid optional source ID specifier; defaults to PMT_F
*/
void post_msg(
const size_t port,
const pmt::pmt_t &key,
const pmt::pmt_t &value,
const pmt::pmt_t &srcid=pmt::PMT_F
);
/*******************************************************************
* Work related routines from basic block
******************************************************************/
//! Called when the flow graph is started, can overload
virtual bool start(void);
//! Called when the flow graph is stopped, can overload
virtual bool stop(void);
typedef std::vector<Buffer<const void *> > InputItems;
typedef std::vector<Buffer<void *> > OutputItems;
//! The official call into the work routine (overload please)
virtual int work(
const InputItems &input_items,
const OutputItems &output_items
) = 0;
//! forcast requirements, can be overloaded
virtual void forecast(
int noutput_items,
gr_vector_int &ninput_items_required
);
private:
//forward declared private guts
struct impl;
boost::shared_ptr<impl> _impl;
};
}
#endif /* INCLUDED_GR_EXTRAS_BLOCK_H */
Jump to Line
Something went wrong with that request. Please try again.