Back to Serial Studio

MDF Lib: include/mdf/mdfwriter.h Source File

lib/mdflib/docs/manual/html/mdfwriter_8h_source.html

3.2.730.9 KB
Original Source

| MDF Lib 2.2

Interface against MDF 3/4 files |

Loading...

Searching...

No Matches

mdfwriter.h

Go to the documentation of this file.

1/*

2 * Copyright 2022 Ingemar Hedvall

3 * SPDX-License-Identifier: MIT

4 */

5

6#pragma once

7#include <atomic>

8#include <condition_variable>

9#include <deque>

10#include <mutex>

11#include <string>

12#include <thread>

13#include <map>

14

15#include "mdf/mdffile.h"

16#include "mdf/samplerecord.h"

17#include "mdf/canmessage.h"

18

22namespace mdf {

23

29enum class MdfBusType : int {

30CAN,

31LIN,

32FlexRay,

33MOST,

34Ethernet,

35UNKNOWN

36};

37

53enum class MdfStorageType : int {

54FixedLengthStorage,

55VlsdStorage,

56MlsdStorage,

57};

58

59class IChannelGroup;

60class IChannel;

61class IChannelConversion;

62class IDataGroup;

63

104class MdfWriter {

105 public:

106MdfWriter() = default;

107virtual ~MdfWriter();

108

109MdfWriter(const MdfWriter& writer) = delete;

110MdfWriter& operator=(const MdfWriter& writer) = delete;

111

113 [[nodiscard]] std::string Name() const;

114

122bool Init(const std::string& filename);

123

125 [[nodiscard]] bool IsFileNew() const {

126return write_state_ == WriteState::Create;

127 }

128

135void PreTrigTime(double pre_trig_time);

136 [[nodiscard]] double PreTrigTime() const;

137

139 [[nodiscard]] uint64_t StartTime() const { return start_time_; }

141 [[nodiscard]] uint64_t StopTime() const { return stop_time_; }

142

150MdfFile* GetFile() const { return mdf_file_.get(); }

151

152 [[nodiscard]] IHeader* Header() const;

153

160bool CreateBusLogConfiguration();

161

163 [[nodiscard]] IDataGroup* CreateDataGroup();

165 [[nodiscard]] static IChannelGroup* CreateChannelGroup(IDataGroup* parent);

167 [[nodiscard]] static IChannel* CreateChannel(IChannelGroup* parent);

169virtual IChannelConversion* CreateChannelConversion(IChannel* parent) = 0;

170

174virtual bool InitMeasurement();

175

188virtual void SaveSample(const IChannelGroup& group, uint64_t time);

189

202void SaveCanMessage(const IChannelGroup& group, uint64_t time,

203const CanMessage& msg);

204

206virtual void StartMeasurement(uint64_t start_time);

207

209virtual void StartMeasurement(ITimestamp &start_time);

211virtual void StopMeasurement(uint64_t stop_time);

213virtual void StopMeasurement(ITimestamp &start_time);

214

217virtual bool FinalizeMeasurement();

218

227void BusType(MdfBusType type) { bus_type_ = type; }

228

233 [[nodiscard]] MdfBusType BusType() const { return bus_type_; }

234

236 [[nodiscard]] std::string_view BusTypeAsString() const;

237

256void StorageType(MdfStorageType type) { storage_type_ = type; }

257

262 [[nodiscard]] MdfStorageType StorageType() const { return storage_type_; }

263

272void MaxLength(uint32_t max_length) {max_length_ = max_length;};

273

275 [[nodiscard]] uint32_t MaxLength() const { return max_length_; }

276

278void CompressData(bool compress) {compress_data_ = compress;}

280 [[nodiscard]] bool CompressData() const { return compress_data_;}

281

282 protected:

284enum class WriteState : uint8_t {

285Create,

286Init,

287StartMeas,

288StopMeas,

289Finalize

290 };

291 std::atomic<WriteState> write_state_ =

292WriteState::Create;

293

294 std::unique_ptr<MdfFile> mdf_file_;

295 std::string filename_;

296

297 std::atomic<uint64_t> pre_trig_time_ = 0;

298 std::atomic<uint64_t> start_time_ = 0;

299 std::atomic<uint64_t> stop_time_ = 0;

300

301 std::thread work_thread_;

302 std::atomic_bool stop_thread_ = false;

303 std::mutex locker_;

304 std::condition_variable sample_event_;

305 std::atomic<size_t> sample_queue_size_ = 0;

306

307using SampleQueue = std::deque<SampleRecord>;

308SampleQueue sample_queue_;

309

310virtual void CreateMdfFile() = 0;

311virtual bool PrepareForWriting() = 0;

312virtual void SetDataPosition(std::FILE* file);

313virtual bool WriteSignalData(std::FILE* file);

314

315void StopWorkThread();

316void WorkThread();

317

318virtual void TrimQueue();

320virtual void SaveQueue(std::unique_lock<std::mutex>& lock);

322virtual void CleanQueue(std::unique_lock<std::mutex>& lock);

324void IncrementNofSamples(uint64_t record_id) const;

326virtual void SetLastPosition(std::FILE* file) = 0;

327

328

329 private:

330bool compress_data_ = false;

331MdfBusType bus_type_ = MdfBusType::UNKNOWN;

332MdfStorageType storage_type_ = MdfStorageType::FixedLengthStorage;

333 uint32_t max_length_ = 8;

334 std::map<uint64_t, const IChannel*> master_channels_;

335void RecalculateTimeMaster();

336void CreateCanConfig(IDataGroup& dg_block) const;

337

356void CreateCanDataFrameChannel(IChannelGroup& group) const;

357

372void CreateCanRemoteFrameChannel(IChannelGroup& group) const;

373

394void CreateCanErrorFrameChannel(IChannelGroup& group) const;

395

405static void CreateCanOverloadFrameChannel(IChannelGroup& group);

406};

407

408} // namespace mdf

