Android: sensor 時間戳從sensor子系統到AP android層的變化

因爲_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;
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章