diff options
Diffstat (limited to 'CircBufferTimestamp.cpp')
-rw-r--r-- | CircBufferTimestamp.cpp | 98 |
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; +} |