1
0
mirror of git://projects.qi-hardware.com/ben-wpan.git synced 2024-07-16 05:56:37 +03:00
ben-wpan/tools/atrf-path/gui.c
Werner Almesberger e2a9c9d068 atrf-path: new option -T to sweep only one offset
atrf-path -T +0.5 -g ... 10 10 time:

before (both offsets)	0.65 s
after (one offset)	0.32-0.33 s	(50%)

- atrf-path.c (usage, main): new option -T to specify which offset to
  sweep (default: sweep both)
- atrf-path.c (do_half_sweep): only sample points with the desired offset
- atrf-path.c (print_sweep): only prints points we've sweeped
- gui.c (segment, draw): inverted flag logic from "have_last" to "first"
- gui.c (draw): only plot points we've sweeped
- gui.c (gui): pass the offset selection to "draw"
2011-04-13 14:01:12 -03:00

167 lines
2.9 KiB
C

/*
* atrf-path/gui.c - Graphical output for atrf-path
*
* Written 2011 by Werner Almesberger
* Copyright 2011 Werner Almesberger
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include "SDL.h"
#include "SDL_gfxPrimitives.h"
#include "at86rf230.h"
#include "atrf.h"
#include "misctxrx.h"
#include "sweep.h"
#include "gui.h"
#define XRES 320
#define YRES 240
#define N_CHAN 16
#define FG_RGBA 0xffffffff /* measurement color */
#define OK_RGBA 0x00ff00ff
#define CHAN_STEP 20 /* 4 pixels/MHz */
#define SIDE_STEP 2
#define CHAN_X_OFFSET 10
#define Y_MIN -94
#define Y_MAX -10
#define STATUS_X (XRES-15)
#define STATUS_Y 15
#define STATUS_R 8
static void segment(SDL_Surface *s, int *last_x, int *last_y, int x,
const struct sample *res, int first)
{
int y = YRES-(res->avg-Y_MIN)/(Y_MAX-Y_MIN)*YRES-1;
if (!first) {
aalineColor(s, *last_x, *last_y, x, y, FG_RGBA);
}
*last_x = x;
*last_y = y;
}
static void draw(SDL_Surface *s, const struct sample *res, int cont_tx)
{
int last_x, last_y;
int first, x, i;
x = CHAN_X_OFFSET;
first = 1;
for (i = 0; i != N_CHAN; i++) {
if (cont_tx != CONT_TX_P500K) {
segment(s, &last_x, &last_y, x, res, first);
first = 0;
}
res++;
x += 2*SIDE_STEP;
if (cont_tx != CONT_TX_M500K) {
segment(s, &last_x, &last_y, x, res, first);
first = 0;
}
res++;
x += CHAN_STEP-2*SIDE_STEP;
}
}
static void clear(SDL_Surface *s)
{
SDL_FillRect(s, NULL, SDL_MapRGB(s->format, 0, 0, 0));
}
/* --- temporarily, for optimizing --- */
#include <sys/time.h>
static double t0;
static double t(void)
{
struct timeval tv;
gettimeofday(&tv, NULL);
return tv.tv_sec+tv.tv_usec/1000000.0;
}
static void tstart(void)
{
t0 = t();
}
static void tstop(void)
{
fprintf(stderr, "%.3f\n", t()-t0);
}
void gui(const struct sweep *sweep, int sweeps)
{
SDL_Surface *surf;
SDL_Event event;
int cycle = 0;
if (SDL_Init(SDL_INIT_VIDEO) < 0) {
fprintf(stderr, "SDL_init: %s\n", SDL_GetError());
exit(1);
}
atexit(SDL_Quit);
surf = SDL_SetVideoMode(XRES, YRES, 0, SDL_SWSURFACE);
if (!surf) {
fprintf(stderr, "SDL_SetVideoMode: %s\n", SDL_GetError());
exit(1);
}
while (cycle != sweeps || !sweeps) {
struct sample res[N_CHAN*2];
while (SDL_PollEvent(&event))
if (event.type == SDL_KEYDOWN ||
event.type == SDL_QUIT)
return;
tstart();
do_sweep(sweep, res);
tstop();
SDL_LockSurface(surf);
clear(surf);
if (cycle++ & 1) {
filledCircleColor(surf, STATUS_X, STATUS_Y, STATUS_R,
OK_RGBA);
aacircleColor(surf, STATUS_X, STATUS_Y, STATUS_R,
OK_RGBA);
}
draw(surf, res, sweep->cont_tx);
SDL_UnlockSurface(surf);
SDL_UpdateRect(surf, 0, 0, 0, 0);
}
}