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))