1
0
mirror of git://projects.qi-hardware.com/ben-wpan.git synced 2024-11-26 04:56:16 +02:00

atrf-path: added visual history of dumps

- gui.c (segment, draw, gui): make caller provide color, to ease sharing
- gui.c (dump, gui): moved call to print_sweep to separate function
- gui.c (DUMP_RGBA, dumps, n_dumps, dump, draw_dumps, gui): record all
  dumps and display them in the background
This commit is contained in:
Werner Almesberger 2011-05-28 12:21:56 -03:00
parent b82472bb01
commit 0eec747510

View File

@ -14,6 +14,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
#include <string.h>
#include "SDL.h" #include "SDL.h"
#include "SDL_gfxPrimitives.h" #include "SDL_gfxPrimitives.h"
@ -34,6 +35,7 @@
#define OVER_RGBA 0xffff00ff #define OVER_RGBA 0xffff00ff
#define UNDER_RGBA 0xff0000ff #define UNDER_RGBA 0xff0000ff
#define LIMIT_RGBA 0xff0000ff #define LIMIT_RGBA 0xff0000ff
#define DUMP_RGBA 0x4040ffff
#define CHAN_STEP 20 /* 4 pixels/MHz */ #define CHAN_STEP 20 /* 4 pixels/MHz */
#define SIDE_STEP 2 #define SIDE_STEP 2
@ -46,6 +48,10 @@
#define STATUS_R 8 #define STATUS_R 8
static struct sample **dumps = NULL;
static int n_dumps = 0;
static int avg2y(double avg) static int avg2y(double avg)
{ {
return YRES-(avg-Y_MIN)/(Y_MAX-Y_MIN)*YRES-1; return YRES-(avg-Y_MIN)/(Y_MAX-Y_MIN)*YRES-1;
@ -53,19 +59,20 @@ static int avg2y(double avg)
static void segment(SDL_Surface *s, int *last_x, int *last_y, int x, static void segment(SDL_Surface *s, int *last_x, int *last_y, int x,
const struct sample *res, int first) const struct sample *res, int first, uint32_t color)
{ {
int y = avg2y(res->avg); int y = avg2y(res->avg);
if (!first) { if (!first) {
aalineColor(s, *last_x, *last_y, x, y, FG_RGBA); aalineColor(s, *last_x, *last_y, x, y, color);
} }
*last_x = x; *last_x = x;
*last_y = y; *last_y = y;
} }
static void draw(SDL_Surface *s, const struct sample *res, int cont_tx) static void draw(SDL_Surface *s, const struct sample *res, int cont_tx,
uint32_t color)
{ {
int last_x, last_y; int last_x, last_y;
int first, x, i; int first, x, i;
@ -74,14 +81,14 @@ static void draw(SDL_Surface *s, const struct sample *res, int cont_tx)
first = 1; first = 1;
for (i = 0; i != N_CHAN; i++) { for (i = 0; i != N_CHAN; i++) {
if (cont_tx != CONT_TX_P500K) { if (cont_tx != CONT_TX_P500K) {
segment(s, &last_x, &last_y, x, res, first); segment(s, &last_x, &last_y, x, res, first, color);
first = 0; first = 0;
} }
res++; res++;
x += 2*SIDE_STEP; x += 2*SIDE_STEP;
if (cont_tx != CONT_TX_M500K) { if (cont_tx != CONT_TX_M500K) {
segment(s, &last_x, &last_y, x, res, first); segment(s, &last_x, &last_y, x, res, first, color);
first = 0; first = 0;
} }
res++; res++;
@ -176,6 +183,36 @@ static void clear(SDL_Surface *s)
} }
static void dump(const struct sweep *sweep, const struct sample *res)
{
const size_t size = sizeof(struct sample)*N_CHAN*2;
print_sweep(sweep, res);
dumps = realloc(dumps, (n_dumps+1)*sizeof(struct sample *));
if (!dumps) {
perror("realloc");
exit(1);
}
dumps[n_dumps] = malloc(size);
if (!dumps[n_dumps]) {
perror("malloc");
exit(1);
}
memcpy(dumps[n_dumps], res, size);
n_dumps++;
}
static void draw_dumps(SDL_Surface *s, int cont_tx)
{
int i;
for (i = 0; i != n_dumps; i++)
draw(s, dumps[i], cont_tx, DUMP_RGBA);
}
/* --- temporarily, for optimizing --- */ /* --- temporarily, for optimizing --- */
#if 0 #if 0
@ -263,7 +300,7 @@ int gui(const struct sweep *sweep, int sweeps)
break; break;
case SDLK_d: case SDLK_d:
if (cycle) if (cycle)
print_sweep(sweep, res); dump(sweep, res);
break; break;
case SDLK_q: case SDLK_q:
return 0; return 0;
@ -285,10 +322,11 @@ int gui(const struct sweep *sweep, int sweeps)
clear(surf); clear(surf);
draw_dumps(surf, sweep->cont_tx);
draw_limit(surf, sweep->min); draw_limit(surf, sweep->min);
draw_limit(surf, sweep->max); draw_limit(surf, sweep->max);
indicate(surf, fail); indicate(surf, fail);
draw(surf, res, sweep->cont_tx); draw(surf, res, sweep->cont_tx, FG_RGBA);
SDL_UnlockSurface(surf); SDL_UnlockSurface(surf);
SDL_UpdateRect(surf, 0, 0, 0, 0); SDL_UpdateRect(surf, 0, 0, 0, 0);