diff --git a/gr-jay/grc/jay_peak_manager.xml b/gr-jay/grc/jay_peak_manager.xml
index 5ed97fe..6091e82 100644
--- a/gr-jay/grc/jay_peak_manager.xml
+++ b/gr-jay/grc/jay_peak_manager.xml
@@ -24,5 +24,10 @@
message
1
+
+ freq
+ message
+ 1
+
diff --git a/gr-jay/lib/peak_detect_impl.cc b/gr-jay/lib/peak_detect_impl.cc
index 2420f26..2cf0d27 100644
--- a/gr-jay/lib/peak_detect_impl.cc
+++ b/gr-jay/lib/peak_detect_impl.cc
@@ -319,8 +319,15 @@ namespace gr {
{
if (temp[j].isInRange(peak))
{
- temp[j].merge(peak);
+ bool changed = temp[j].update(peak);
found = true;
+ if (changed)
+ {
+ pmt::pmt_t dict = temp[j].msg(1);
+ message_port_pub(m_msg_port_out, dict);
+ add_item_tag(DATA, nitems_written(DATA) + k, pmt::string_to_symbol(std::string("peak")), dict, m_tag_id);
+ }
+
break;
}
}
diff --git a/gr-jay/lib/peak_detect_impl.h b/gr-jay/lib/peak_detect_impl.h
index bf94aaf..7752c7c 100644
--- a/gr-jay/lib/peak_detect_impl.h
+++ b/gr-jay/lib/peak_detect_impl.h
@@ -149,18 +149,23 @@ namespace jay {
return pbh > 0;
}
- const Peak& merge(const Peak &other)
+ bool update(const Peak &other)
{
- float beta = 0.5f;
- float alpha = (1.f-beta);
- float pos_f = alpha*(float)pos + beta*(float)other.pos;
- float pbh_f = alpha*(float)pbh + beta*(float)other.pbh;
- float frequency = alpha*(float)frequency + beta*(float)other.frequency;
- pos = (int)(pos_f + 0.5f);
- pbh = (int)(pbh_f + 0.5f);
+ bool changed = false;
+ if (pos != other.pos)
+ {
+ changed = true;
+ }
+ if (std::abs(frequency-other.frequency) >= (0.01*1e6))
+ {
+ changed = true;
+ }
+ frequency = other.frequency;
+ pos = other.pos;
+ pbh = other.pbh;
height_rel = other.height_rel;
height_abs = other.height_abs;
- return *this;
+ return changed;
}
int left() const
diff --git a/gr-jay/python/peak_manager.py b/gr-jay/python/peak_manager.py
index ab1a69f..c4d3be8 100644
--- a/gr-jay/python/peak_manager.py
+++ b/gr-jay/python/peak_manager.py
@@ -34,17 +34,38 @@ class peak_manager(gr.basic_block):
out_sig=None)
self.test = test
+ self.numFrequencies = 1
+ self.peak_dict = {}
print ("test : ", test)
# Register in / out message ports
self.message_port_register_in(pmt.intern("control"))
self.message_port_register_out(pmt.intern("status"))
+ self.message_port_register_out(pmt.intern("freq"))
# Register in message handler
self.set_msg_handler(pmt.intern("control"), self.msg_handler)
- #self.message_port_pub(pmt.intern("port name"), < pmt message >)
+
+
+ def peak_add(self, key, peak):
+ if len(self.peak_dict) < self.numFrequencies:
+ self.peak_dict[key] = peak
+ return True
+ return False
+
+ def peak_del(self, key):
+ if key in self.peak_dict:
+ self.peak_dict.pop(key, None)
+ return True
+ return False
+
+ def peak_get(self, key):
+ result = None
+ if key in self.peak_dict:
+ result = self.peak_dict[key]
+ return result
def msg_handler(self, msg):
if pmt.is_dict(msg):
@@ -76,8 +97,24 @@ class peak_manager(gr.basic_block):
if peak['state'] == 1:
print ("New peak #{} at {:0.2f} MHz".format(id, freq_MHz))
+ peak_key = 'peak' + str(id)
+
+ peak0 = self.peak_get(peak_key)
+
+ if peak0 is not None:
+ pair = pmt.cons(pmt.intern("freq"), pmt.from_float(peak['freq_Hz']))
+ print("Update " + peak_key)
+ self.message_port_pub(pmt.intern("freq"), pair)
+ elif self.peak_add(peak_key, peak):
+ pair = pmt.cons(pmt.intern("freq"), pmt.from_float(peak['freq_Hz']))
+ print("Added " + peak_key)
+ self.message_port_pub(pmt.intern("freq"), pair)
else:
print ("Lost peak #{} at {:0.2f} MHz".format(id, freq_MHz))
+ peak_key = 'peak' + str(id)
+ if self.peak_del(peak_key):
+ print("Deleted " + peak_key)
+
else:
print(pmt.symbol_to_string(msg))