1 /*
2 * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6 #include "chart/BigtimeChartAxisLegendSource.h"
7
8 #include <stdio.h>
9
10 #include "chart/ChartDataRange.h"
11 #include "chart/StringChartLegend.h"
12 #include "util/TimeUtils.h"
13
14
15 int32
GetAxisLegends(const ChartDataRange & range,ChartLegend ** legends,double * values,int32 maxLegends)16 BigtimeChartAxisLegendSource::GetAxisLegends(const ChartDataRange& range,
17 ChartLegend** legends, double* values, int32 maxLegends)
18 {
19 // interpret range as time range
20 bigtime_t startTime = (bigtime_t)range.min;
21 bigtime_t endTime = (bigtime_t)range.max;
22 // TODO: Handle sub-microsecs ranges!
23 if (startTime >= endTime)
24 return 0;
25
26 bigtime_t positionFactors[4];
27 positionFactors[3] = 1;
28 positionFactors[2] = 1000000;
29 positionFactors[1] = positionFactors[2] * 60;
30 positionFactors[0] = positionFactors[1] * 60;
31
32 // find the main position (h, m, s, us) we want to play with
33 int32 position = 0;
34 bigtime_t rangeTime = endTime - startTime;
35 while (rangeTime / positionFactors[position] + 1 < maxLegends / 2
36 && position < 3) {
37 position++;
38 }
39
40 // adjust the factor so that we get maxLegends / 2 to maxLegends legends
41 bigtime_t baseInterval = positionFactors[position];
42 bigtime_t relativeFactor = 1;
43 while (rangeTime / (baseInterval * relativeFactor) >= maxLegends) {
44 if (relativeFactor == 1) {
45 relativeFactor = 2;
46 } else if (relativeFactor == 2) {
47 relativeFactor = 5;
48 } else if (relativeFactor == 5) {
49 baseInterval *= 10;
50 relativeFactor = 1;
51 }
52 }
53
54 // generate the legends
55 int32 count = 0;
56 bigtime_t interval = baseInterval * relativeFactor;
57 bigtime_t time = (startTime + interval - 1) / interval * interval;
58 for (; time <= endTime; time += interval) {
59 decomposed_bigtime decomposed;
60 decompose_time(time, decomposed);
61 char buffer[128];
62 snprintf(buffer, sizeof(buffer), "%02" B_PRIu64 ":%02d:%02d.%06d",
63 decomposed.hours, decomposed.minutes, decomposed.seconds,
64 decomposed.micros);
65 // TODO: Drop superfluous micro seconds digits, or even microseconds and seconds
66 // completely.
67
68 StringChartLegend* legend
69 = new(std::nothrow) StringChartLegend(buffer, 1);
70 if (legend == NULL)
71 return count;
72
73 legends[count] = legend;
74 values[count++] = (double)time;
75 }
76
77 return count;
78 }
79