aboutsummaryrefslogtreecommitdiffstats
path: root/LibOVR/Src/Util/Util_DataLogger.h
diff options
context:
space:
mode:
Diffstat (limited to 'LibOVR/Src/Util/Util_DataLogger.h')
-rw-r--r--LibOVR/Src/Util/Util_DataLogger.h168
1 files changed, 168 insertions, 0 deletions
diff --git a/LibOVR/Src/Util/Util_DataLogger.h b/LibOVR/Src/Util/Util_DataLogger.h
new file mode 100644
index 0000000..e21c9f2
--- /dev/null
+++ b/LibOVR/Src/Util/Util_DataLogger.h
@@ -0,0 +1,168 @@
+/************************************************************************************
+
+Filename : Util_DataLogger.h
+Content : General purpose data logging to Matlab
+Created : Oct 3, 2014
+Authors : Neil Konzen
+
+Copyright : Copyright 2014 Oculus VR, Inc. All Rights reserved.
+
+Licensed under the Oculus VR Rift SDK License Version 3.2 (the "License");
+you may not use the Oculus VR Rift SDK except in compliance with the License,
+which is provided at the time of installation or download, or which
+otherwise accompanies this software in either electronic or hard copy form.
+
+You may obtain a copy of the License at
+
+http://www.oculusvr.com/licenses/LICENSE-3.2
+
+Unless required by applicable law or agreed to in writing, the Oculus VR SDK
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+*************************************************************************************/
+
+#ifndef OVR_Util_DataLogger_h
+#define OVR_Util_DataLogger_h
+
+#include "Kernel/OVR_Array.h"
+#include "Kernel/OVR_String.h"
+#include "Util_MatFile.h"
+
+#ifndef OVR_ENABLE_DATALOGGER
+#define OVR_ENABLE_DATALOGGER 1
+#endif
+
+namespace OVR {
+
+template<typename T> class Vector3;
+template<typename T> class Quat;
+template<typename T> class Pose;
+
+namespace Util {
+
+#if OVR_ENABLE_DATALOGGER
+
+class DataLogger;
+
+
+// DataLogger Channel
+class DataLoggerChannel
+{
+public:
+ void Log(const void* data, int sampleSize);
+
+ bool IsLogging() const;
+ bool IsFull() const;
+
+ // Logging functions for some common types
+ template<typename T>
+ void Log(const Quat<T>& q);
+
+ template<typename T>
+ void Log(const Vector3<T>& v);
+
+ template<typename T>
+ void Log(const Pose<T>& p);
+
+private:
+ friend class DataLogger;
+
+ DataLoggerChannel(DataLogger* logger, const char* name, int sampleSize, int sampleRate, bool doubleMatrix);
+ ~DataLoggerChannel();
+
+ bool Write(MatFile& matfile);
+
+private:
+ DataLogger* Logger;
+ String Name;
+ int SampleSize;
+ int SampleRate;
+ int SampleCount;
+ int MaxSampleCount;
+ bool DoubleMatrix;
+ uint8_t* SampleData;
+};
+
+// DataLogger class
+class DataLogger
+{
+public:
+ DataLogger();
+ ~DataLogger();
+
+ // Parses C command line parameters "-log <objectIndex> <matFileName> <logTime>"
+ static bool ParseCommandLine(int* pargc, const char** pargv[], int& logIndex, String& logFile, double& logTime);
+
+ void SetLogFile(const char* filename, double logTime);
+ bool SaveLogFile();
+
+ bool IsLogging() const { return LogTime > 0; }
+
+ DataLoggerChannel* GetChannel(const char* name);
+ DataLoggerChannel* CreateChannel(const char* name, int sampleSize, int sampleRate, bool doubleMatrix = true);
+
+ void Log(const char* name, const void* data, int sampleSize, int sampleRate, bool doubleMatrix = true)
+ {
+ DataLoggerChannel *channel = CreateChannel(name, sampleSize, sampleRate, doubleMatrix);
+ if (channel) channel->Log(data, sampleSize);
+ }
+
+private:
+ friend class DataLoggerChannel;
+
+ DataLoggerChannel* GetChannelNoLock(const char* name);
+
+ Lock TheLock;
+ double LogTime;
+ String Filename;
+ ArrayPOD<DataLoggerChannel*> Channels;
+};
+
+#else // OVR_ENABLE_DATALOGGER
+
+// Disabled, no-op implementation
+class DataLoggerChannel
+{
+public:
+ OVR_FORCE_INLINE void Log(const void* data, int sampleSize) { OVR_UNUSED2(data, sampleSize); }
+
+ OVR_FORCE_INLINE bool IsLogging() const { return false; }
+ OVR_FORCE_INLINE bool IsFull() const { return false; }
+
+ template<typename T>
+ OVR_FORCE_INLINE void Log(const Quat<T>& q) { OVR_UNUSED(q); }
+
+ template<typename T>
+ OVR_FORCE_INLINE void Log(const Vector3<T>& v) { OVR_UNUSED(v); }
+
+ template<typename T>
+ OVR_FORCE_INLINE void Log(const Pose<T>& p) { OVR_UNUSED(p); }
+};
+
+class DataLogger
+{
+public:
+ static bool ParseCommandLine(int* pargc, const char** pargv[], int& logIndex, String& logFile, double& logTime) { OVR_UNUSED5(pargc, pargv, logIndex, logFile, logTime); return false; }
+
+ OVR_FORCE_INLINE void SetLogFile(const char* filename, double logTime) { OVR_UNUSED2(filename, logTime); }
+ OVR_FORCE_INLINE bool SaveLogFile() { return true; }
+
+ OVR_FORCE_INLINE bool IsLogging() const { return false; }
+
+ OVR_FORCE_INLINE DataLoggerChannel* GetChannel(const char* name) { OVR_UNUSED(name); return &NullChannel; }
+ OVR_FORCE_INLINE DataLoggerChannel* CreateChannel(const char* name, int sampleSize, int sampleRate) { OVR_UNUSED3(name, sampleSize, sampleRate); return &NullChannel; }
+
+private:
+ friend class DataLoggerChannel;
+ static DataLoggerChannel NullChannel;
+};
+
+#endif // OVR_ENABLE_DATALOGGER
+
+
+}} // namespace OVR::Util
+
+#endif // OVR_Util_DataLogger_h