Make metadata pipeline more uniform and GR-like.

The Frame Equalizer used to propagate metadata as a dictionary stored in a single tag. Now it instead propagates each entry as a separate tag, which is more in line with how standard GNU Radio blocks do it (see for example PDU to Tagged Stream block). This is also how the Extract CSI block does it.

This modification also removes a lot of unnecessary variables and type conversions (from and to pmt types) in the Decode MAC block.
This commit is contained in:
Anton Ottosson
2021-07-17 16:54:23 +02:00
committed by Bastian Bloessl
parent 4f069d6518
commit e620d48c81
2 changed files with 27 additions and 40 deletions
+16 -34
View File
@@ -36,14 +36,10 @@ public:
gr::io_signature::make(0, 0, 0)),
d_log(log),
d_debug(debug),
d_snr(0),
d_nom_freq(0.0),
d_freq_offset(0.0),
d_ofdm(BPSK_1_2),
d_frame(d_ofdm, 0),
d_frame_complete(true)
{
message_port_register_out(pmt::mp("out"));
}
@@ -64,8 +60,7 @@ public:
while (i < ninput_items[0]) {
get_tags_in_range(
tags, 0, nread + i, nread + i + 1, pmt::string_to_symbol("wifi_start"));
get_tags_in_range(tags, 0, nread + i, nread + i + 1);
if (tags.size()) {
if (d_frame_complete == false) {
@@ -77,21 +72,16 @@ public:
}
d_frame_complete = false;
pmt::pmt_t dict = tags[0].value;
// Enter tags into metadata dictionary
d_meta = pmt::make_dict();
for (auto tag : tags)
d_meta = pmt::dict_add(d_meta, tag.key, tag.value);
int len_data = pmt::to_uint64(pmt::dict_ref(
dict, pmt::mp("frame_bytes"), pmt::from_uint64(MAX_PSDU_SIZE + 1)));
d_meta, pmt::mp("frame_bytes"), pmt::from_uint64(MAX_PSDU_SIZE + 1)));
int encoding = pmt::to_uint64(
pmt::dict_ref(dict, pmt::mp("encoding"), pmt::from_uint64(0)));
d_snr = pmt::to_double(
pmt::dict_ref(dict, pmt::mp("snr"), pmt::from_double(0)));
d_nom_freq = pmt::to_double(
pmt::dict_ref(dict, pmt::mp("freq"), pmt::from_double(0)));
d_freq_offset = pmt::to_double(
pmt::dict_ref(dict, pmt::mp("freq_offset"), pmt::from_double(0)));
d_beta = pmt::to_double(
pmt::dict_ref(dict, pmt::mp("beta"), pmt::from_double(0)));
d_csi = pmt::c32vector_elements(
pmt::dict_ref(dict, pmt::mp("csi"), pmt::make_c32vector(52, 0)));
pmt::dict_ref(d_meta, pmt::mp("encoding"), pmt::from_uint64(0)));
ofdm_param ofdm = ofdm_param((Encoding)encoding);
frame_param frame = frame_param(ofdm, len_data);
@@ -160,16 +150,10 @@ public:
// create PDU
pmt::pmt_t blob = pmt::make_blob(out_bytes + 2, d_frame.psdu_size - 4);
pmt::pmt_t enc = pmt::from_uint64(d_ofdm.encoding);
pmt::pmt_t dict = pmt::make_dict();
dict = pmt::dict_add(dict, pmt::mp("encoding"), enc);
dict = pmt::dict_add(dict, pmt::mp("snr"), pmt::from_double(d_snr));
dict = pmt::dict_add(dict, pmt::mp("nomfreq"), pmt::from_double(d_nom_freq));
dict = pmt::dict_add(dict, pmt::mp("freqofs"), pmt::from_double(d_freq_offset));
dict = pmt::dict_add(dict, pmt::mp("beta"), pmt::from_double(d_beta));
dict = pmt::dict_add(dict, pmt::mp("csi"), pmt::init_c32vector(52, d_csi));
dict = pmt::dict_add(dict, pmt::mp("dlt"), pmt::from_long(LINKTYPE_IEEE802_11));
message_port_pub(pmt::mp("out"), pmt::cons(dict, blob));
d_meta = pmt::dict_add(
d_meta, pmt::mp("dlt"), pmt::from_long(LINKTYPE_IEEE802_11));
message_port_pub(pmt::mp("out"), pmt::cons(d_meta, blob));
}
void deinterleave()
@@ -249,13 +233,11 @@ private:
bool d_debug;
bool d_log;
pmt::pmt_t d_meta;
frame_param d_frame;
ofdm_param d_ofdm;
double d_snr; // dB
double d_nom_freq; // nominal frequency, Hz
double d_freq_offset; // frequency offset, Hz
double d_beta;
std::vector<gr_complex> d_csi;
viterbi_decoder d_decoder;
uint8_t d_rx_symbols[48 * MAX_SYM];
+11 -6
View File
@@ -224,7 +224,7 @@ int frame_equalizer_impl::general_work(int noutput_items,
dict, pmt::mp("encoding"), pmt::from_uint64(d_frame_encoding));
dict = pmt::dict_add(
dict, pmt::mp("snr"), pmt::from_double(d_equalizer->get_snr()));
dict = pmt::dict_add(dict, pmt::mp("freq"), pmt::from_double(d_freq));
dict = pmt::dict_add(dict, pmt::mp("nom_freq"), pmt::from_double(d_freq));
dict = pmt::dict_add(dict,
pmt::mp("freq_offset"),
pmt::from_double(d_freq_offset_from_synclong));
@@ -234,11 +234,16 @@ int frame_equalizer_impl::general_work(int noutput_items,
dict = pmt::dict_add(
dict, pmt::mp("csi"), pmt::init_c32vector(csi.size(), csi));
add_item_tag(0,
nitems_written(0) + o,
pmt::string_to_symbol("wifi_start"),
dict,
pmt::string_to_symbol(alias()));
pmt::pmt_t pairs = pmt::dict_items(dict);
for (int i = 0; i < pmt::length(pairs); i++) {
pmt::pmt_t pair = pmt::nth(i, pairs);
add_item_tag(0,
nitems_written(0) + o,
pmt::car(pair),
pmt::cdr(pair),
alias_pmt());
}
}
}