2022-01-05 22:28:01 -08:00
|
|
|
// 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)
|
2022-10-15 16:33:14 -07:00
|
|
|
: m_reader{std::move(reader)}, m_thread{[=, this] { ReadMain(); }} {}
|
2022-01-05 22:28:01 -08:00
|
|
|
~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;
|
|
|
|
|
};
|