MIRA
TapeRecorder.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2012 by
3  * MetraLabs GmbH (MLAB), GERMANY
4  * and
5  * Neuroinformatics and Cognitive Robotics Labs (NICR) at TU Ilmenau, GERMANY
6  * All rights reserved.
7  *
8  * Contact: info@mira-project.org
9  *
10  * Commercial Usage:
11  * Licensees holding valid commercial licenses may use this file in
12  * accordance with the commercial license agreement provided with the
13  * software or, alternatively, in accordance with the terms contained in
14  * a written agreement between you and MLAB or NICR.
15  *
16  * GNU General Public License Usage:
17  * Alternatively, this file may be used under the terms of the GNU
18  * General Public License version 3.0 as published by the Free Software
19  * Foundation and appearing in the file LICENSE.GPL3 included in the
20  * packaging of this file. Please review the following information to
21  * ensure the GNU General Public License version 3.0 requirements will be
22  * met: http://www.gnu.org/copyleft/gpl.html.
23  * Alternatively you may (at your option) use any later version of the GNU
24  * General Public License if such license has been publicly approved by
25  * MLAB and NICR (or its successors, if any).
26  *
27  * IN NO EVENT SHALL "MLAB" OR "NICR" BE LIABLE TO ANY PARTY FOR DIRECT,
28  * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF
29  * THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF "MLAB" OR
30  * "NICR" HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  * "MLAB" AND "NICR" SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING,
33  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
34  * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
35  * ON AN "AS IS" BASIS, AND "MLAB" AND "NICR" HAVE NO OBLIGATION TO
36  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR MODIFICATIONS.
37  */
38 
47 #ifndef _MIRA_TAPERECORDER_H_
48 #define _MIRA_TAPERECORDER_H_
49 
51 #include <fw/Framework.h>
52 #include <fw/Tape.h>
54 
55 namespace mira {
56 
58 
63 {
64 public:
65 
68  interval(Duration::microseconds(0)),
69  avoidDataLoss(false) {}
70 
71  template <typename Reflector>
72  void reflect(Reflector& r)
73  {
75  r.member("Codecs", codecs, "The codecs used for this channel",
76  std::list<BinarySerializerCodecPtr>());
77  if (v < 2) {
78  bool compress;
79  r.member("Compress", compress, "Should the data be stored compressed", false);
80  compressionLevel = (compress ? -1 : 0);
81  } else {
82  r.member("CompressionLevel", compressionLevel,
83  "Compression level (0=none, 1..9=best speed to best compression, -1=default)", 0);
84  }
85  r.member("Interval", interval, "Stores only data in that interval (if 0 stores all data)",
87  r.member("AvoidDataLoss", avoidDataLoss,
88  "Avoid data loss while recording this channel by reading all data from a channel since last recording",
89  false);
90  }
91 
92  std::list<BinarySerializerCodecPtr> codecs;
96 };
97 
99 typedef std::map<std::string, RecordedChannelInfo> RecordedChannelInfoMap;
100 
106 {
107 public:
108 
109  template <typename Reflector>
110  void reflect(Reflector& r)
111  {
112  r.member("Channels", channels, "The channels to be recorded");
113  r.member("MaxMessageBlockSize", maxMessageBlockSize,
114  "The maximum size of a message block in bytes",
115  64*1024*1024); // default size is 64MB
116  r.member("Filename", filename, "The filename for the output tape");
117  }
118 
122 };
128 {
129 public:
130 
133  {
134  public:
136  recordCounter(0) {}
142  };
143 
145  typedef std::map<std::string, ChannelInfo> ChannelMap;
146 
147 public:
158  TapeRecorder(const Duration& initialWaitForDataDuration = Duration::seconds(0));
159 
160  virtual ~TapeRecorder();
161 
162  template <typename Reflector>
163  void reflect(Reflector& r)
164  {
165  r.property("MaxMessageBlockSize", mMaxMessageBlockSize,
166  "The maximum size of a message block in bytes");
167  }
168 
180  MIRA_DEPRECATED("Please use int compressionLevel(=0/-1) instead of bool compress(=false/true)",
181  void addChannel(const std::string& channelID,
182  const std::list<BinarySerializerCodecPtr>& codecs,
183  bool compress, Duration interval = Duration::microseconds(0), bool avoidDataLoss = false))
184  {
185  addChannel(channelID, codecs, (compress ? -1 : 0), interval, avoidDataLoss);
186  }
187 
188 
201  void addChannel(const std::string& channelID,
202  const std::list<BinarySerializerCodecPtr>& codecs = std::list<BinarySerializerCodecPtr>(),
203  int compressionLevel = 0,
204  Duration interval = Duration::microseconds(0), bool avoidDataLoss = false);
205 
212  void addChannel(const std::string& channelID,
213  const RecordedChannelInfo& info);
214 
219  void record(const Path& file);
220 
226  void record(const TapeRecorderConfig& config);
227 
235  void stop(bool finishQueue = true);
236 
241  size_t storageQueueSize();
242 
252  void processStorageQueue(int numEntries = 1);
253 
258  void setMaxMessageBlockSize(uint32 maxMessageBlockSize)
259  {
260  mMaxMessageBlockSize = maxMessageBlockSize;
261  }
262 
266  bool isRecording() const
267  {
268  return mIsRecording;
269  }
270 
271  const PerformanceStatistics& getStats(const std::string& name);
272 
273 protected:
274 
275  // normal callback for data changes (writes data to tape)
276  void valueChanged(ChannelRead<void> value, bool forceStorage = false);
277  void intervalValueChanged(ChannelReadInterval<void> values, bool forceStorage = false);
278 
279 private:
280 
281  struct MessageToStore
282  {
283  StampedHeader header;
284  std::string channelID;
285  std::string typeName;
286  Time enqueueTime;
287  Buffer<uint8> buf;
288  ChannelInfo* info;
289  };
290 
291  void storageThread();
292  void storeMessage(MessageToStore& msg);
293 
294 protected:
295 
303 
304  boost::thread mStorageThread;
305  boost::condition_variable mStorageThreadCondition;
306  boost::mutex mStorageMutex;
308 
309  std::deque<MessageToStore> mStorageQueue;
311 };
312 
314 
315 }
316 
317 #endif
A tape is a binary file that contains recorded/serialized data of one or multiple channels...
Definition: Tape.h:142
RecordedChannelInfo()
Definition: TapeRecorder.h:66
Database that stores all meta type information and provides additional functions for accessing the da...
Definition: MetaSerializer.h:509
An object that allows read access to a whole interval of channel data.
Definition: ChannelReadInterval.h:72
Duration interval
Definition: TapeRecorder.h:94
A config that can be passed to the TapeRecorder which contains all settings that should be used for r...
Definition: TapeRecorder.h:105
Class for recording channel data to tape.
Definition: TapeRecorder.h:127
Authority mAuthority
Definition: TapeRecorder.h:296
boost::mutex mStorageMutex
Definition: TapeRecorder.h:306
PropertyHint file(const std::string &filters=std::string(), bool save=false)
Tells the property editor that the path is for a file, and that it should show a "File Open"/"File Sa...
Definition: Path.h:247
Path filename
Definition: TapeRecorder.h:121
A Tape is a representation of recorded channel data in a binary file.
specialize cv::DataType for our ImgPixel and inherit from cv::DataType<Vec>
Definition: IOService.h:67
boost::filesystem::path Path
Typedef of a Path (shorter version for boost::filesystem::path)
Definition: Path.h:69
MetaTypeDatabase metaDB
Definition: TapeRecorder.h:140
std::map< std::string, ChannelInfo > ChannelMap
Typedef for ChannelInfo pointers.
Definition: TapeRecorder.h:145
std::deque< MessageToStore > mStorageQueue
Definition: TapeRecorder.h:309
std::list< BinarySerializerCodecPtr > codecs
Definition: TapeRecorder.h:92
TypeMetaPtr meta
Definition: TapeRecorder.h:139
ChannelMap mChannels
Definition: TapeRecorder.h:301
ChannelInfo()
Definition: TapeRecorder.h:135
void setMaxMessageBlockSize(uint32 maxMessageBlockSize)
Set the maximum size of the chunks.
Definition: TapeRecorder.h:258
int compressionLevel
Definition: TapeRecorder.h:93
Provides MIRA_CLASS_SERIALIZATION macro and includes the major headers of the serialization framework...
An object that allows read access to data of a channel.
Definition: ChannelReadWrite.h:435
boost::condition_variable mStorageThreadCondition
Definition: TapeRecorder.h:305
uint8 VersionType
Definition: ReflectorInterface.h:72
bool mFirstCallbackMessage
Definition: TapeRecorder.h:300
Wrapper class for boost::posix_time::ptime for adding more functionality to it.
Definition: Time.h:421
uint32 maxMessageBlockSize
Definition: TapeRecorder.h:120
uint64 recordCounter
Definition: TapeRecorder.h:138
#define MIRA_FRAMEWORK_EXPORT
Definition: FrameworkExports.h:61
sec_type seconds() const
Returns normalized number of seconds (0..59)
Definition: Time.h:283
Use this class to represent time durations.
Definition: Time.h:104
The common header for all stamped data.
Definition: Stamped.h:62
Informations about a recorded channel.
Definition: TapeRecorder.h:132
boost::thread mStorageThread
Definition: TapeRecorder.h:304
RecordedChannelInfoMap channels
Definition: TapeRecorder.h:119
void reflect(Reflector &r)
Definition: TapeRecorder.h:163
Authorities act as a facade to the framework.
Definition: Authority.h:93
bool mStorageThreadStarted
Definition: TapeRecorder.h:307
Definition: PerformanceStatistics.h:57
uint32 mMaxMessageBlockSize
Definition: TapeRecorder.h:297
Gather statistics of the flow rate per second.
boost::shared_ptr< TypeMeta > TypeMetaPtr
Definition: MetaSerializer.h:309
volatile bool mStorageThreadTerminationRequest
Definition: TapeRecorder.h:310
tick_type microseconds() const
Returns normalized number of microseconds (0..999)
Definition: Time.h:293
Tape mTape
Definition: TapeRecorder.h:298
std::map< std::string, RecordedChannelInfo > RecordedChannelInfoMap
A map of recorded channel settings.
Definition: TapeRecorder.h:99
Contains all settings for a recorded channel like compression, codecs,...
Definition: TapeRecorder.h:62
bool isRecording() const
Returns whether TapeRecorder is currently gathering data after record was called. ...
Definition: TapeRecorder.h:266
Time expected
Definition: TapeRecorder.h:137
MIRA_DEPRECATED("Please use int compressionLevel(=0/-1) instead of bool compress(=false/true)", void addChannel(const std::string &channelID, const std::list< BinarySerializerCodecPtr > &codecs, bool compress, Duration interval=Duration::microseconds(0), bool avoidDataLoss=false))
Add a channel to the list of recorded channels.
Definition: TapeRecorder.h:180
Duration mInitialWaitForDataDuration
Definition: TapeRecorder.h:302
bool mIsRecording
Definition: TapeRecorder.h:299
#define MIRA_REFLECT_VERSION(reflector, versionNumber)
Macro that should be used to specify the (reflected) version of the class.
Definition: ReflectorInterface.h:918
void reflect(Reflector &r)
Definition: TapeRecorder.h:110
PerformanceStatistics stats
Definition: TapeRecorder.h:141
The framework that holds all manager classes and provides startup and shutdown of all framework relat...
Typename typeName(bool cvqualify=true)
Returns a compiler and platform independent typename of T.
Definition: Typename.h:103
bool avoidDataLoss
Definition: TapeRecorder.h:95
void reflect(Reflector &r)
Definition: TapeRecorder.h:72