IEEE 802.15.4 subsystem
Sign in or create your account | Project List | Help
IEEE 802.15.4 subsystem Commit Details
Date: | 2010-11-09 00:06:06 (13 years 4 months ago) |
---|---|
Author: | Werner Almesberger |
Commit: | 0463bbea5d737f4385ed09997cff6f6ee9232640 |
Message: | Added graphical display of RSSI scan results. - tools/Makefile.common: CFLAGS and OBJS can now be target-specific - tools/atspi-rssi/Makefile: add SDL, SDL_gfx, and the GUI object files when building on the host - tools/atspi-rssi/Makefile: set -DHAVE_GFX when building on the host - tools/atspi-rssi/atspi-rssi.c (usage, main): new option -g to use GUI mode - tools/atspi-rssi/atspi-rssi.c (main): rename variable for the number of sweeps in non-GUI mode from "sweeps" to "arg", since it may have other uses in the future - tools/atspi-rssi/digit.h, tools/atspi-rssi/digit.c: draw 7 segment style digits - tools/atspi-rssi/zgrid.h, tools/atspi-rssi/zgrid.c: display a surface in faux 3D with SDL/SDL_gfx - tools/tools/atspi-rssi/gui.h, tools/atspi-rssi/gui.c: display RSSI scans as a scrolling 3D profile |
Files: |
tools/Makefile.common (2 diffs) tools/atspi-rssi/Makefile (1 diff) tools/atspi-rssi/atspi-rssi.c (5 diffs) tools/atspi-rssi/digit.c (1 diff) tools/atspi-rssi/digit.h (1 diff) tools/atspi-rssi/gui.c (1 diff) tools/atspi-rssi/gui.h (1 diff) tools/atspi-rssi/zgrid.c (1 diff) tools/atspi-rssi/zgrid.h (1 diff) |
Change Details
tools/Makefile.common | ||
---|---|---|
22 | 22 | |
23 | 23 | CC_host = gcc |
24 | 24 | CC_ben = mipsel-openwrt-linux-gcc |
25 | CFLAGS_host = | |
26 | CFLAGS_ben = | |
25 | 27 | LDLIBS_host = -lusb |
26 | 28 | LDLIBS_ben = |
27 | 29 | MACROS_host = -DHAVE_USB |
... | ... | |
40 | 42 | AR = $(AR_quiet) |
41 | 43 | endif |
42 | 44 | |
43 | CFLAGS += -I../../atusb/fw/include -I../include $(MACROS_$(TARGET)) | |
45 | CFLAGS += $(CFLAGS_$(TARGET)) -I../../atusb/fw/include -I../include \ | |
46 | $(MACROS_$(TARGET)) | |
44 | 47 | LDLIBS = $(LDLIBS_$(TARGET)) -L../lib -latspi |
48 | OBJS += $(OBJS_$(TARGET)) |
tools/atspi-rssi/Makefile | ||
---|---|---|
14 | 14 | MAIN = atspi-rssi |
15 | 15 | |
16 | 16 | include ../Makefile.common |
17 | ||
18 | CFLAGS_host += $(shell sdl-config --cflags) | |
19 | MACROS_host += -DHAVE_GFX | |
20 | LDLIBS_host += $(shell sdl-config --libs) -lSDL_gfx | |
21 | OBJS_host = gui.o zgrid.o digit.o | |
22 | ||
23 | $(MAIN): $(OBJS_$(TARGET)) |
tools/atspi-rssi/atspi-rssi.c | ||
---|---|---|
21 | 21 | #include "atspi.h" |
22 | 22 | #include "misctxrx.h" |
23 | 23 | |
24 | #ifdef HAVE_GFX | |
25 | #include "gui.h" | |
26 | #else | |
27 | #define gui(dsc) abort() | |
28 | #endif | |
29 | ||
24 | 30 | |
25 | 31 | static struct timeval t0; |
26 | 32 | static volatile int run = 1; |
... | ... | |
59 | 65 | { |
60 | 66 | fprintf(stderr, |
61 | 67 | "usage: %s [-n] sweeps\n", name); |
68 | ||
69 | #ifdef HAVE_GFX | |
70 | fprintf(stderr, | |
71 | "%6s %s -g\n", "", name); | |
72 | #endif | |
73 | ||
62 | 74 | exit(1); |
63 | 75 | } |
64 | 76 | |
... | ... | |
66 | 78 | int main(int argc, char **argv) |
67 | 79 | { |
68 | 80 | struct atspi_dsc *dsc; |
69 | unsigned long sweeps, i; | |
81 | unsigned long arg = 0, i; | |
70 | 82 | char *end; |
71 | 83 | int c; |
84 | int graphical = 0; | |
72 | 85 | |
73 | while ((c = getopt(argc, argv, "n")) != EOF) | |
86 | while ((c = getopt(argc, argv, "gn")) != EOF) | |
74 | 87 | switch (c) { |
88 | #ifdef HAVE_GFX | |
89 | case 'g': | |
90 | graphical = 1; | |
91 | ||
92 | break; | |
93 | #endif | |
75 | 94 | case 'n': |
76 | 95 | break; |
77 | 96 | default: |
... | ... | |
79 | 98 | } |
80 | 99 | |
81 | 100 | switch (argc-optind) { |
101 | case 0: | |
102 | if (!graphical) | |
103 | usage(*argv); | |
104 | break; | |
82 | 105 | case 1: |
83 | sweeps = strtoul(argv[optind], &end, 0); | |
106 | if (graphical) | |
107 | usage(*argv); | |
108 | arg = strtoul(argv[optind], &end, 0); | |
84 | 109 | if (*end) |
85 | 110 | usage(*argv); |
86 | 111 | break; |
... | ... | |
100 | 125 | * We'll wait for the PLL lock after selecting the channel. |
101 | 126 | */ |
102 | 127 | |
103 | gettimeofday(&t0, NULL); | |
104 | for (i = 0; run && i != sweeps; i++) | |
105 | sweep(dsc); | |
128 | if (graphical) | |
129 | gui(dsc); | |
130 | else { | |
131 | gettimeofday(&t0, NULL); | |
132 | for (i = 0; run && i != arg; i++) | |
133 | sweep(dsc); | |
134 | } | |
106 | 135 | |
107 | 136 | atspi_reg_write(dsc, REG_TRX_STATE, TRX_CMD_TRX_OFF); |
108 | 137 |
tools/atspi-rssi/digit.c | ||
---|---|---|
1 | /* | |
2 | * atspi-rssi/digit.c - Draw 7 segment style digits | |
3 | * | |
4 | * Written 2010 by Werner Almesberger | |
5 | * Copyright 2010 Werner Almesberger | |
6 | * | |
7 | * This program is free software; you can redistribute it and/or modify | |
8 | * it under the terms of the GNU General Public License as published by | |
9 | * the Free Software Foundation; either version 2 of the License, or | |
10 | * (at your option) any later version. | |
11 | */ | |
12 | ||
13 | ||
14 | #include <stdint.h> | |
15 | ||
16 | #include "SDL.h" | |
17 | #include "SDL_gfxPrimitives.h" | |
18 | ||
19 | #include "digit.h" | |
20 | ||
21 | ||
22 | static void hlines_3(SDL_Surface *s, int x0, int x1, int y0, int ym, int y1, | |
23 | uint32_t fg) | |
24 | { | |
25 | hlineColor(s, x0, x1, y0, fg); | |
26 | hlineColor(s, x0, x1, ym, fg); | |
27 | hlineColor(s, x0, x1, y1, fg); | |
28 | } | |
29 | ||
30 | ||
31 | void digit(SDL_Surface *s, int n, int x0, int x1, int y0, int ym, int y1, | |
32 | uint32_t fg) | |
33 | { | |
34 | switch (n) { | |
35 | case 8: | |
36 | hlineColor(s, x0, x1, ym, fg); | |
37 | /* fall through */ | |
38 | case 0: | |
39 | hlineColor(s, x0, x1, y0, fg); | |
40 | vlineColor(s, x0, y0, y1, fg); | |
41 | /* fall through */ | |
42 | case 7: | |
43 | hlineColor(s, x0, x1, y1, fg); | |
44 | vlineColor(s, x1, y0, y1, fg); | |
45 | break; | |
46 | ||
47 | case 1: | |
48 | lineColor(s, x0, ym, x1, y1, fg); | |
49 | vlineColor(s, x1, y0, y1, fg); | |
50 | break; | |
51 | ||
52 | case 2: | |
53 | hlines_3(s, x0, x1, y0, ym, y1, fg); | |
54 | vlineColor(s, x0, y0, ym, fg); | |
55 | vlineColor(s, x1, ym, y1, fg); | |
56 | break; | |
57 | ||
58 | case 9: | |
59 | vlineColor(s, x0, ym, y1, fg); | |
60 | /* fall through */ | |
61 | case 3: | |
62 | hlines_3(s, x0, x1, y0, ym, y1, fg); | |
63 | vlineColor(s, x1, y0, y1, fg); | |
64 | break; | |
65 | ||
66 | case 4: | |
67 | hlineColor(s, x0, x1, ym, fg); | |
68 | vlineColor(s, x0, ym, y1, fg); | |
69 | vlineColor(s, x1, y0, y1, fg); | |
70 | break; | |
71 | ||
72 | case 6: | |
73 | hlines_3(s, x0, x1, y0, ym, y1, fg); | |
74 | vlineColor(s, x0, y0, y1, fg); | |
75 | vlineColor(s, x1, y0, ym, fg); | |
76 | break; | |
77 | ||
78 | case 5: | |
79 | hlines_3(s, x0, x1, y0, ym, y1, fg); | |
80 | vlineColor(s, x0, ym, y1, fg); | |
81 | vlineColor(s, x1, y0, ym, fg); | |
82 | break; | |
83 | ||
84 | default: | |
85 | abort(); | |
86 | } | |
87 | } |
tools/atspi-rssi/digit.h | ||
---|---|---|
1 | /* | |
2 | * atspi-rssi/digit.h - Draw 7 segment style digits | |
3 | * | |
4 | * Written 2010 by Werner Almesberger | |
5 | * Copyright 2010 Werner Almesberger | |
6 | * | |
7 | * This program is free software; you can redistribute it and/or modify | |
8 | * it under the terms of the GNU General Public License as published by | |
9 | * the Free Software Foundation; either version 2 of the License, or | |
10 | * (at your option) any later version. | |
11 | */ | |
12 | ||
13 | ||
14 | #ifndef DIGIT_H | |
15 | #define DIGIT_H | |
16 | ||
17 | #include <stdint.h> | |
18 | ||
19 | #include "SDL.h" | |
20 | ||
21 | ||
22 | void digit(SDL_Surface *s, int n, int x0, int x1, int y0, int ym, int y1, | |
23 | uint32_t fg); | |
24 | ||
25 | #endif /* !DIGIT_H */ |
tools/atspi-rssi/gui.c | ||
---|---|---|
1 | /* | |
2 | * atspi-rssi/gui.c - Graphical output for atspi-rssi | |
3 | * | |
4 | * Written 2010 by Werner Almesberger | |
5 | * Copyright 2010 Werner Almesberger | |
6 | * | |
7 | * This program is free software; you can redistribute it and/or modify | |
8 | * it under the terms of the GNU General Public License as published by | |
9 | * the Free Software Foundation; either version 2 of the License, or | |
10 | * (at your option) any later version. | |
11 | */ | |
12 | ||
13 | ||
14 | #include <stdlib.h> | |
15 | #include <stdio.h> | |
16 | #include <unistd.h> | |
17 | #include <signal.h> | |
18 | #include <sys/time.h> | |
19 | ||
20 | #include "SDL.h" | |
21 | #include "SDL_gfxPrimitives.h" | |
22 | ||
23 | #include "at86rf230.h" | |
24 | #include "atspi.h" | |
25 | #include "misctxrx.h" | |
26 | ||
27 | #include "zgrid.h" | |
28 | #include "digit.h" | |
29 | #include "gui.h" | |
30 | ||
31 | ||
32 | #define XRES 320 | |
33 | #define YRES 240 | |
34 | ||
35 | #define N_CHAN 16 | |
36 | #define N_TIME 64 | |
37 | ||
38 | ||
39 | static struct timeval t0; | |
40 | ||
41 | ||
42 | static void shift_grid(int *z, int nx, int ny) | |
43 | { | |
44 | int *p1, *p0, *s; | |
45 | int x, y; | |
46 | ||
47 | p1 = z+(ny-1)*nx; | |
48 | for (y = 1; y != ny; y++) { | |
49 | p0 = s = p1-nx; | |
50 | for (x = 0; x != nx; x++) | |
51 | *p1++ = *p0++; | |
52 | p1 = s; | |
53 | } | |
54 | } | |
55 | ||
56 | ||
57 | static void sweep(struct atspi_dsc *dsc, int *z) | |
58 | { | |
59 | int chan; | |
60 | ||
61 | for (chan = 11; chan <= 26; chan++) { | |
62 | atspi_reg_write(dsc, REG_PHY_CC_CCA, chan); | |
63 | /* 150 us, according to AVR2001 section 3.5 */ | |
64 | wait_for_interrupt(dsc, IRQ_PLL_LOCK, IRQ_PLL_LOCK, 10, 20); | |
65 | ||
66 | *z++ = 3*atspi_reg_read(dsc, REG_PHY_RSSI) & RSSI_MASK; | |
67 | #if 0 | |
68 | if (chan >= 13 && chan <= 19 ) | |
69 | z[-1] = 3*28-(chan-16)*(chan-16)*(chan-16)*(chan-16); | |
70 | #endif | |
71 | } | |
72 | } | |
73 | ||
74 | ||
75 | static void clear(SDL_Surface *s) | |
76 | { | |
77 | SDL_FillRect(s, NULL, SDL_MapRGB(s->format, 0, 0, 0)); | |
78 | } | |
79 | ||
80 | ||
81 | #define CBIG(pos) \ | |
82 | x-5+(pos)*6, x-1+(pos)*6, y+8, y+4, y, 0xff4040ff | |
83 | #define CSMALL(pos) \ | |
84 | x-7+(pos)*4, x-5+(pos)*4, y+15, y+13, y+11, 0x20ff00ff | |
85 | ||
86 | ||
87 | static void label_channels(SDL_Surface *s, int sx, int x0, int y0) | |
88 | { | |
89 | int x, y, i, c, f; | |
90 | ||
91 | x = x0; | |
92 | y = s->h-y0+4; | |
93 | for (i = 0; i != N_CHAN; i++) { | |
94 | c = i+11; | |
95 | digit(s, c/10, CBIG(0)); | |
96 | digit(s, c % 10, CBIG(1)); | |
97 | f = 2405+5*i; | |
98 | if (i & 1) | |
99 | y++; | |
100 | digit(s, f/1000, CSMALL(0)); | |
101 | digit(s, (f/100) % 10, CSMALL(1)); | |
102 | digit(s, (f/10) % 10, CSMALL(2)); | |
103 | digit(s, f % 10, CSMALL(3)); | |
104 | if (i & 1) | |
105 | y--; | |
106 | x += sx; | |
107 | } | |
108 | } | |
109 | ||
110 | ||
111 | void gui(struct atspi_dsc *dsc) | |
112 | { | |
113 | SDL_Surface *surf; | |
114 | int z[N_CHAN*N_TIME]; | |
115 | ||
116 | memset(z, 0, sizeof(z)); | |
117 | gettimeofday(&t0, NULL); | |
118 | ||
119 | if (SDL_Init(SDL_INIT_VIDEO) < 0) { | |
120 | fprintf(stderr, "SDL_init: %s\n", SDL_GetError()); | |
121 | exit(1); | |
122 | } | |
123 | atexit(SDL_Quit); | |
124 | ||
125 | surf = SDL_SetVideoMode(XRES, YRES, 0, SDL_SWSURFACE); | |
126 | if (!surf) { | |
127 | fprintf(stderr, "SDL_SetVideoMode: %s\n", SDL_GetError()); | |
128 | exit(1); | |
129 | } | |
130 | ||
131 | while (1) { | |
132 | shift_grid(z, N_CHAN, N_TIME); | |
133 | sweep(dsc, z); | |
134 | ||
135 | SDL_LockSurface(surf); | |
136 | ||
137 | clear(surf); | |
138 | zgrid_draw(surf, z, N_CHAN, N_TIME, | |
139 | 17, 2, 1, | |
140 | 7, 40, | |
141 | 0xffffff00, 0x00408080); | |
142 | label_channels(surf, 17, 7, 40); | |
143 | ||
144 | SDL_UnlockSurface(surf); | |
145 | SDL_UpdateRect(surf, 0, 0, 0, 0); | |
146 | } | |
147 | } |
tools/atspi-rssi/gui.h | ||
---|---|---|
1 | /* | |
2 | * atspi-rssi/gui.h - Graphical output for atspi-rssi | |
3 | * | |
4 | * Written 2010 by Werner Almesberger | |
5 | * Copyright 2010 Werner Almesberger | |
6 | * | |
7 | * This program is free software; you can redistribute it and/or modify | |
8 | * it under the terms of the GNU General Public License as published by | |
9 | * the Free Software Foundation; either version 2 of the License, or | |
10 | * (at your option) any later version. | |
11 | */ | |
12 | ||
13 | #ifndef GUI_H | |
14 | #define GUI_H | |
15 | ||
16 | #include "atspi.h" | |
17 | ||
18 | ||
19 | void gui(struct atspi_dsc *dsc); | |
20 | ||
21 | #endif /* !GUI_H */ |
tools/atspi-rssi/zgrid.c | ||
---|---|---|
1 | /* | |
2 | * atspi-rssi/zgrid.c - Display a surface in faux 3D with SDL/SDL_gfx | |
3 | * | |
4 | * Written 2010 by Werner Almesberger | |
5 | * Copyright 2010 Werner Almesberger | |
6 | * | |
7 | * This program is free software; you can redistribute it and/or modify | |
8 | * it under the terms of the GNU General Public License as published by | |
9 | * the Free Software Foundation; either version 2 of the License, or | |
10 | * (at your option) any later version. | |
11 | */ | |
12 | ||
13 | ||
14 | #include <stdint.h> | |
15 | #include <stdlib.h> | |
16 | #include <stdio.h> | |
17 | ||
18 | #include "SDL.h" | |
19 | #include "SDL_gfxPrimitives.h" | |
20 | ||
21 | #include "zgrid.h" | |
22 | ||
23 | ||
24 | #define SWAP(x, y) \ | |
25 | do { typeof(x) swap_tmp = (x); (x) = (y); (y) = swap_tmp; } while (0) | |
26 | ||
27 | ||
28 | static int *alloc_row(int nx) | |
29 | { | |
30 | int *p; | |
31 | ||
32 | p = malloc(nx*sizeof(*p)); | |
33 | if (p) | |
34 | return p; | |
35 | perror("malloc"); | |
36 | exit(1); | |
37 | } | |
38 | ||
39 | ||
40 | static void draw_band(SDL_Surface *s, const int *ax, const int *ay, | |
41 | const int *bx, const int *by, int n, uint32_t fg, uint32_t bg) | |
42 | { | |
43 | Sint16 px[4], py[4]; | |
44 | int i; | |
45 | ||
46 | for (i = n-2; i >= 0; i--) { | |
47 | px[0] = ax[i]; | |
48 | px[1] = ax[i+1]; | |
49 | px[2] = bx[i+1]; | |
50 | px[3] = bx[i]; | |
51 | py[0] = ay[i]; | |
52 | py[1] = ay[i+1]; | |
53 | py[2] = by[i+1]; | |
54 | py[3] = by[i]; | |
55 | filledPolygonColor(s, px, py, 4, bg); | |
56 | aalineColor(s, ax[i+1], ay[i+1], bx[i+1], by[i+1], fg); | |
57 | aalineColor(s, bx[i], by[i], bx[i+1], by[i+1], fg); | |
58 | } | |
59 | aalineColor(s, ax[0], ay[0], bx[0], by[0], fg); | |
60 | } | |
61 | ||
62 | ||
63 | static void draw_polyline(SDL_Surface *s, const int *px, const int *py, | |
64 | int n, uint32_t rgba) | |
65 | { | |
66 | int i; | |
67 | ||
68 | for (i = 0; i != n-1; i++) | |
69 | aalineColor(s, px[i], py[i], px[i+1], py[i+1], rgba); | |
70 | } | |
71 | ||
72 | ||
73 | void zgrid_draw(SDL_Surface *s, const int *z, int nx, int ny, | |
74 | int sx, int sy, int sxy, int x0, int y0, uint32_t fg, uint32_t bg) | |
75 | { | |
76 | int *lx = alloc_row(nx); | |
77 | int *ly = alloc_row(nx); | |
78 | int *px = alloc_row(nx); | |
79 | int *py = alloc_row(nx); | |
80 | int x, y, yz0; | |
81 | const int *zp; | |
82 | uint8_t a; | |
83 | ||
84 | for (y = ny-1; y >= 0; y--) { | |
85 | a = (ny-1-y)*0xe0/(ny-1)+0x1f; | |
86 | yz0 = s->h-y0-y*sy-1; | |
87 | zp = z+y*nx; | |
88 | for (x = 0; x != nx; x++) { | |
89 | px[x] = x0+x*sx+y*sxy; | |
90 | py[x] = yz0-zp[x]; | |
91 | } | |
92 | if (y != ny-1) { | |
93 | draw_band(s, px, py, lx, ly, nx, fg | a, bg); | |
94 | } | |
95 | SWAP(px, lx); | |
96 | SWAP(py, ly); | |
97 | } | |
98 | draw_polyline(s, lx, ly, nx, fg | 0xff); | |
99 | } |
tools/atspi-rssi/zgrid.h | ||
---|---|---|
1 | /* | |
2 | * atspi-rssi/zgrid.h - Display a surface in faux 3D with SDL/SDL_gfx | |
3 | * | |
4 | * Written 2010 by Werner Almesberger | |
5 | * Copyright 2010 Werner Almesberger | |
6 | * | |
7 | * This program is free software; you can redistribute it and/or modify | |
8 | * it under the terms of the GNU General Public License as published by | |
9 | * the Free Software Foundation; either version 2 of the License, or | |
10 | * (at your option) any later version. | |
11 | */ | |
12 | ||
13 | #ifndef ZGRID_H | |
14 | #define ZGRID_H | |
15 | ||
16 | #include <stdint.h> | |
17 | ||
18 | #include "SDL.h" | |
19 | ||
20 | ||
21 | void zgrid_draw(SDL_Surface *s, const int *z, int nx, int ny, | |
22 | int sx, int sy, int sxy, int x0, int y0, uint32_t fg, uint32_t bg); | |
23 | ||
24 | #endif /* !ZGRID_H */ |