canmessage.h

Simple wrapper around a CAN or CAN FD message.

mdf::CanMessage

Helper class when logging CAN and CAN FD messages.

Definition canmessage.h:47

mdf::IChannelConversion

Defines a channel conversion (CC) block.

Definition ichannelconversion.h:142

mdf::IChannelGroup

Interface against a channel group (CG) block.

Definition ichannelgroup.h:66

mdf::IChannel

Defines a MDF channel (CN) block.

Definition ichannel.h:126

mdf::IDataGroup

Interface to a data group (DG) block.

Definition idatagroup.h:42

mdf::IHeader

Interface class against an MDF HD block.

Definition iheader.h:34

mdf::ITimestamp

Interface for timestamp handling in MDF files.

Definition itimestamp.h:17

mdf::MdfFile

Implements an user interface against a MDF file.

Definition mdffile.h:37

mdf::MdfWriter

Interface against an MDF writer object.

Definition mdfwriter.h:104

mdf::MdfWriter::CreateChannel

static IChannel * CreateChannel(IChannelGroup *parent)

Creates a new channel (CN) block.

mdf::MdfWriter::StorageType

MdfStorageType StorageType() const

Returns the type of data storage the MDF file is associated with. Only used when doing bus logging.

Definition mdfwriter.h:262

mdf::MdfWriter::BusType

void BusType(MdfBusType type)

Only used when doing bus logging. It defines the default channel and channel group names when doing b...

Definition mdfwriter.h:227

mdf::MdfWriter::pre_trig_time_

std::atomic< uint64_t > pre_trig_time_

Nanoseconds difference.

Definition mdfwriter.h:297

mdf::MdfWriter::CompressData

bool CompressData() const

Returns true if the data block is compressed.

Definition mdfwriter.h:280

mdf::MdfWriter::sample_event_

std::condition_variable sample_event_

Used internally.

Definition mdfwriter.h:304

mdf::MdfWriter::FinalizeMeasurement

virtual bool FinalizeMeasurement()

Stop the sample queue and write all unwritten blocks to the file.

mdf::MdfWriter::sample_queue_

SampleQueue sample_queue_

Sample queue.

Definition mdfwriter.h:308

mdf::MdfWriter::CreateDataGroup

IDataGroup * CreateDataGroup()

Create a new data group (DG) block.

mdf::MdfWriter::WorkThread

void WorkThread()

