diff options
author | Tom Rondeau <trondeau@vt.edu> | 2012-12-05 13:26:50 -0500 |
---|---|---|
committer | Tom Rondeau <trondeau@vt.edu> | 2012-12-05 14:08:41 -0500 |
commit | 17c3f992bcd7b671e4e8c0a9dd13c582d256ced9 (patch) | |
tree | 6fc781ac5b971610f8fbc375679adcae5f03bf59 /gnuradio-core/src/lib/io | |
parent | f47f3cc0fa5521d644305f1d7a08a0ba3676b22d (diff) |
core: Use sample and relative rate to update header based on num samples.
When the max segment size is reached, we insert a new header. This updates the timestamp on that header based on the number of samples seen.
Diffstat (limited to 'gnuradio-core/src/lib/io')
-rw-r--r-- | gnuradio-core/src/lib/io/gr_file_meta_sink.cc | 44 | ||||
-rw-r--r-- | gnuradio-core/src/lib/io/gr_file_meta_sink.h | 2 |
2 files changed, 34 insertions, 12 deletions
diff --git a/gnuradio-core/src/lib/io/gr_file_meta_sink.cc b/gnuradio-core/src/lib/io/gr_file_meta_sink.cc index e2b892efd0..f225e4409d 100644 --- a/gnuradio-core/src/lib/io/gr_file_meta_sink.cc +++ b/gnuradio-core/src/lib/io/gr_file_meta_sink.cc @@ -51,8 +51,8 @@ gr_file_meta_sink::gr_file_meta_sink(size_t itemsize, const char *filename, : gr_sync_block("file_meta_sink", gr_make_io_signature(1, 1, itemsize), gr_make_io_signature(0, 0, 0)), - gr_file_sink_base(filename, true), - d_itemsize(itemsize), d_relative_rate(relative_rate), + gr_file_sink_base(filename, true), d_itemsize(itemsize), + d_samp_rate(samp_rate), d_relative_rate(relative_rate), d_max_seg_size(max_segment_size), d_total_seg_size(0) { if(!open(filename)) @@ -129,8 +129,8 @@ gr_file_meta_sink::update_header(pmt_t key, pmt_t value) // Special handling caveat to transform rate from radio source into // the rate at this sink. if(pmt_eq(key, mp("rx_rate"))) { - double rate = pmt_to_double(value); - value = pmt_from_double(rate*d_relative_rate); + d_samp_rate = pmt_to_double(value); + value = pmt_from_double(d_samp_rate*d_relative_rate); } if(pmt_dict_has_key(d_header, key)) { @@ -179,6 +179,32 @@ gr_file_meta_sink::write_and_update() } } +void +gr_file_meta_sink::update_rx_time() +{ + pmt_t rx_time = pmt_string_to_symbol("rx_time"); + pmt_t r = pmt_dict_ref(d_header, rx_time, PMT_NIL); + uint64_t secs = pmt_to_uint64(pmt_tuple_ref(r, 0)); + double fracs = pmt_to_double(pmt_tuple_ref(r, 1)); + double diff = d_total_seg_size / (d_samp_rate*d_relative_rate); + + //std::cerr << "old secs: " << secs << std::endl; + //std::cerr << "old fracs: " << fracs << std::endl; + //std::cerr << "seg size: " << d_total_seg_size << std::endl; + //std::cerr << "diff: " << diff << std::endl; + + fracs += diff; + uint64_t new_secs = static_cast<uint64_t>(fracs); + secs += new_secs; + fracs -= new_secs; + + //std::cerr << "new secs: " << secs << std::endl; + //std::cerr << "new fracs: " << fracs << std::endl << std::endl; + + r = pmt_make_tuple(pmt_from_uint64(secs), pmt_from_double(fracs)); + d_header = pmt_dict_add(d_header, rx_time, r); +} + gr_file_meta_sink::~gr_file_meta_sink() { update_last_header(); @@ -215,14 +241,6 @@ gr_file_meta_sink::work(int noutput_items, else { int item_offset = (int)(itr->offset - abs_N); - std::cerr << "New tag found with absolute index: " << itr->offset - << " and relative index: " << item_offset << std::endl; - std::cerr << "Current segment size: " << d_total_seg_size << std::endl; - std::cerr << "Tag key: " << pmt_symbol_to_string(itr->key) << std::endl; - std::cerr << "Tag Val: "; - pmt_print(itr->value); - std::cerr << std::endl; - // Write date to file up to the next tag location while(nwritten < item_offset) { size_t towrite = std::min(d_max_seg_size - d_total_seg_size, @@ -240,6 +258,7 @@ gr_file_meta_sink::work(int noutput_items, if((d_total_seg_size == d_max_seg_size) && (nwritten < item_offset)) { update_last_header(); + update_rx_time(); write_and_update(); d_total_seg_size = 0; } @@ -272,6 +291,7 @@ gr_file_meta_sink::work(int noutput_items, d_total_seg_size += count; if(d_total_seg_size == d_max_seg_size) { update_last_header(); + update_rx_time(); write_and_update(); d_total_seg_size = 0; } diff --git a/gnuradio-core/src/lib/io/gr_file_meta_sink.h b/gnuradio-core/src/lib/io/gr_file_meta_sink.h index ed3a9f1db1..efe00c4e6a 100644 --- a/gnuradio-core/src/lib/io/gr_file_meta_sink.h +++ b/gnuradio-core/src/lib/io/gr_file_meta_sink.h @@ -104,6 +104,7 @@ class GR_CORE_API gr_file_meta_sink : public gr_sync_block, public gr_file_sink_ private: size_t d_itemsize; + double d_samp_rate; double d_relative_rate; size_t d_max_seg_size; size_t d_total_seg_size; @@ -122,6 +123,7 @@ class GR_CORE_API gr_file_meta_sink : public gr_sync_block, public gr_file_sink_ bool update_header(pmt_t key, pmt_t value); void update_last_header(); void write_and_update(); + void update_rx_time(); public: ~gr_file_meta_sink(); |