Skip to content
This repository
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 268 lines (217 sloc) 7.901 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
/*
* 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 */
Something went wrong with that request. Please try again.