Worker thread function.

mdf::MdfWriter::PreTrigTime

double PreTrigTime() const

Pre-trig time (s).

mdf::MdfWriter::mdf_file_

std::unique_ptr< MdfFile > mdf_file_

Holds the actual file object.

Definition mdfwriter.h:294

mdf::MdfWriter::StartMeasurement

virtual void StartMeasurement(ITimestamp &start_time)

Starts the measurement.

mdf::MdfWriter::StartMeasurement

virtual void StartMeasurement(uint64_t start_time)

Starts the measurement.

mdf::MdfWriter::SaveCanMessage

void SaveCanMessage(const IChannelGroup &group, uint64_t time, const CanMessage &msg)

Saves a CAN message into a bus logger channel group.

mdf::MdfWriter::StopMeasurement

virtual void StopMeasurement(ITimestamp &start_time)

Stops the measurement.

mdf::MdfWriter::stop_thread_

std::atomic_bool stop_thread_

Set to true to stop the thread.

Definition mdfwriter.h:302

mdf::MdfWriter::PrepareForWriting

virtual bool PrepareForWriting()=0

Prepare for writing.

mdf::MdfWriter::GetFile

MdfFile * GetFile() const

Returns the MDF file interface.

Definition mdfwriter.h:150

mdf::MdfWriter::CreateBusLogConfiguration

bool CreateBusLogConfiguration()

Creates all default DG, CG and CN blocks that bus loggers uses.

mdf::MdfWriter::StorageType

void StorageType(MdfStorageType type)

Only used when doing bus logging. It defines how raw data is stored.

Definition mdfwriter.h:256

mdf::MdfWriter::SetLastPosition

virtual void SetLastPosition(std::FILE *file)=0

Set the last file position.

mdf::MdfWriter::CreateChannelGroup

static IChannelGroup * CreateChannelGroup(IDataGroup *parent)

Create a new channel group (CG) block.

mdf::MdfWriter::locker_

std::mutex locker_

Mutex for thread-safe handling of the sample queue.

Definition mdfwriter.h:303

mdf::MdfWriter::PreTrigTime

void PreTrigTime(double pre_trig_time)

Sets the pre-trig time (s) of the writer.

mdf::MdfWriter::CreateMdfFile

virtual void CreateMdfFile()=0

Creates an MDF file.

mdf::MdfWriter::Init

bool Init(const std::string &filename)

Initiate the file.

mdf::MdfWriter::WriteSignalData

virtual bool WriteSignalData(std::FILE *file)

Write an SD block.

mdf::MdfWriter::BusType

MdfBusType BusType() const

Returns the type of bus the MDF file is associated with. Only used when doing bus logging.

Definition mdfwriter.h:233

mdf::MdfWriter::filename_

std::string filename_

Full name of file with path and extension.

Definition mdfwriter.h:295

mdf::MdfWriter::CreateChannelConversion

virtual IChannelConversion * CreateChannelConversion(IChannel *parent)=0

Create a new channel conversion (CC) block.

mdf::MdfWriter::CompressData

void CompressData(bool compress)

If set to true, the data block will be compressed.

Definition mdfwriter.h:278

mdf::MdfWriter::SaveSample

virtual void SaveSample(const IChannelGroup &group, uint64_t time)

Saves a sample record for a channel group.

mdf::MdfWriter::work_thread_

std::thread work_thread_

Sample queue thread.

Definition mdfwriter.h:301

mdf::MdfWriter::stop_time_

std::atomic< uint64_t > stop_time_

Nanoseconds since 1970.

Definition mdfwriter.h:299

mdf::MdfWriter::InitMeasurement

virtual bool InitMeasurement()

Initialize the sample queue and write any unwritten block to the file.

mdf::MdfWriter::BusTypeAsString

std::string_view BusTypeAsString() const

Returns the bus type as text.

mdf::MdfWriter::StartTime

uint64_t StartTime() const

Returns start time in nano-seconds since 1970.

Definition mdfwriter.h:139

mdf::MdfWriter::Header

IHeader * Header() const

Returns the header block (HD).

mdf::MdfWriter::~MdfWriter

virtual ~MdfWriter()

Default destructor.

