1
0
mirror of git://projects.qi-hardware.com/ben-wpan.git synced 2024-11-29 11:11:53 +02:00

tools/atrf-rssi/: added WLAN channel display (US, EU, and JP)

- gui.c (wlan_area): the currently displayed regulation domain
- gui.c (wlan_channels): return the number of WLAN channels
- gui.c (show_wlan_channel): determine whether the specified channel
  should be used in the currently displayed regulation domain
- gui.c (label_wlan_channels): show WLAN channel numbers and their
  width
- gui.c (gui): switch regulation domain with E (Europe), J (Japan),
  and U (US)
- gui.c (gui): quit now only if Q is pressed instead of any key
- gui.c (gui): call label_wlan_channels to display the WLAN channels
This commit is contained in:
Werner Almesberger 2011-06-24 21:50:28 -03:00
parent 7c12bf02c1
commit 9af0f937de

View File

@ -1,8 +1,8 @@
/* /*
* atrf-rssi/gui.c - Graphical output for atrf-rssi * atrf-rssi/gui.c - Graphical output for atrf-rssi
* *
* Written 2010 by Werner Almesberger * Written 2010-2011 by Werner Almesberger
* Copyright 2010 Werner Almesberger * Copyright 2010-2011 Werner Almesberger
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@ -40,6 +40,8 @@
#define BG_RGBA 0x00408080 /* grid background color */ #define BG_RGBA 0x00408080 /* grid background color */
#define CHAN_RGBA 0xff4040ff /* channel number color */ #define CHAN_RGBA 0xff4040ff /* channel number color */
#define FREQ_RGBA 0x20ff00ff /* frequency color */ #define FREQ_RGBA 0x20ff00ff /* frequency color */
#define WCHAN_RGBA 0xffff00e0 /* WLAN channel number color */
#define WLAN_RGBA 0x8080ffff /* WLAN channel occupancy color */
#define X_STEP 17 /* grid x step */ #define X_STEP 17 /* grid x step */
#define Y_STEP 2 /* grid y step */ #define Y_STEP 2 /* grid y step */
@ -48,6 +50,19 @@
#define X_OFFSET 7 /* x coordinate of lower left grid corner */ #define X_OFFSET 7 /* x coordinate of lower left grid corner */
#define Y_OFFSET 40 /* y coordinate of lower left grid corner */ #define Y_OFFSET 40 /* y coordinate of lower left grid corner */
#define X_WLAN_OFFSET 31
#define Y_WLAN_OFFSET 15
#define WLAN_XR (X_STEP*9.5/5)
#define WLAN_YH 6
static enum {
area_us,
area_eu,
area_jp,
} wlan_area = area_us;
static struct timeval t0; static struct timeval t0;
@ -95,6 +110,8 @@ static void clear(SDL_Surface *s)
x-5+(pos)*6, x-1+(pos)*6, y+8, y+4, y, CHAN_RGBA x-5+(pos)*6, x-1+(pos)*6, y+8, y+4, y, CHAN_RGBA
#define CSMALL(pos) \ #define CSMALL(pos) \
x-7+(pos)*4, x-5+(pos)*4, y+15, y+13, y+11, FREQ_RGBA x-7+(pos)*4, x-5+(pos)*4, y+15, y+13, y+11, FREQ_RGBA
#define CWLAN(pos) \
x-4+(pos)*5, x-1+(pos)*5, y+6, y+3, y, WCHAN_RGBA
static void label_channels(SDL_Surface *s, int sx, int x0, int y0) static void label_channels(SDL_Surface *s, int sx, int x0, int y0)
@ -121,6 +138,66 @@ static void label_channels(SDL_Surface *s, int sx, int x0, int y0)
} }
static int wlan_channels(void)
{
switch (wlan_area) {
case area_us:
return 11;
case area_eu:
return 13;
case area_jp:
return 14;
default:
abort();
}
}
static int show_wlan_channel(int c)
{
switch (wlan_area) {
case area_jp:
if (c == 14)
return 1;
/* fall through */
case area_us:
return !((c-1) % 5);
case area_eu:
return !((c-1) % 4);
default:
abort();
}
}
static void label_wlan_channels(SDL_Surface *s, int sx, int x0, int y0)
{
int x, xb, y, i, c;
xb = x0;
y = s->h-y0+4;
for (i = 0; i != wlan_channels(); i++) {
c = i+1;
/* Japan special channel: 22 MHz from channel 13 */
if (c == 14)
xb += X_STEP*12/5-X_STEP;
if (c > 9) {
x = xb;
digit(s, c/10, CWLAN(0));
} else {
x = xb-3;
}
digit(s, c % 10, CWLAN(1));
if (show_wlan_channel(c)) {
hlineColor(s, xb-WLAN_XR, xb+WLAN_XR, y-WLAN_YH,
WLAN_RGBA);
vlineColor(s, xb, y-2, y-WLAN_YH+1, WLAN_RGBA);
}
xb += sx;
}
}
void gui(struct atrf_dsc *dsc) void gui(struct atrf_dsc *dsc)
{ {
SDL_Surface *surf; SDL_Surface *surf;
@ -143,10 +220,31 @@ void gui(struct atrf_dsc *dsc)
} }
while (1) { while (1) {
while (SDL_PollEvent(&event)) while (SDL_PollEvent(&event)) {
if (event.type == SDL_KEYDOWN || switch (event.type) {
event.type == SDL_QUIT) case SDL_KEYDOWN:
switch (event.key.keysym.sym) {
case SDLK_j:
wlan_area = area_jp;
break;
case SDLK_e:
wlan_area = area_eu;
break;
case SDLK_u:
wlan_area = area_us;
break;
case SDLK_q:
return; return;
default:
break;
}
break;
case SDL_QUIT:
return;
default:
break;
}
}
shift_grid(z, N_CHAN, N_TIME); shift_grid(z, N_CHAN, N_TIME);
sweep(dsc, z); sweep(dsc, z);
@ -159,6 +257,7 @@ void gui(struct atrf_dsc *dsc)
X_OFFSET, Y_OFFSET, X_OFFSET, Y_OFFSET,
FG_RGBA, BG_RGBA); FG_RGBA, BG_RGBA);
label_channels(surf, X_STEP, X_OFFSET, Y_OFFSET); label_channels(surf, X_STEP, X_OFFSET, Y_OFFSET);
label_wlan_channels(surf, X_STEP, X_WLAN_OFFSET, Y_WLAN_OFFSET);
SDL_UnlockSurface(surf); SDL_UnlockSurface(surf);
SDL_UpdateRect(surf, 0, 0, 0, 0); SDL_UpdateRect(surf, 0, 0, 0, 0);