| #ifndef THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_SHARED_MEM_SENSORS_H_ |
| #define THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_SHARED_MEM_SENSORS_H_ |
| |
| #include <atomic> |
| #include <chrono> // NOLINT |
| #include <cstdint> |
| #include <limits> |
| #include <utility> |
| |
| namespace milotic_tlbmc { |
| |
| class IpcSensor { |
| public: |
| IpcSensor() : value_(std::numeric_limits<float>::infinity()), timestamp_(0) { |
| static_assert(std::atomic<float>::is_always_lock_free); |
| static_assert(std::atomic<uint64_t>::is_always_lock_free); |
| } |
| std::pair<float, uint64_t> GetValue() const { return {value_, timestamp_}; } |
| void SetValue(float value) { |
| value_ = value; |
| timestamp_ = static_cast<uint64_t>( |
| std::chrono::duration_cast<std::chrono::milliseconds>( |
| std::chrono::system_clock::now().time_since_epoch()) |
| .count()); |
| } |
| void SetValue(float value, uint64_t timestamp) { |
| value_ = value; |
| timestamp_ = timestamp; |
| } |
| |
| private: |
| // Our application does not need strong consistency but collect time serials |
| // data. It's fine that timestamp is not updated atomically with the value. |
| std::atomic<float> value_; |
| // The timestamp is in milliseconds. |
| std::atomic<uint64_t> timestamp_; |
| }; |
| |
| } // namespace milotic_tlbmc |
| |
| #endif // THIRD_PARTY_MILOTIC_EXTERNAL_CC_TLBMC_HAL_SHARED_MEM_SENSORS_H_ |