mdf::MdfWriter::CleanQueue

virtual void CleanQueue(std::unique_lock< std::mutex > &lock)

Flush the sample queue.

mdf::MdfWriter::write_state_

std::atomic< WriteState > write_state_

Keeps track of the worker thread state.

Definition mdfwriter.h:291

mdf::MdfWriter::MdfWriter

MdfWriter()=default

Default constructor.

mdf::MdfWriter::IncrementNofSamples

void IncrementNofSamples(uint64_t record_id) const

Increment the sample counter.

mdf::MdfWriter::start_time_

std::atomic< uint64_t > start_time_

Nanoseconds since 1970.

Definition mdfwriter.h:298

mdf::MdfWriter::TrimQueue

virtual void TrimQueue()

Trims the sample queue.

mdf::MdfWriter::SaveQueue

virtual void SaveQueue(std::unique_lock< std::mutex > &lock)

Saves the queue to file.

mdf::MdfWriter::StopWorkThread

void StopWorkThread()

Stops the worker thread.

mdf::MdfWriter::SetDataPosition

virtual void SetDataPosition(std::FILE *file)

Set the data position.

mdf::MdfWriter::WriteState

WriteState

Internal state of the thread.

Definition mdfwriter.h:284

mdf::MdfWriter::WriteState::StopMeas

@ StopMeas

Stop saving samples. OK to.

mdf::MdfWriter::WriteState::StartMeas

@ StartMeas

Start saving samples to file.

mdf::MdfWriter::WriteState::Create

@ Create

Only at first measurement.

mdf::MdfWriter::WriteState::Init

@ Init

Start work thread and start collecting samples.

mdf::MdfWriter::WriteState::Finalize

@ Finalize

OK to add new DG and CG blocks.

mdf::MdfWriter::StopMeasurement

virtual void StopMeasurement(uint64_t stop_time)

Stops the measurement.

mdf::MdfWriter::MaxLength

void MaxLength(uint32_t max_length)

Sets max number of payload data bytes.

Definition mdfwriter.h:272

mdf::MdfWriter::IsFileNew

bool IsFileNew() const

Returns true if this is a new file.

Definition mdfwriter.h:125

mdf::MdfWriter::MaxLength

uint32_t MaxLength() const

Returns maximum number of payload data bytes.

Definition mdfwriter.h:275

mdf::MdfWriter::sample_queue_size_

std::atomic< size_t > sample_queue_size_

Used to trig flushing to disc.

Definition mdfwriter.h:305

mdf::MdfWriter::StopTime

uint64_t StopTime() const

Returns stop time in nano-seconds since 1970.

Definition mdfwriter.h:141

mdf::MdfWriter::SampleQueue

std::deque< SampleRecord > SampleQueue

Sample queue.

Definition mdfwriter.h:307

mdf::MdfWriter::Name

std::string Name() const

Returns the filename without extension and path (stem).

mdffile.h

Interface against an MDF file object.

mdf

Main namespace for the MDF library.

Definition canmessage.h:17

mdf::BusType::FlexRay

@ FlexRay

FlexRay bus.

mdf::BusType::Ethernet

@ Ethernet

EtherNet bus.

mdf::MdfStorageType

MdfStorageType

Enumerate that defines how the raw data is stored. By default the fixed length record is stored....

Definition mdfwriter.h:53

mdf::MdfStorageType::VlsdStorage

@ VlsdStorage

Using variable length storage.

mdf::MdfStorageType::FixedLengthStorage

@ FixedLengthStorage

The default is to use fixed length records.

mdf::MdfStorageType::MlsdStorage

@ MlsdStorage

Using maximum length storage.

mdf::MdfBusType

MdfBusType

Enumerate that defines type of bus. Only relevant for bus logging.

Definition mdfwriter.h:29

mdf::MdfBusType::UNKNOWN

@ UNKNOWN

Unknown bus type (Default)

mdf::MdfBusType::CAN

@ CAN

CAN or CAN-FD bus.

mdf::MdfBusType::MOST

@ MOST

MOST bus.

mdf::MdfBusType::LIN

@ LIN

LIN bus.

samplerecord.h


Generated by 1.12.0