Index: device/generic_sensor/public/cpp/sensor_reading.h |
diff --git a/device/generic_sensor/public/cpp/sensor_reading.h b/device/generic_sensor/public/cpp/sensor_reading.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..30c2e58fa4899c6f84ebcbfb2b4437ac109eb8c1 |
--- /dev/null |
+++ b/device/generic_sensor/public/cpp/sensor_reading.h |
@@ -0,0 +1,54 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef DEVICE_GENERIC_SENSOR_PUBLIC_CPP_SENSOR_READING_H_ |
+#define DEVICE_GENERIC_SENSOR_PUBLIC_CPP_SENSOR_READING_H_ |
+ |
+#include "device/base/synchronization/one_writer_seqlock.h" |
+ |
+namespace device { |
+ |
+// This class is guarantied to have a fixed size of 64 bits on every platform. |
+// It is introduce to simplify sensors shared buffer memory calculation. |
+template <typename Data> |
+class SensorReadingField { |
+ public: |
+ static_assert(sizeof(Data) <= sizeof(int64_t), "The field must be 64 bits."); |
Ken Rockot(use gerrit already)
2016/10/10 16:02:08
nit: Assertion is really that the field size must
Mikhail
2016/10/10 18:29:20
Done.
|
+ SensorReadingField() = default; |
+ SensorReadingField(Data value) { storage.value = value; } |
+ SensorReadingField& operator=(Data value) { |
+ storage.value = value; |
+ return *this; |
+ } |
+ Data& value() { return storage.value; } |
+ operator Data() const { return storage.value; } |
+ |
+ private: |
+ union Storage { |
+ int64_t unused; |
+ Data value; |
+ Storage() { new (&value) Data(); } |
Ken Rockot(use gerrit already)
2016/10/10 16:02:08
This is subtly broken if Data has a non-trivial de
Mikhail
2016/10/10 18:29:20
Done. Thanks for catching this!
|
+ }; |
+ Storage storage; |
+}; |
+ |
+// This structure represents sensor reading data: timestamp and 3 values. |
+struct SensorReading { |
+ SensorReading(); |
+ SensorReading(const SensorReading& other); |
+ SensorReadingField<double> timestamp; |
+ SensorReadingField<double> values[3]; |
+}; |
+ |
+// This structure represents sensor reading buffer: sensor reading and seqlock |
+// for synchronization. |
+struct SensorReadingSharedBuffer { |
+ SensorReadingSharedBuffer(); |
+ SensorReadingField<OneWriterSeqLock> seqlock; |
+ SensorReading reading; |
+}; |
+ |
+} // namespace device |
+ |
+#endif // DEVICE_GENERIC_SENSOR_PUBLIC_CPP_SENSOR_READING_H_ |