因爲_offset_ns的存在,兩個時間體系的轉換沒有那麼簡單,不知offset是不是個常量,還是每次開機都會變化?開機也有可能變化?
void har::handle_sns_client_event(const sns_client_event_msg_sns_client_event& pb_event)
{
if (pb_event.msg_id() == SNS_HAR_MSGID_SNS_DATA) {
sns_std_sensor_event pb_stream_event;
pb_stream_event.ParseFromString(pb_event.payload());
sensors_event_t hal_event = create_sensor_hal_event(pb_event.timestamp());
hal_event.data[0] = pb_stream_event.data(0);
hal_event.data[1] = pb_stream_event.data(1);
submit_sensors_hal_event(hal_event);
sns_loge("har-sensor-hal: time=%lld data %f " , (long long)(hal_event.timestamp), hal_event.data[0]);
}
}
typedef struct _sns_client_event_msg_sns_client_event {
uint32_t msg_id;
uint64_t timestamp;
pb_callback_t payload;
/* @@protoc_insertion_point(struct:sns_client_event_msg_sns_client_event) */
} sns_client_event_msg_sns_client_event;
sensors_event_t ssc_sensor::create_sensor_hal_event(uint64_t ssc_timestamp)
{
sensors_event_t hal_event;
//Fix for static analysis error - uninitialized variable
memset(&hal_event, 0x00, sizeof(sensors_event_t));
hal_event.version = sizeof(sensors_event_t);
hal_event.sensor = get_sensor_info().handle;
hal_event.type = get_sensor_info().type;
hal_event.timestamp = sensors_timeutil::get_instance().
qtimer_ticks_to_elapsedRealtimeNano(ssc_timestamp);
sns_logv("ssc_ts = %llu tk, hal_ts = %lld ns, %lf",
(unsigned long long)ssc_timestamp,
(long long)hal_event.timestamp, hal_event.timestamp / 1000000000.0 );
return hal_event;
}
1 納秒 = 1000皮秒
1,000 納秒 = 1微秒 μs
1,000,000 納秒 = 1毫秒 ms
1,000,000,000 納秒 = 1秒 s
/**
* @brief convert qtimer timestamp (in ticks) to android
* timestamp (in ns)
* @param qtimer_ticks
* @return int64_t
*/
int64_t qtimer_ticks_to_elapsedRealtimeNano(uint64_t qtimer_ticks)
{
return qtimer_ns_to_elapsedRealtimeNano(qtimer_ticks_to_ns(qtimer_ticks));
}
/**
* @brief convert the qtimer tick value of nanoseconds
* @param ticks
* @return uint64_t qtimer time in nanoseconds
*/
uint64_t qtimer_ticks_to_ns(uint64_t ticks)
{
return uint64_t(double(ticks) * (double(NSEC_PER_SEC) / double(_qtimer_freq)));
}
/**
* @brief convert qtimer timestamp (in ns) to android system
* time (in ns)
* @param qtimer_ts
* @return int64_t
*/
int64_t qtimer_ns_to_elapsedRealtimeNano(uint64_t qtimer_ts)
{
int64_t realtime_ns = int64_t(qtimer_ts) + _offset_ns;
if (update_qtimer_to_realtime_offset(realtime_ns)) {
realtime_ns = int64_t(qtimer_ts) + _offset_ns;
}
return realtime_ns;
}
// 這裏有個offset
// For some unknown reason, the Android and QTimer timestamps used to
// calculate the _offset_ns only make sense if _offset_ns is a public
// variable. I suspect that our method for reading the QTimer value may
// have some unaccounted caveats.
// PEND: Make this variable private again once we fix the root-cause for
// the invalid QTimer values read during bootup
std::atomic<int64_t> _offset_ns;