mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-19 00:41:43 +00:00
* Use explicit this capture required by C++20 * Use C++20 span * Replace wpi::numbers with std::numbers * Fix C++20 clang-tidy warning false positive in fmt * Remove ciso646 include since C++20 removed that header * Fix global-buffer-overflow asan warnings in ntcore tests * Add DIOSetProxy constructor to HAL * Upgrade MSVC compiler to 2022 * Bump native-utils to 2023.2.7 (changes to std=c++20) Co-authored-by: Peter Johnson <johnson.peter@gmail.com>
72 lines
1.9 KiB
C++
72 lines
1.9 KiB
C++
// Copyright (c) FIRST and other WPILib contributors.
|
|
// Open Source Software; you can modify and/or share it under the terms of
|
|
// the WPILib BSD license file in the root directory of this project.
|
|
|
|
#pragma once
|
|
|
|
#include <atomic>
|
|
#include <functional>
|
|
#include <map>
|
|
#include <string>
|
|
#include <string_view>
|
|
#include <thread>
|
|
#include <utility>
|
|
|
|
#include <wpi/DataLogReader.h>
|
|
#include <wpi/DenseMap.h>
|
|
#include <wpi/Signal.h>
|
|
#include <wpi/mutex.h>
|
|
|
|
class DataLogThread {
|
|
public:
|
|
explicit DataLogThread(wpi::log::DataLogReader reader)
|
|
: m_reader{std::move(reader)}, m_thread{[=, this] { ReadMain(); }} {}
|
|
~DataLogThread();
|
|
|
|
bool IsDone() const { return m_done; }
|
|
std::string_view GetBufferIdentifier() const {
|
|
return m_reader.GetBufferIdentifier();
|
|
}
|
|
unsigned int GetNumRecords() const { return m_numRecords; }
|
|
unsigned int GetNumEntries() const {
|
|
std::scoped_lock lock{m_mutex};
|
|
return m_entryNames.size();
|
|
}
|
|
|
|
// Passes wpi::log::StartRecordData to func
|
|
template <typename T>
|
|
void ForEachEntryName(T&& func) {
|
|
std::scoped_lock lock{m_mutex};
|
|
for (auto&& kv : m_entryNames) {
|
|
func(kv.second);
|
|
}
|
|
}
|
|
|
|
wpi::log::StartRecordData GetEntry(std::string_view name) const {
|
|
std::scoped_lock lock{m_mutex};
|
|
auto it = m_entryNames.find(name);
|
|
if (it == m_entryNames.end()) {
|
|
return {};
|
|
}
|
|
return it->second;
|
|
}
|
|
|
|
const wpi::log::DataLogReader& GetReader() const { return m_reader; }
|
|
|
|
// note: these are called on separate thread
|
|
wpi::sig::Signal_mt<const wpi::log::StartRecordData&> sigEntryAdded;
|
|
wpi::sig::Signal_mt<> sigDone;
|
|
|
|
private:
|
|
void ReadMain();
|
|
|
|
wpi::log::DataLogReader m_reader;
|
|
mutable wpi::mutex m_mutex;
|
|
std::atomic_bool m_active{true};
|
|
std::atomic_bool m_done{false};
|
|
std::atomic<unsigned int> m_numRecords{0};
|
|
std::map<std::string, wpi::log::StartRecordData, std::less<>> m_entryNames;
|
|
wpi::DenseMap<int, wpi::log::StartRecordData> m_entries;
|
|
std::thread m_thread;
|
|
};
|