Vector BLF
File.h
1 // SPDX-FileCopyrightText: 2013-2021 Tobias Lorenz <tobias.lorenz@gmx.net>
2 //
3 // SPDX-License-Identifier: GPL-3.0-or-later
4 
5 #pragma once
6 
7 #include <Vector/BLF/platform.h>
8 
9 #include <atomic>
10 #include <fstream>
11 #include <thread>
12 
13 #include <Vector/BLF/CompressedFile.h>
14 #include <Vector/BLF/FileStatistics.h>
15 #include <Vector/BLF/ObjectHeaderBase.h>
16 #include <Vector/BLF/ObjectQueue.h>
17 #include <Vector/BLF/RestorePoints.h>
18 #include <Vector/BLF/UncompressedFile.h>
19 
20 // UNKNOWN = 0
21 #include <Vector/BLF/CanMessage.h> // CAN_MESSAGE = 1
22 #include <Vector/BLF/CanErrorFrame.h> // CAN_ERROR = 2
23 #include <Vector/BLF/CanOverloadFrame.h> // CAN_OVERLOAD = 3
24 #include <Vector/BLF/CanDriverStatistic.h> // CAN_STATISTIC = 4
25 #include <Vector/BLF/AppTrigger.h> // APP_TRIGGER = 5
26 #include <Vector/BLF/EnvironmentVariable.h> // ENV_INTEGER = 6
27 #include <Vector/BLF/EnvironmentVariable.h> // ENV_DOUBLE = 7
28 #include <Vector/BLF/EnvironmentVariable.h> // ENV_STRING = 8
29 #include <Vector/BLF/EnvironmentVariable.h> // ENV_DATA = 9
30 #include <Vector/BLF/LogContainer.h> // LOG_CONTAINER = 10
31 #include <Vector/BLF/LinMessage.h> // LIN_MESSAGE = 11
32 #include <Vector/BLF/LinCrcError.h> // LIN_CRC_ERROR = 12
33 #include <Vector/BLF/LinDlcInfo.h> // LIN_DLC_INFO = 13
34 #include <Vector/BLF/LinReceiveError.h> // LIN_RCV_ERROR = 14
35 #include <Vector/BLF/LinSendError.h> // LIN_SND_ERROR = 15
36 #include <Vector/BLF/LinSlaveTimeout.h> // LIN_SLV_TIMEOUT = 16
37 #include <Vector/BLF/LinSchedulerModeChange.h> // LIN_SCHED_MODCH = 17
38 #include <Vector/BLF/LinSyncError.h> // LIN_SYN_ERROR = 18
39 #include <Vector/BLF/LinBaudrateEvent.h> // LIN_BAUDRATE = 19
40 #include <Vector/BLF/LinSleepModeEvent.h> // LIN_SLEEP = 20
41 #include <Vector/BLF/LinWakeupEvent.h> // LIN_WAKEUP = 21
42 #include <Vector/BLF/MostSpy.h> // MOST_SPY = 22
43 #include <Vector/BLF/MostCtrl.h> // MOST_CTRL = 23
44 #include <Vector/BLF/MostLightLock.h> // MOST_LIGHTLOCK = 24
45 #include <Vector/BLF/MostStatistic.h> // MOST_STATISTIC = 25
46 // Reserved26 = 26
47 // Reserved27 = 27
48 // Reserved28 = 28
49 #include <Vector/BLF/FlexRayData.h> // FLEXRAY_DATA = 29
50 #include <Vector/BLF/FlexRaySync.h> // FLEXRAY_SYNC = 30
51 #include <Vector/BLF/CanDriverError.h> // CAN_DRIVER_ERROR = 31
52 #include <Vector/BLF/MostPkt.h> // MOST_PKT = 32
53 #include <Vector/BLF/MostPkt2.h> // MOST_PKT2 = 33
54 #include <Vector/BLF/MostHwMode.h> // MOST_HWMODE = 34
55 #include <Vector/BLF/MostReg.h> // MOST_REG = 35
56 #include <Vector/BLF/MostGenReg.h> // MOST_GENREG = 36
57 #include <Vector/BLF/MostNetState.h> // MOST_NETSTATE = 37
58 #include <Vector/BLF/MostDataLost.h> // MOST_DATALOST = 38
59 #include <Vector/BLF/MostTrigger.h> // MOST_TRIGGER = 39
60 #include <Vector/BLF/FlexRayV6StartCycleEvent.h> // FLEXRAY_CYCLE = 40
61 #include <Vector/BLF/FlexRayV6Message.h> // FLEXRAY_MESSAGE = 41
62 #include <Vector/BLF/LinChecksumInfo.h> // LIN_CHECKSUM_INFO = 42
63 #include <Vector/BLF/LinSpikeEvent.h> // LIN_SPIKE_EVENT = 43
64 #include <Vector/BLF/CanDriverHwSync.h> // CAN_DRIVER_SYNC = 44
65 #include <Vector/BLF/FlexRayStatusEvent.h> // FLEXRAY_STATUS = 45
66 #include <Vector/BLF/GpsEvent.h> // GPS_EVENT = 46
67 #include <Vector/BLF/FlexRayVFrError.h> // FR_ERROR = 47
68 #include <Vector/BLF/FlexRayVFrStatus.h> // FR_STATUS = 48
69 #include <Vector/BLF/FlexRayVFrStartCycle.h> // FR_STARTCYCLE = 49
70 #include <Vector/BLF/FlexRayVFrReceiveMsg.h> // FR_RCVMESSAGE = 50
71 #include <Vector/BLF/RealtimeClock.h> // REALTIMECLOCK = 51
72 // Reserved52 = 52
73 // Reserved53 = 53
74 #include <Vector/BLF/LinStatisticEvent.h> // LIN_STATISTIC = 54
75 #include <Vector/BLF/J1708Message.h> // J1708_MESSAGE = 55
76 #include <Vector/BLF/J1708Message.h> // J1708_VIRTUAL_MSG = 56
77 #include <Vector/BLF/LinMessage2.h> // LIN_MESSAGE2 = 57
78 #include <Vector/BLF/LinSendError2.h> // LIN_SND_ERROR2 = 58
79 #include <Vector/BLF/LinSyncError2.h> // LIN_SYN_ERROR2 = 59
80 #include <Vector/BLF/LinCrcError2.h> // LIN_CRC_ERROR2 = 60
81 #include <Vector/BLF/LinReceiveError2.h> // LIN_RCV_ERROR2 = 61
82 #include <Vector/BLF/LinWakeupEvent2.h> // LIN_WAKEUP2 = 62
83 #include <Vector/BLF/LinSpikeEvent2.h> // LIN_SPIKE_EVENT2 = 63
84 #include <Vector/BLF/LinLongDomSignalEvent.h> // LIN_LONG_DOM_SIG = 64
85 #include <Vector/BLF/AppText.h> // APP_TEXT = 65
86 #include <Vector/BLF/FlexRayVFrReceiveMsgEx.h> // FR_RCVMESSAGE_EX = 66
87 #include <Vector/BLF/MostStatisticEx.h> // MOST_STATISTICEX = 67
88 #include <Vector/BLF/MostTxLight.h> // MOST_TXLIGHT = 68
89 #include <Vector/BLF/MostAllocTab.h> // MOST_ALLOCTAB = 69
90 #include <Vector/BLF/MostStress.h> // MOST_STRESS = 70
91 #include <Vector/BLF/EthernetFrame.h> // ETHERNET_FRAME = 71
92 #include <Vector/BLF/SystemVariable.h> // SYS_VARIABLE = 72
93 #include <Vector/BLF/CanErrorFrameExt.h> // CAN_ERROR_EXT = 73
94 #include <Vector/BLF/CanDriverErrorExt.h> // CAN_DRIVER_ERROR_EXT = 74
95 #include <Vector/BLF/LinLongDomSignalEvent2.h> // LIN_LONG_DOM_SIG2 = 75
96 #include <Vector/BLF/Most150Message.h> // MOST_150_MESSAGE = 76
97 #include <Vector/BLF/Most150Pkt.h> // MOST_150_PKT = 77
98 #include <Vector/BLF/MostEthernetPkt.h> // MOST_ETHERNET_PKT = 78
99 #include <Vector/BLF/Most150MessageFragment.h> // MOST_150_MESSAGE_FRAGMENT = 79
100 #include <Vector/BLF/Most150PktFragment.h> // MOST_150_PKT_FRAGMENT = 80
101 #include <Vector/BLF/MostEthernetPktFragment.h> // MOST_ETHERNET_PKT_FRAGMENT = 81
102 #include <Vector/BLF/MostSystemEvent.h> // MOST_SYSTEM_EVENT = 82
103 #include <Vector/BLF/Most150AllocTab.h> // MOST_150_ALLOCTAB = 83
104 #include <Vector/BLF/Most50Message.h> // MOST_50_MESSAGE = 84
105 #include <Vector/BLF/Most50Pkt.h> // MOST_50_PKT = 85
106 #include <Vector/BLF/CanMessage2.h> // CAN_MESSAGE2 = 86
107 #include <Vector/BLF/LinUnexpectedWakeup.h> // LIN_UNEXPECTED_WAKEUP = 87
108 #include <Vector/BLF/LinShortOrSlowResponse.h> // LIN_SHORT_OR_SLOW_RESPONSE = 88
109 #include <Vector/BLF/LinDisturbanceEvent.h> // LIN_DISTURBANCE_EVENT = 89
110 #include <Vector/BLF/SerialEvent.h> // SERIAL_EVENT = 90
111 #include <Vector/BLF/DriverOverrun.h> // OVERRUN_ERROR = 91
112 #include <Vector/BLF/EventComment.h> // EVENT_COMMENT = 92
113 #include <Vector/BLF/WlanFrame.h> // WLAN_FRAME = 93
114 #include <Vector/BLF/WlanStatistic.h> // WLAN_STATISTIC = 94
115 #include <Vector/BLF/MostEcl.h> // MOST_ECL = 95
116 #include <Vector/BLF/GlobalMarker.h> // GLOBAL_MARKER = 96
117 #include <Vector/BLF/AfdxFrame.h> // AFDX_FRAME = 97
118 #include <Vector/BLF/AfdxStatistic.h> // AFDX_STATISTIC = 98
119 #include <Vector/BLF/KLineStatusEvent.h> // KLINE_STATUSEVENT = 99
120 #include <Vector/BLF/CanFdMessage.h> // CAN_FD_MESSAGE = 100
121 #include <Vector/BLF/CanFdMessage64.h> // CAN_FD_MESSAGE_64 = 101
122 #include <Vector/BLF/EthernetRxError.h> // ETHERNET_RX_ERROR = 102
123 #include <Vector/BLF/EthernetStatus.h> // ETHERNET_STATUS = 103
124 #include <Vector/BLF/CanFdErrorFrame64.h> // CAN_FD_ERROR_64 = 104
125 #include <Vector/BLF/LinShortOrSlowResponse2.h> // LIN_SHORT_OR_SLOW_RESPONSE2 = 105
126 #include <Vector/BLF/AfdxStatus.h> // AFDX_STATUS = 106
127 #include <Vector/BLF/AfdxBusStatistic.h> // AFDX_BUS_STATISTIC = 107
128 // Reserved108 = 108
129 #include <Vector/BLF/AfdxErrorEvent.h> // AFDX_ERROR_EVENT = 109
130 #include <Vector/BLF/A429Error.h> // A429_ERROR = 110
131 #include <Vector/BLF/A429Status.h> // A429_STATUS = 111
132 #include <Vector/BLF/A429BusStatistic.h> // A429_BUS_STATISTIC = 112
133 #include <Vector/BLF/A429Message.h> // A429_MESSAGE = 113
134 #include <Vector/BLF/EthernetStatistic.h> // ETHERNET_STATISTIC = 114
135 #include <Vector/BLF/RestorePointContainer.h> // Unknown115 = 115
136 // Reserved116 = 116
137 // Reserved117 = 117
138 #include <Vector/BLF/TestStructure.h> // TEST_STRUCTURE = 118
139 #include <Vector/BLF/DiagRequestInterpretation.h> // DIAG_REQUEST_INTERPRETATION = 119
140 #include <Vector/BLF/EthernetFrameEx.h> // ETHERNET_FRAME_EX = 120
141 #include <Vector/BLF/EthernetFrameForwarded.h> // ETHERNET_FRAME_FORWARDED = 121
142 #include <Vector/BLF/EthernetErrorEx.h> // ETHERNET_ERROR_EX = 122
143 #include <Vector/BLF/EthernetErrorForwarded.h> // ETHERNET_ERROR_FORWARDED = 123
144 #include <Vector/BLF/FunctionBus.h> // FUNCTION_BUS = 124
145 #include <Vector/BLF/DataLostBegin.h> // DATA_LOST_BEGIN = 125
146 #include <Vector/BLF/DataLostEnd.h> // DATA_LOST_END = 126
147 #include <Vector/BLF/WaterMarkEvent.h> // WATER_MARK_EVENT = 127
148 #include <Vector/BLF/TriggerCondition.h> // TRIGGER_CONDITION = 128
149 #include <Vector/BLF/CanSettingChanged.h> // CAN_SETTING_CHANGED = 129
150 #include <Vector/BLF/DistributedObjectMember.h> // DISTRIBUTED_OBJECT_MEMBER = 130
151 #include <Vector/BLF/AttributeEvent.h> // ATTRIBUTE_EVENT = 131
152 
153 #include <Vector/BLF/vector_blf_export.h>
154 
155 namespace Vector {
156 namespace BLF {
157 
163 class VECTOR_BLF_EXPORT File final {
164  public:
165  File();
166  virtual ~File();
167 
171  FileStatistics fileStatistics {};
172 
178  uint64_t currentUncompressedFileSize {};
179 
185  std::atomic<uint32_t> currentObjectCount {};
186 
200  int compressionLevel {1};
201 
205  bool writeRestorePoints {true};
206 
213  virtual void open(const char * filename, const std::ios_base::openmode mode = std::ios_base::in);
214 
221  virtual void open(const std::string & filename, const std::ios_base::openmode mode = std::ios_base::in);
222 
228  virtual bool is_open() const;
229 
235  virtual bool good() const;
236 
242  virtual bool eof() const;
243 
254  virtual ObjectHeaderBase * read();
255 
266  virtual void write(ObjectHeaderBase * ohb);
267 
271  virtual void close();
272 
278  virtual uint32_t defaultLogContainerSize() const;
279 
285  virtual void setDefaultLogContainerSize(uint32_t defaultLogContainerSize);
286 
293  static ObjectHeaderBase * createObject(ObjectType type);
294 
295  private:
299  std::ios_base::openmode m_openMode {};
300 
301  /* read/write queue */
302 
313  ObjectQueue<ObjectHeaderBase> m_readWriteQueue {};
314 
315  /* uncompressed file */
316 
324  UncompressedFile m_uncompressedFile {};
325 
329  std::thread m_uncompressedFileThread {};
330 
334  std::exception_ptr m_uncompressedFileThreadException {nullptr};
335 
339  std::atomic<bool> m_uncompressedFileThreadRunning {};
340 
341  /* compressed file */
342 
350  CompressedFile m_compressedFile {};
351 
355  std::thread m_compressedFileThread {};
356 
360  std::exception_ptr m_compressedFileThreadException {nullptr};
361 
365  std::atomic<bool> m_compressedFileThreadRunning {};
366 
367  /* internal functions */
368 
372  void uncompressedFile2ReadWriteQueue();
373 
377  void readWriteQueue2UncompressedFile();
378 
382  void compressedFile2UncompressedFile();
383 
387  void uncompressedFile2CompressedFile();
388 
392  static void uncompressedFileReadThread(File * file);
393 
397  static void uncompressedFileWriteThread(File * file);
398 
402  static void compressedFileReadThread(File * file);
403 
407  static void compressedFileWriteThread(File * file);
408 };
409 
410 }
411 }
Definition: File.h:163
Definition: FileStatistics.h:103
Base object header type definition.
Definition: ObjectHeaderBase.h:166