From owner-svn-src-user@FreeBSD.ORG Mon Dec 31 06:47:17 2012 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id AB916B21; Mon, 31 Dec 2012 06:47:17 +0000 (UTC) (envelope-from adrian@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 8DF938FC08; Mon, 31 Dec 2012 06:47:17 +0000 (UTC) Received: from svn.freebsd.org (svn.FreeBSD.org [8.8.178.70]) by svn.freebsd.org (8.14.5/8.14.5) with ESMTP id qBV6lHoG077037; Mon, 31 Dec 2012 06:47:17 GMT (envelope-from adrian@svn.freebsd.org) Received: (from adrian@localhost) by svn.freebsd.org (8.14.5/8.14.5/Submit) id qBV6lGsq077030; Mon, 31 Dec 2012 06:47:16 GMT (envelope-from adrian@svn.freebsd.org) Message-Id: <201212310647.qBV6lGsq077030@svn.freebsd.org> From: Adrian Chadd Date: Mon, 31 Dec 2012 06:47:16 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r244893 - in user/adrian/ath_radar_stuff/src/spectral_fft: . font samples X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 31 Dec 2012 06:47:17 -0000 Author: adrian Date: Mon Dec 31 06:47:16 2012 New Revision: 244893 URL: http://svnweb.freebsd.org/changeset/base/244893 Log: Bring over the spectral fft code from Simon over at linux-wireless. This is GPLed, be careful. Added: user/adrian/ath_radar_stuff/src/spectral_fft/ user/adrian/ath_radar_stuff/src/spectral_fft/COPYING user/adrian/ath_radar_stuff/src/spectral_fft/Makefile user/adrian/ath_radar_stuff/src/spectral_fft/README user/adrian/ath_radar_stuff/src/spectral_fft/fft_eval.c user/adrian/ath_radar_stuff/src/spectral_fft/font/ user/adrian/ath_radar_stuff/src/spectral_fft/font/AUTHORS user/adrian/ath_radar_stuff/src/spectral_fft/font/COPYING user/adrian/ath_radar_stuff/src/spectral_fft/font/ChangeLog user/adrian/ath_radar_stuff/src/spectral_fft/font/LiberationSans-Regular.ttf (contents, props changed) user/adrian/ath_radar_stuff/src/spectral_fft/font/License.txt user/adrian/ath_radar_stuff/src/spectral_fft/font/README user/adrian/ath_radar_stuff/src/spectral_fft/samples/ user/adrian/ath_radar_stuff/src/spectral_fft/samples/ar9223_analog_camera_ch1.dump (contents, props changed) user/adrian/ath_radar_stuff/src/spectral_fft/samples/ar9280_analog_camera_ch1.dump (contents, props changed) user/adrian/ath_radar_stuff/src/spectral_fft/samples/ar9390_analog_camera_ch1.dump (contents, props changed) Added: user/adrian/ath_radar_stuff/src/spectral_fft/COPYING ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/adrian/ath_radar_stuff/src/spectral_fft/COPYING Mon Dec 31 06:47:16 2012 (r244893) @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + 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. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. Added: user/adrian/ath_radar_stuff/src/spectral_fft/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/adrian/ath_radar_stuff/src/spectral_fft/Makefile Mon Dec 31 06:47:16 2012 (r244893) @@ -0,0 +1,10 @@ +SRCS= fft_eval.c + +CFLAGS+= -I/usr/local/include +LDFLAGS+= -L/usr/local/lib +LDLIBS+= -lSDL -lSDL_ttf + +all: fft_eval + +clean: + rm -f *.o fft_eval Added: user/adrian/ath_radar_stuff/src/spectral_fft/README ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/adrian/ath_radar_stuff/src/spectral_fft/README Mon Dec 31 06:47:16 2012 (r244893) @@ -0,0 +1,59 @@ +DESCRIPTION +=========== + +This program has been created to aid open source spectrum +analyzer development for Qualcomm/Atheros AR92xx and AR93xx +based chipsets. + +It visualizes the FFT data reported by the chips to help intepreting +and understanding the data. + +TODO: The interpreted data format is unknown! Please help +investigating the data, or help acquiring information about the +data format from Qualcomm Atheros! + +BUILD +===== + +You need to have SDL and SDL_ttf development packages installed +on your system, as well as make and gcc. + +Just type make to build the program: + +$ make +gcc -O2 -Wall -pedantic -c -o fft_eval.o fft_eval.c +gcc -lSDL -lSDL_ttf -o fft_eval fft_eval.o +$ + +USAGE +===== + +First, you need to acquire sample data from your spectral-scan enabled +Atheros WiFi card. If the patches are applied correctly, you can use +the following commands: + +ifconfig wlan0 up +iw dev wlan0 scan spec-scan +cat /sys/kernel/debug/ieee80211/phy0/ath9k/spectral_scan > /tmp/fft_results + +There are some recorded samples in the "samples" directory to try it +out without actual hardware. + +To view the FFT results, use: + +./fft_eval /tmp/fft_results + +Navigate through the currently selected datasets using the arrow keys (left +and right). Scroll through the spectrum using the Page Up/Down keys. + + +LICENSE +======= + +Read the GPL v2 file 'COPYING'. + +AUTHOR +====== + +This software has been written by Simon Wunderlich +for Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V. Added: user/adrian/ath_radar_stuff/src/spectral_fft/fft_eval.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/adrian/ath_radar_stuff/src/spectral_fft/fft_eval.c Mon Dec 31 06:47:16 2012 (r244893) @@ -0,0 +1,536 @@ +/* + * Copyright (C) 2012 Simon Wunderlich + * Copyright (C) 2012 Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA + * + */ + +/* + * This program has been created to aid open source spectrum + * analyzer development for Qualcomm/Atheros AR92xx and AR93xx + * based chipsets. + */ + +#include +#include +#include +#include +#include + +typedef int8_t s8; +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint64_t u64; + +/* taken from ath9k.h */ +#define SPECTRAL_HT20_NUM_BINS 56 + +enum ath_fft_sample_type { + ATH_FFT_SAMPLE_HT20 = 0 +}; + +struct fft_sample_tlv { + u8 type; /* see ath_fft_sample */ + u16 length; + /* type dependent data follows */ +} __attribute__((packed)); + +struct fft_sample_ht20 { + struct fft_sample_tlv tlv; + + u8 __alignment; + + u16 freq; + s8 rssi; + s8 noise; + + u16 max_magnitude; + u8 max_index; + u8 bitmap_weight; + + u64 tsf; + + u16 data[SPECTRAL_HT20_NUM_BINS]; +} __attribute__((packed)); + + +struct scanresult { + struct fft_sample_ht20 sample; + struct scanresult *next; +}; + +#define WIDTH 1600 +#define HEIGHT 650 +#define BPP 32 + +#define X_SCALE 10 +#define Y_SCALE 4 + +#define RMASK 0x000000ff +#define RBITS 0 +#define GMASK 0x0000ff00 +#define GBITS 8 +#define BMASK 0x00ff0000 +#define BBITS 16 +#define AMASK 0xff000000 + + +SDL_Surface *screen = NULL; +TTF_Font *font = NULL; +struct scanresult *result_list; +int scanresults_n = 0; + +int graphics_init_sdl(void) +{ + SDL_VideoInfo *VideoInfo; + int SDLFlags; + + SDLFlags = SDL_HWPALETTE | SDL_RESIZABLE; + + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0) { + fprintf(stderr, "Initializing SDL failed\n"); + return -1; + } + + if ((VideoInfo = (SDL_VideoInfo *) SDL_GetVideoInfo()) == NULL) { + fprintf(stderr, "Getting SDL Video Info failed\n"); + return -1; + } + + else { + if (VideoInfo->hw_available) { + SDLFlags |= SDL_HWSURFACE; + } else { + SDLFlags |= SDL_SWSURFACE; + } + if (VideoInfo->blit_hw) + SDLFlags |= SDL_HWACCEL; + } + + SDL_WM_SetCaption("FFT eval", "FFT eval"); + screen = SDL_SetVideoMode(WIDTH, HEIGHT, BPP, SDLFlags); + + if (TTF_Init() < 0) { + fprintf(stderr, "Initializing SDL TTF failed\n"); + return -1; + } + + font = TTF_OpenFont("font/LiberationSans-Regular.ttf", 14); + if (!font) { + fprintf(stderr, "Opening font failed\n"); + return -1; + } + + return 0; +} + +void graphics_quit_sdl(void) +{ + SDL_Quit(); +} + +int pixel(Uint32 *pixels, int x, int y, Uint32 color) +{ + if (x < 0 || x >= WIDTH) + return -1; + if (y < 0 || y >= HEIGHT) + return -1; + + pixels[x + y * WIDTH] |= color; + return 0; +} + + +#define SIZE 3 +/* this function blends a 2*SIZE x 2*SIZE blob at the given position with + * the defined opacity. */ +int bigpixel(Uint32 *pixels, int x, int y, Uint32 color, uint8_t opacity) +{ + int x1, y1; + + if (x - SIZE < 0 || x + SIZE >= WIDTH) + return -1; + if (y - SIZE < 0 || y + SIZE >= HEIGHT) + return -1; + + for (x1 = x - SIZE; x1 < x + SIZE; x1++) + for (y1 = y - SIZE; y1 < y + SIZE; y1++) { + Uint32 r, g, b; + + r = ((pixels[x1 + y1 * WIDTH] & RMASK) >> RBITS) + ((((color & RMASK) >> RBITS) * opacity) / 255); + if (r > 255) r = 255; + g = ((pixels[x1 + y1 * WIDTH] & GMASK) >> GBITS) + ((((color & GMASK) >> GBITS) * opacity) / 255); + if (g > 255) g = 255; + b = ((pixels[x1 + y1 * WIDTH] & BMASK) >> BBITS) + ((((color & BMASK) >> BBITS) * opacity) / 255); + if (b > 255) b = 255; + + pixels[x1 + y1 * WIDTH] = r << RBITS | g << GBITS | b << BBITS | (color & AMASK); + } + return 0; +} + +int render_text(SDL_Surface *surface, char *text, int x, int y) +{ + SDL_Surface *text_surface; + SDL_Color fontcolor = {255, 255, 255, 255}; + SDL_Rect fontdest = {0, 0, 0, 0}; + + fontdest.x = x; + fontdest.y = y; + + text_surface = TTF_RenderText_Solid(font, text, fontcolor); + if (!text_surface) + return -1; + + SDL_BlitSurface(text_surface, NULL, surface, &fontdest); + SDL_FreeSurface(text_surface); + + return 0; +} + +/* + * draw_picture - draws the current screen. + * + * @highlight: the index of the dataset to be highlighted + * + * returns the center frequency of the currently highlighted dataset + */ +int draw_picture(int highlight, int startfreq) +{ + Uint32 *pixels, color, opacity; + int x, y, i, rnum; + int highlight_freq = startfreq + 20; + char text[1024]; + struct scanresult *result; + SDL_Surface *surface; + + surface = SDL_CreateRGBSurface(SDL_SWSURFACE, WIDTH, HEIGHT, BPP, RMASK, GMASK, BMASK, AMASK); + pixels = (Uint32 *) surface->pixels; + for (y = 0; y < HEIGHT; y++) + for (x = 0; x < WIDTH; x++) + pixels[x + y * WIDTH] = AMASK; + + /* vertical lines (frequency) */ + for (i = 2300; i < 6000; i += 10) { + x = (X_SCALE * (i - startfreq)); + + if (x < 0 || x > WIDTH) + continue; + + for (y = 0; y < HEIGHT - 20; y++) + pixels[x + y * WIDTH] = 0x40404040 | AMASK; + + snprintf(text, sizeof(text), "%d MHz", i); + render_text(surface, text, x - 30, HEIGHT - 20); + } + + /* horizontal lines (dBm) */ + for (i = 0; i < 150; i += 10) { + y = 600 - Y_SCALE * i; + + for (x = 0; x < WIDTH; x++) + pixels[x + y * WIDTH] = 0x40404040 | AMASK; + + snprintf(text, sizeof(text), "-%d dBm", (150 - i)); + render_text(surface, text, 5, y - 15); + } + + + rnum = 0; + for (result = result_list; result ; result = result->next) { + int datamax = 0, datamin = 65536; + int datasquaresum = 0; + + for (i = 0; i < SPECTRAL_HT20_NUM_BINS; i++) { + int data; + + data = result->sample.data[i] * result->sample.data[i]; + datasquaresum += data; + if (data > datamax) datamax = data; + if (data < datamin) datamin = data; + } + + if (rnum == highlight) { + /* prints some statistical data about the currently selected + * data sample and auxiliary data. */ + printf("result[%03d]: freq %04d rssi %03d, noise %03d, max_magnitude %04d max_index %03d bitmap_weight %03d tsf %llu | ", + rnum, result->sample.freq, result->sample.rssi, result->sample.noise, + result->sample.max_magnitude, result->sample.max_index, result->sample.bitmap_weight, + result->sample.tsf); + printf("datamax = %d, datamin = %d, datasquaresum = %d\n", datamax, datamin, datasquaresum); + + highlight_freq = result->sample.freq; + } + + + for (i = 0; i < SPECTRAL_HT20_NUM_BINS; i++) { + float freq; + float signal; + int data; + freq = result->sample.freq - 10.0 + ((20.0 * i) / SPECTRAL_HT20_NUM_BINS); + + x = (X_SCALE * (freq - startfreq)); + + /* This is where the "magic" happens: interpret the signal + * to output some kind of data which looks useful. */ + + data = result->sample.data[i]; + if (data == 0) + data = 1; + signal = result->sample.noise + result->sample.rssi + 20 * log10f(data) - log10f(datasquaresum) * 10; + + y = 400 - (400.0 + Y_SCALE * signal); + + if (rnum == highlight) { + color = RMASK | AMASK; + opacity = 255; + } else { + color = BMASK | AMASK; + opacity = 30; + } + + if (bigpixel(pixels, x, y, color, opacity) < 0) + continue; + + } + rnum++; + } + + SDL_BlitSurface(surface, NULL, screen, NULL); + SDL_FreeSurface(surface); + SDL_Flip(screen); + + return highlight_freq; +} + +/* read_file - reads an file into a big buffer and returns it + * + * @fname: file name + * + * returns the buffer with the files content + */ +char *read_file(char *fname, size_t *size) +{ + FILE *fp; + char *buf = NULL; + size_t ret; + + fp = fopen(fname, "r"); + + if (!fp) + return NULL; + + *size = 0; + while (!feof(fp)) { + + buf = realloc(buf, *size + 4097); + if (!buf) + return NULL; + + ret = fread(buf + *size, 1, 4096, fp); + *size += ret; + } + fclose(fp); + + buf[*size] = 0; + + return buf; +} + +/* + * read_scandata - reads the fft scandata and compiles a linked list of datasets + * + * @fname: file name + * + * returns 0 on success, -1 on error. + */ +int read_scandata(char *fname) +{ + char *pos, *scandata; + size_t len, sample_len; + struct scanresult *result; + struct fft_sample_tlv *tlv; + struct scanresult *tail = result_list; + + scandata = read_file(fname, &len); + if (!scandata) + return -1; + + pos = scandata; + + while (pos - scandata < len) { + tlv = (struct fft_sample_tlv *) pos; + sample_len = sizeof(*tlv) + tlv->length; + pos += sample_len; + if (tlv->type != ATH_FFT_SAMPLE_HT20) { + fprintf(stderr, "unknown sample type (%d)\n", tlv->type); + continue; + } + + if (sample_len != sizeof(result->sample)) { + fprintf(stderr, "wrong sample length (have %d, expected %d)\n", sample_len, sizeof(result->sample)); + continue; + } + + result = malloc(sizeof(*result)); + if (!result) + continue; + + memset(result, 0, sizeof(*result)); + memcpy(&result->sample, tlv, sizeof(result->sample)); + fprintf(stderr, "copy %d bytes\n", sizeof(result->sample)); + + if (tail) + tail->next = result; + else + result_list = result; + + tail = result; + + scanresults_n++; + } + + fprintf(stderr, "read %d scan results\n", scanresults_n); + return 0; +} + +/* + * graphics_main - sets up the data and holds the mainloop. + * + */ +void graphics_main(void) +{ + SDL_Event event; + int quit = 0; + int highlight = 0; + int change = 1, scroll = 0; + int startfreq = 2350, accel = 0; + int highlight_freq = startfreq; + + if (graphics_init_sdl() < 0) { + fprintf(stderr, "Failed to initialize graphics.\n"); + return; + } + SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); + while (!quit) { + if (change) { + highlight_freq = draw_picture(highlight, startfreq); + change = 0; + } + + if (!scroll) { + /* move to highlighted object */ + if (highlight_freq - 20 < startfreq) + accel = -10; + if (highlight_freq > (startfreq + WIDTH/X_SCALE)) + accel = 10; + + /* if we are "far off", move a little bit faster */ + if (highlight_freq + 300 < startfreq) + accel = -100; + + if (highlight_freq - 300 > (startfreq + WIDTH/X_SCALE)) + accel = 100; + } + + if (accel) + SDL_PollEvent(&event); + else + SDL_WaitEvent(&event); + + switch (event.type) { + case SDL_QUIT: + quit = 1; + break; + case SDL_KEYDOWN: + switch (event.key.keysym.sym) { + case SDLK_LEFT: + if (highlight > 0) { + highlight--; + scroll = 0; + change = 1; + } + break; + case SDLK_RIGHT: + if (highlight < scanresults_n - 1){ + highlight++; + scroll = 0; + change = 1; + } + break; + case SDLK_PAGEUP: + accel-= 2; + scroll = 1; + break; + case SDLK_PAGEDOWN: + accel+= 2; + scroll = 1; + default: + break; + } + break; + } + if (accel) { + startfreq += accel; + if (accel > 0) accel--; + if (accel < 0) accel++; + change = 1; + } + if (startfreq < 2300) startfreq = 2300; + if (startfreq > 6000) startfreq = 6000; + if (accel < -20) accel = -20; + if (accel > 20) accel = 20; + } + + graphics_quit_sdl(); +} + +void usage(int argc, char *argv[]) +{ + fprintf(stderr, "Usage: %s [scanfile]\n", argv[0]); + fprintf(stderr, "\n"); + fprintf(stderr, "scanfile is generated by the spectral analyzer feature\n"); + fprintf(stderr, "of your wifi card. If you have a AR92xx or AR93xx based\n"); + fprintf(stderr, "card, try:\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "ifconfig wlan0 up\n"); + fprintf(stderr, "iw dev wlan0 scan spec-scan\n"); + fprintf(stderr, "cat /sys/kernel/debug/ieee80211/phy0/ath9k/spectral_scan > /tmp/fft_results\n"); + fprintf(stderr, "%s /tmp/fft_results\n", argv[0]); + fprintf(stderr, "\n"); + fprintf(stderr, "(NOTE: maybe debugfs must be mounted first: mount -t debugfs none /sys/kernel/debug/ )\n"); + fprintf(stderr, "\n"); + +} + +int main(int argc, char *argv[]) +{ + if (argc < 2) { + usage(argc, argv); + return -1; + } + + fprintf(stderr, "WARNING: Experimental Software! Don't trust anything you see. :)\n"); + fprintf(stderr, "\n"); + if (read_scandata(argv[1]) < 0) { + fprintf(stderr, "Couldn't read scanfile ...\n"); + usage(argc, argv); + return -1; + } + graphics_main(); + + return 0; +} Added: user/adrian/ath_radar_stuff/src/spectral_fft/font/AUTHORS ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/adrian/ath_radar_stuff/src/spectral_fft/font/AUTHORS Mon Dec 31 06:47:16 2012 (r244893) @@ -0,0 +1,10 @@ +Font Designer: + Ascender Corporation. + http://www.ascendercorp.com/ + +Original Designer: + Steve Matteson + http://www.ascendercorp.com/typedesigners.html + +Current Maintainer: + Caius Chance Added: user/adrian/ath_radar_stuff/src/spectral_fft/font/COPYING ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ user/adrian/ath_radar_stuff/src/spectral_fft/font/COPYING Mon Dec 31 06:47:16 2012 (r244893) @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***