summaryrefslogtreecommitdiff
path: root/gnuradio-core/src/lib/io
diff options
context:
space:
mode:
authorTom Rondeau <trondeau@vt.edu>2012-12-05 13:26:50 -0500
committerTom Rondeau <trondeau@vt.edu>2012-12-05 14:08:41 -0500
commit17c3f992bcd7b671e4e8c0a9dd13c582d256ced9 (patch)
tree6fc781ac5b971610f8fbc375679adcae5f03bf59 /gnuradio-core/src/lib/io
parentf47f3cc0fa5521d644305f1d7a08a0ba3676b22d (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.cc44
-rw-r--r--gnuradio-core/src/lib/io/gr_file_meta_sink.h2
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();