Add --stats-range
This commit is contained in:
parent
e7e9cecc1a
commit
656df98a76
|
@ -702,6 +702,7 @@ void showHelp(void) {
|
||||||
"--aggressive More CPU for more messages (two bits fixes, ...)\n"
|
"--aggressive More CPU for more messages (two bits fixes, ...)\n"
|
||||||
"--mlat display raw messages in Beast ascii mode\n"
|
"--mlat display raw messages in Beast ascii mode\n"
|
||||||
"--stats With --ifile print stats at exit. No other output\n"
|
"--stats With --ifile print stats at exit. No other output\n"
|
||||||
|
"--stats-range Collect/show range histogram\n"
|
||||||
"--stats-every <seconds> Show and reset stats every <seconds> seconds\n"
|
"--stats-every <seconds> Show and reset stats every <seconds> seconds\n"
|
||||||
"--onlyaddr Show only ICAO addresses (testing purposes)\n"
|
"--onlyaddr Show only ICAO addresses (testing purposes)\n"
|
||||||
"--metric Use metric units (meters, km/h, ...)\n"
|
"--metric Use metric units (meters, km/h, ...)\n"
|
||||||
|
@ -1032,6 +1033,8 @@ int main(int argc, char **argv) {
|
||||||
} else if (!strcmp(argv[j],"--stats")) {
|
} else if (!strcmp(argv[j],"--stats")) {
|
||||||
if (!Modes.stats)
|
if (!Modes.stats)
|
||||||
Modes.stats = (uint64_t)1 << 60; // "never"
|
Modes.stats = (uint64_t)1 << 60; // "never"
|
||||||
|
} else if (!strcmp(argv[j],"--stats-range")) {
|
||||||
|
Modes.stats_range_histo = 1;
|
||||||
} else if (!strcmp(argv[j],"--stats-every") && more) {
|
} else if (!strcmp(argv[j],"--stats-every") && more) {
|
||||||
Modes.stats = (uint64_t) (1000 * atof(argv[++j]));
|
Modes.stats = (uint64_t) (1000 * atof(argv[++j]));
|
||||||
} else if (!strcmp(argv[j],"--snip") && more) {
|
} else if (!strcmp(argv[j],"--snip") && more) {
|
||||||
|
|
|
@ -332,6 +332,7 @@ struct { // Internal state
|
||||||
int interactive_rows; // Interactive mode: max number of rows
|
int interactive_rows; // Interactive mode: max number of rows
|
||||||
uint64_t interactive_display_ttl;// Interactive mode: TTL display
|
uint64_t interactive_display_ttl;// Interactive mode: TTL display
|
||||||
uint64_t stats; // Interval (millis) between stats dumps,
|
uint64_t stats; // Interval (millis) between stats dumps,
|
||||||
|
int stats_range_histo; // Collect/show a range histogram?
|
||||||
int onlyaddr; // Print only ICAO addresses
|
int onlyaddr; // Print only ICAO addresses
|
||||||
int metric; // Use metric units
|
int metric; // Use metric units
|
||||||
int mlat; // Use Beast ascii format for raw data output, i.e. @...; iso *...;
|
int mlat; // Use Beast ascii format for raw data output, i.e. @...; iso *...;
|
||||||
|
|
76
stats.c
76
stats.c
|
@ -57,6 +57,8 @@ void add_timespecs(const struct timespec *x, const struct timespec *y, struct ti
|
||||||
z->tv_nsec = z->tv_nsec % 1000000000L;
|
z->tv_nsec = z->tv_nsec % 1000000000L;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void display_range_histogram(struct stats *st);
|
||||||
|
|
||||||
void display_stats(struct stats *st) {
|
void display_stats(struct stats *st) {
|
||||||
int j;
|
int j;
|
||||||
time_t tt_start, tt_end;
|
time_t tt_start, tt_end;
|
||||||
|
@ -172,10 +174,79 @@ void display_stats(struct stats *st) {
|
||||||
(unsigned long long) background_cpu_millis);
|
(unsigned long long) background_cpu_millis);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Modes.stats_range_histo)
|
||||||
|
display_range_histogram(st);
|
||||||
|
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void display_range_histogram(struct stats *st)
|
||||||
|
{
|
||||||
|
uint32_t peak;
|
||||||
|
int i, j;
|
||||||
|
int heights[RANGE_BUCKET_COUNT];
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
#define NPIXELS 4
|
||||||
|
char *pixels[NPIXELS] = { ".", "o", "O", "|" };
|
||||||
|
#else
|
||||||
|
// UTF-8 bar symbols
|
||||||
|
#define NPIXELS 8
|
||||||
|
char *pixels[NPIXELS] = {
|
||||||
|
"\xE2\x96\x81",
|
||||||
|
"\xE2\x96\x82",
|
||||||
|
"\xE2\x96\x83",
|
||||||
|
"\xE2\x96\x84",
|
||||||
|
"\xE2\x96\x85",
|
||||||
|
"\xE2\x96\x86",
|
||||||
|
"\xE2\x96\x87",
|
||||||
|
"\xE2\x96\x88"
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
printf ("Range histogram:\n\n");
|
||||||
|
|
||||||
|
for (i = 0, peak = 0; i < RANGE_BUCKET_COUNT; ++i) {
|
||||||
|
if (st->range_histogram[i] > peak)
|
||||||
|
peak = st->range_histogram[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < RANGE_BUCKET_COUNT; ++i) {
|
||||||
|
heights[i] = st->range_histogram[i] * 20.0 * NPIXELS / peak;
|
||||||
|
if (st->range_histogram[i] > 0 && heights[i] == 0)
|
||||||
|
heights[i] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (j = 0; j < 20; ++j) {
|
||||||
|
for (i = 0; i < RANGE_BUCKET_COUNT; ++i) {
|
||||||
|
int pheight = heights[i] - ((19 - j) * NPIXELS);
|
||||||
|
if (pheight <= 0)
|
||||||
|
printf(" ");
|
||||||
|
else if (pheight >= NPIXELS)
|
||||||
|
printf("%s", pixels[NPIXELS-1]);
|
||||||
|
else
|
||||||
|
printf("%s", pixels[pheight]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < RANGE_BUCKET_COUNT/4; ++i) {
|
||||||
|
printf("----");
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
for (i = 0; i < RANGE_BUCKET_COUNT/4; ++i) {
|
||||||
|
printf(" ' ");
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
for (i = 0; i < RANGE_BUCKET_COUNT/4; ++i) {
|
||||||
|
int midpoint = round((i*4+1.5) * Modes.maxRange / RANGE_BUCKET_COUNT / 1000);
|
||||||
|
printf("%03d ", midpoint);
|
||||||
|
}
|
||||||
|
printf("km\n");
|
||||||
|
}
|
||||||
|
|
||||||
void reset_stats(struct stats *st) {
|
void reset_stats(struct stats *st) {
|
||||||
static struct stats st_zero;
|
static struct stats st_zero;
|
||||||
*st = st_zero;
|
*st = st_zero;
|
||||||
|
@ -259,5 +330,8 @@ void add_stats(const struct stats *st1, const struct stats *st2, struct stats *t
|
||||||
// aircraft
|
// aircraft
|
||||||
target->unique_aircraft = st1->unique_aircraft + st2->unique_aircraft;
|
target->unique_aircraft = st1->unique_aircraft + st2->unique_aircraft;
|
||||||
target->single_message_aircraft = st1->single_message_aircraft + st2->single_message_aircraft;
|
target->single_message_aircraft = st1->single_message_aircraft + st2->single_message_aircraft;
|
||||||
}
|
|
||||||
|
|
||||||
|
// range histogram
|
||||||
|
for (i = 0; i < RANGE_BUCKET_COUNT; ++i)
|
||||||
|
target->range_histogram[i] = st1->range_histogram[i] + st2->range_histogram[i];
|
||||||
|
}
|
||||||
|
|
4
stats.h
4
stats.h
|
@ -119,6 +119,10 @@ struct stats {
|
||||||
unsigned int unique_aircraft;
|
unsigned int unique_aircraft;
|
||||||
// we saw only a single message
|
// we saw only a single message
|
||||||
unsigned int single_message_aircraft;
|
unsigned int single_message_aircraft;
|
||||||
|
|
||||||
|
// range histogram
|
||||||
|
#define RANGE_BUCKET_COUNT 76
|
||||||
|
uint32_t range_histogram[RANGE_BUCKET_COUNT];
|
||||||
};
|
};
|
||||||
|
|
||||||
void add_stats(const struct stats *st1, const struct stats *st2, struct stats *target);
|
void add_stats(const struct stats *st1, const struct stats *st2, struct stats *target);
|
||||||
|
|
16
track.c
16
track.c
|
@ -128,6 +128,21 @@ static double greatcircle(double lat0, double lon0, double lat1, double lon1)
|
||||||
return 6371e3 * acos(sin(lat0) * sin(lat1) + cos(lat0) * cos(lat1) * cos(fabs(lon0 - lon1)));
|
return 6371e3 * acos(sin(lat0) * sin(lat1) + cos(lat0) * cos(lat1) * cos(fabs(lon0 - lon1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void update_range_histogram(double lat, double lon)
|
||||||
|
{
|
||||||
|
if (Modes.stats_range_histo && (Modes.bUserFlags & MODES_USER_LATLON_VALID)) {
|
||||||
|
double range = greatcircle(Modes.fUserLat, Modes.fUserLon, lat, lon);
|
||||||
|
int bucket = round(range / Modes.maxRange * RANGE_BUCKET_COUNT);
|
||||||
|
|
||||||
|
if (bucket < 0)
|
||||||
|
bucket = 0;
|
||||||
|
else if (bucket >= RANGE_BUCKET_COUNT)
|
||||||
|
bucket = RANGE_BUCKET_COUNT-1;
|
||||||
|
|
||||||
|
++Modes.stats_current.range_histogram[bucket];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// return true if it's OK for the aircraft to have travelled from its last known position
|
// return true if it's OK for the aircraft to have travelled from its last known position
|
||||||
// to a new position at (lat,lon,surface) at a time of now.
|
// to a new position at (lat,lon,surface) at a time of now.
|
||||||
static int speed_check(struct aircraft *a, struct modesMessage *mm, double lat, double lon, uint64_t now, int surface)
|
static int speed_check(struct aircraft *a, struct modesMessage *mm, double lat, double lon, uint64_t now, int surface)
|
||||||
|
@ -416,6 +431,7 @@ static void updatePosition(struct aircraft *a, struct modesMessage *mm, uint64_t
|
||||||
a->pos_nuc = new_nuc;
|
a->pos_nuc = new_nuc;
|
||||||
a->seenLatLon = a->seen;
|
a->seenLatLon = a->seen;
|
||||||
|
|
||||||
|
update_range_histogram(new_lat, new_lon);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue