| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * 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. |
| */ |
| package com.android.tools.chartlib; |
| |
| import com.android.annotations.VisibleForTesting; |
| import com.android.annotations.concurrency.GuardedBy; |
| |
| import java.util.List; |
| |
| /** |
| * A group of streams of data sampled over time. This object is thread safe as it can be |
| * read/modified from any thread. It uses itself as the mutex object so it is possible to |
| * synchronize on it if modifications from other threads want to be prevented. |
| */ |
| public class TimelineData { |
| |
| private final int myStreams; |
| |
| @GuardedBy("this") |
| private final List<Sample> mSamples; |
| |
| @GuardedBy("this") |
| private long mStart; |
| |
| @GuardedBy("this") |
| private float mMaxTotal; |
| |
| public TimelineData(int streams, int capacity) { |
| myStreams = streams; |
| mSamples = new CircularArrayList<Sample>(capacity); |
| clear(); |
| } |
| |
| @VisibleForTesting |
| public synchronized long getStartTime() { |
| return mStart; |
| } |
| |
| public int getStreamCount() { |
| return myStreams; |
| } |
| |
| public synchronized float getMaxTotal() { |
| return mMaxTotal; |
| } |
| |
| public synchronized void add(long time, int type, float... values) { |
| assert values.length == myStreams; |
| float total = 0.0f; |
| for (float value : values) { |
| total += value; |
| } |
| mMaxTotal = Math.max(mMaxTotal, total); |
| mSamples.add(new Sample((time - mStart) / 1000.0f, type, values)); |
| } |
| |
| public synchronized void clear() { |
| mSamples.clear(); |
| mMaxTotal = 0.0f; |
| mStart = System.currentTimeMillis(); |
| } |
| |
| public int size() { |
| return mSamples.size(); |
| } |
| |
| public Sample get(int index) { |
| return mSamples.get(index); |
| } |
| |
| public boolean isEmpty() { |
| return size() == 0; |
| } |
| |
| public synchronized float getEndTime() { |
| return (mSamples.isEmpty() ? 0.0f : (System.currentTimeMillis() - mStart)) / 1000.f; |
| } |
| |
| /** |
| * A sample of all the streams at a given moment in time. |
| */ |
| public static class Sample { |
| |
| /** |
| * The time of the sample. In seconds since the start of the sampling. |
| */ |
| public final float time; |
| |
| public final float[] values; |
| |
| public final int type; |
| |
| public Sample(float time, int type, float[] values) { |
| this.time = time; |
| this.values = values; |
| this.type = type; |
| } |
| } |
| } |