aboutsummaryrefslogtreecommitdiffstats
path: root/CircBufferTimestamp.cpp
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2018-01-24 09:46:38 +0100
committerMatthias P. Braendli <matthias.braendli@mpb.li>2018-01-24 09:46:38 +0100
commit69f65ccc49e4c61091554e2b9be7c01ff35186f2 (patch)
tree7e26704840ec0cf1ac946b8599c6c33e70c02b21 /CircBufferTimestamp.cpp
parent8c7c2e4eb49ce4bbd4e9a6b8b8fccf2905be1966 (diff)
downloadSoapyDummy-69f65ccc49e4c61091554e2b9be7c01ff35186f2.tar.gz
SoapyDummy-69f65ccc49e4c61091554e2b9be7c01ff35186f2.tar.bz2
SoapyDummy-69f65ccc49e4c61091554e2b9be7c01ff35186f2.zip
Add TX to RX feedback with timestamp support, only CF32
Diffstat (limited to 'CircBufferTimestamp.cpp')
-rw-r--r--CircBufferTimestamp.cpp98
1 files changed, 98 insertions, 0 deletions
diff --git a/CircBufferTimestamp.cpp b/CircBufferTimestamp.cpp
new file mode 100644
index 0000000..ba66e68
--- /dev/null
+++ b/CircBufferTimestamp.cpp
@@ -0,0 +1,98 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2018 Matthias P. Braendli
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+// Tests for CircBufferTimestamp.hpp
+
+#include "CircBufferTimestamp.hpp"
+#include <cstdint>
+#include <thread>
+#include <iostream>
+
+using namespace std;
+
+const long long ticks_per_sample = 12;
+const size_t N_ITER = 40;
+const size_t N_SAMPS_PER_BUF = 10;
+
+CircularBuffer<int> cb(1000000);
+
+mutex cerr_mutex;
+
+void writer()
+{
+ const long long ts_start = 200;
+
+ for (size_t iterations = 0; iterations < N_ITER; iterations++) {
+ vector<int> b;
+ for (size_t i = 0; i < N_SAMPS_PER_BUF; i++) {
+ b.push_back(N_SAMPS_PER_BUF*iterations + i);
+ }
+
+ const long long ts_b = ts_start + ticks_per_sample * iterations * b.size();
+
+ cb.write(b.data(), b.size(), ts_b);
+ {
+ unique_lock<mutex> lock(cerr_mutex);
+ cerr << "Wrote " << b.size() << " at t=" << ts_b << endl;
+ }
+
+ this_thread::sleep_for(chrono::milliseconds(10));
+ }
+}
+
+void reader()
+{
+ size_t totaldata = 0;
+ long long req_ts = 450;
+ while (totaldata < N_ITER * N_SAMPS_PER_BUF / 3) {
+ long long ts = req_ts;
+ vector<int> buf(N_SAMPS_PER_BUF/2);
+ const size_t read = cb.read(buf.data(), buf.size(), &ts);
+ buf.resize(read);
+ totaldata += read;
+
+ {
+ unique_lock<mutex> lock(cerr_mutex);
+ cerr << "Read " << totaldata << " so far, ts_req=" <<
+ req_ts << " ts=" << ts << " data:";
+ for (const int samp : buf) {
+ cerr << " " << samp;
+ }
+ cerr << endl;
+ }
+ req_ts += ticks_per_sample * (N_SAMPS_PER_BUF/2 + 1);
+ }
+}
+
+int main(int argc, char **argv)
+{
+ cb.set_ticks_per_sample(ticks_per_sample);
+
+ auto writeThread = thread(writer);
+ auto readThread = thread(reader);
+
+ writeThread.join();
+ readThread.join();
+ return 0;
+}