summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohnathan Corgan <johnathan@corganlabs.com>2014-05-16 15:57:54 -0700
committerJohnathan Corgan <johnathan@corganlabs.com>2014-05-16 15:57:54 -0700
commit1c101701e34cdce5bc608598792b7b0ca0545f65 (patch)
tree964e0a23cf9a6c97eb8721e19d97886d5f800c8d
parent1274197aaa56f3ba4b11adb9f33e26054e6a770f (diff)
parentd165f27dd41d34400bac89220f219b9ba6f7438e (diff)
Merge remote-tracking branch 'osh/pdu_filter_inversion'
-rw-r--r--gr-blocks/grc/blocks_pdu_filter.xml16
-rw-r--r--gr-blocks/include/gnuradio/blocks/pdu_filter.h2
-rw-r--r--gr-blocks/lib/pdu_filter_impl.cc30
-rw-r--r--gr-blocks/lib/pdu_filter_impl.h3
4 files changed, 32 insertions, 19 deletions
diff --git a/gr-blocks/grc/blocks_pdu_filter.xml b/gr-blocks/grc/blocks_pdu_filter.xml
index a9565c9b9c..1fb7209500 100644
--- a/gr-blocks/grc/blocks_pdu_filter.xml
+++ b/gr-blocks/grc/blocks_pdu_filter.xml
@@ -9,7 +9,7 @@
<key>blocks_pdu_filter</key>
<import>from gnuradio import blocks</import>
<import>import pmt</import>
- <make>blocks.pdu_filter($k, $v)</make>
+ <make>blocks.pdu_filter($k, $v, $invert)</make>
<param>
<name>Key</name>
<key>k</key>
@@ -22,6 +22,20 @@
<value>pmt.intern("value")</value>
<type>raw</type>
</param>
+ <param>
+ <name>Invert Filter</name>
+ <key>invert</key>
+ <value>False</value>
+ <type>enum</type>
+ <option>
+ <name>No</name>
+ <key>False</key>
+ </option>
+ <option>
+ <name>Yes</name>
+ <key>True</key>
+ </option>
+ </param>
<sink>
<name>pdus</name>
<type>message</type>
diff --git a/gr-blocks/include/gnuradio/blocks/pdu_filter.h b/gr-blocks/include/gnuradio/blocks/pdu_filter.h
index 5d0d2ed69a..1483731042 100644
--- a/gr-blocks/include/gnuradio/blocks/pdu_filter.h
+++ b/gr-blocks/include/gnuradio/blocks/pdu_filter.h
@@ -43,7 +43,7 @@ namespace gr {
/*!
* \brief Construct a PDU filter
*/
- static sptr make(pmt::pmt_t k, pmt::pmt_t v);
+ static sptr make(pmt::pmt_t k, pmt::pmt_t v, bool invert = false);
};
} /* namespace blocks */
diff --git a/gr-blocks/lib/pdu_filter_impl.cc b/gr-blocks/lib/pdu_filter_impl.cc
index 455c6c8ad9..5db8915b31 100644
--- a/gr-blocks/lib/pdu_filter_impl.cc
+++ b/gr-blocks/lib/pdu_filter_impl.cc
@@ -32,16 +32,16 @@ namespace gr {
namespace blocks {
pdu_filter::sptr
- pdu_filter::make(pmt::pmt_t k, pmt::pmt_t v)
+ pdu_filter::make(pmt::pmt_t k, pmt::pmt_t v, bool invert)
{
- return gnuradio::get_initial_sptr(new pdu_filter_impl(k,v));
+ return gnuradio::get_initial_sptr(new pdu_filter_impl(k,v,invert));
}
- pdu_filter_impl::pdu_filter_impl(pmt::pmt_t k, pmt::pmt_t v)
+ pdu_filter_impl::pdu_filter_impl(pmt::pmt_t k, pmt::pmt_t v, bool invert)
: block("pdu_filter",
io_signature::make (0, 0, 0),
io_signature::make (0, 0, 0)),
- d_k(k), d_v(v)
+ d_k(k), d_v(v), d_invert(invert)
{
message_port_register_out(pmt::mp("pdus"));
message_port_register_in(pmt::mp("pdus"));
@@ -52,21 +52,19 @@ namespace gr {
pdu_filter_impl::handle_msg(pmt::pmt_t pdu)
{
pmt::pmt_t meta = pmt::car(pdu);
+ bool output = d_invert;
- // discard if meta is not a dict
- if(!pmt::is_dict(meta))
- return;
-
- // make sure the dict has the target key
- if(!dict_has_key(meta, d_k))
- return;
-
- // validate the value matches
- if(!pmt::eqv(pmt::dict_ref(meta,d_k,pmt::PMT_NIL), d_v))
- return;
+ // check base type
+ // key exists
+ // value matches
+ if(pmt::is_dict(meta) && dict_has_key(meta, d_k) && pmt::eqv(pmt::dict_ref(meta,d_k,pmt::PMT_NIL), d_v)){
+ output = !d_invert;
+ }
// if all tests pass, propagate the pdu
- message_port_pub(pmt::mp("pdus"), pdu);
+ if(output){
+ message_port_pub(pmt::mp("pdus"), pdu);
+ }
}
} /* namespace blocks */
diff --git a/gr-blocks/lib/pdu_filter_impl.h b/gr-blocks/lib/pdu_filter_impl.h
index 86fa648f00..66440ee421 100644
--- a/gr-blocks/lib/pdu_filter_impl.h
+++ b/gr-blocks/lib/pdu_filter_impl.h
@@ -33,9 +33,10 @@ namespace gr {
private:
pmt::pmt_t d_k;
pmt::pmt_t d_v;
+ bool d_invert;
public:
- pdu_filter_impl(pmt::pmt_t k, pmt::pmt_t v);
+ pdu_filter_impl(pmt::pmt_t k, pmt::pmt_t v, bool invert);
void handle_msg(pmt::pmt_t msg);
};