]> git.decadent.org.uk Git - ap-utils.git/blob - lib/scr.c
20a75ed790d06f881ee73885171cc1c94665ba2f
[ap-utils.git] / lib / scr.c
1 /*
2  *      scr.c from Access Point SNMP Utils for Linux
3  *      program output & screen related functions
4  *
5  * Copyright (c) 2002 Roman Festchook <roma at polesye dot net>
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 Version 2 from
9  * June 1991 as published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with this program; if not, write to the Free Software Foundation, Inc.,
18  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19  *
20  */
21 #include <stdlib.h>
22 #include <unistd.h>
23 #include <string.h>
24 #include "ap-utils.h"
25 #include "ap-curses.h"
26 #include <menu.h>
27
28 extern WINDOW *main_sub, *win_for_help, *main_win;
29
30 enum { dBm, percentage, rawval } sts_viewtype = dBm;
31
32 void
33 scroll_rows(struct MacListStat *first, int begin, int end, int row,
34             int stat)
35 {
36     int i = 1;
37     struct MacListStat *curr = first;
38     char message[100];
39
40     clear_main(3);
41
42     while (i++ < begin)
43         curr = curr->next;
44     i = 0;
45     while (end-- > begin) {
46         if (stat == 1) {
47             /* NWN view */
48             sprintf(message,
49                 (sts_viewtype == dBm) ?
50                 "%4u       %02X%02X%02X%02X%02X%02X        %3u%5u   %3udBm"
51                 :
52                 (sts_viewtype == percentage) ?
53                 "%4u       %02X%02X%02X%02X%02X%02X        %3u%5u     %3u%%"
54                 :
55                 "%4u       %02X%02X%02X%02X%02X%02X        %3u%5u      %3u",
56                 begin + i, curr->addr[0] & 0xFF, curr->addr[1] & 0xFF,
57                 curr->addr[2] & 0xFF, curr->addr[3] & 0xFF,
58                 curr->addr[4] & 0xFF, curr->addr[5] & 0xFF,
59                 curr->quality,
60                 curr->idle,
61                 conv_rssi(curr->rssi)
62             );
63         } else if (stat == 2) {
64             /* ATMEL410_SBRIDGES (firmware 1.4k.1) view */
65             sprintf(message,
66                 (sts_viewtype == dBm) ?
67                 "%2u %02X%02X%02X%02X%02X%02X %3d%% %4ddBm  %3u    %2u   %s"
68                 :
69                 (sts_viewtype == percentage) ?
70                 "%2u %02X%02X%02X%02X%02X%02X %3d%%   %3u%%  %3u    %2u   %s"
71                 :
72                 "%2u %02X%02X%02X%02X%02X%02X %3d%%    %3u  %3u    %2u   %s",
73                 begin + i,
74                 curr->addr[0] & 0xFF, curr->addr[1] & 0xFF,
75                 curr->addr[2] & 0xFF, curr->addr[3] & 0xFF,
76                 curr->addr[4] & 0xFF, curr->addr[5] & 0xFF,
77                 curr->quality,
78                 conv_rssi(curr->rssi),
79                 curr->Status,
80                 curr->Port,
81                 inet_ntoa(curr->IP)
82             );
83         } else if (stat == 3) {
84             /* ATMEL12350_VERNET view */
85             sprintf(message,
86                 (sts_viewtype == dBm) ?
87                 "%2u %02X%02X%02X%02X%02X%02X %02X%02X%02X%02X%02X%02X "
88                 "%4ddBm  %3u    %2u  %s"
89                 :
90                 (sts_viewtype == percentage) ?
91                 "%2u %02X%02X%02X%02X%02X%02X %02X%02X%02X%02X%02X%02X "
92                 "  %3u%%   %3u    %2u  %s"
93                 :
94                 "%2u %02X%02X%02X%02X%02X%02X %02X%02X%02X%02X%02X%02X "
95                 "   %3u   %3u    %2u  %s",
96                 begin + i,
97                 curr->addr[0] & 0xFF, curr->addr[1] & 0xFF,
98                 curr->addr[2] & 0xFF, curr->addr[3] & 0xFF,
99                 curr->addr[4] & 0xFF, curr->addr[5] & 0xFF,
100                 curr->ParentMacAddress[0] & 0xFF,
101                 curr->ParentMacAddress[1] & 0xFF,
102                 curr->ParentMacAddress[2] & 0xFF,
103                 curr->ParentMacAddress[3] & 0xFF,
104                 curr->ParentMacAddress[4] & 0xFF,
105                 curr->ParentMacAddress[5] & 0xFF,
106                 conv_rssi(curr->rssi),
107                 curr->Status,
108                 curr->Port,
109                 inet_ntoa(curr->IP)
110             );
111         } else {
112             /* generic ATMEL view */
113             sprintf(message, "%2u       %02X%02X%02X%02X%02X%02X",
114                 begin + i, curr->addr[0] & 0xFF, curr->addr[1] & 0xFF,
115                 curr->addr[2] & 0xFF, curr->addr[3] & 0xFF,
116                 curr->addr[4] & 0xFF, curr->addr[5] & 0xFF
117             );
118         }
119         mvwaddstr(main_sub, row + i, 0, message);
120         i++;
121         curr = curr->next;
122     }
123     wrefresh(main_sub);
124 }
125
126 void print_help(char *mess)
127 {
128     unsigned short int j, len = (COLS - strlen(mess))/2;
129
130     werase(win_for_help);
131
132     for (j = 0; j <= len; j++) {
133         mvwaddch(win_for_help, 0, j, ' ');
134         mvwaddch(win_for_help, 0, COLS - j - 1, ' ');
135     }
136     
137     mvwaddstr(win_for_help, 0, len, mess);
138     wrefresh(win_for_help);
139 }
140
141 void print_helperr(char *mess)
142 {
143     wattrset(win_for_help, COLOR_PAIR(4) | A_BOLD);
144     print_help(mess);
145     wattrset(win_for_help, COLOR_PAIR(1));
146 }
147
148 void print_title(char *mess)
149 {
150     int i;
151     /* íÁÌÀÀ ÒÁÍËÕ */
152     for (i = 0; i < COLS - MCOLS - 1; i++)
153         mvwaddch(main_win, 0, i, ACS_BSBS);
154     wattrset(main_win, A_BOLD);
155     mvwaddstr(main_win, 0, COLS - MCOLS - strlen(mess) - 2, mess);
156     wattrset(main_win, A_NORMAL);
157     wrefresh(main_win);
158 }
159
160 void print_viewtype(char *mess)
161 {
162     /*
163      * note: when used to update with different strlen(mess) than previous one,
164      * call print_title() before this one so that the top line gets updated !
165      */
166     wattrset(main_win, A_BOLD);
167     mvwaddstr(main_win, 0, 1, "View: ");
168     waddstr(main_win, mess);
169     wattrset(main_win, A_NORMAL);
170     wrefresh(main_win);
171 }
172
173 void print_viewtype_rssi()
174 {
175     switch (sts_viewtype) {
176         case dBm:
177            print_viewtype("RSSI in dBm");
178            return;
179         case percentage:
180            print_viewtype("RSSI in percentage");
181            return;
182         case rawval:
183            print_viewtype("RSSI in raw values");
184     }
185 }
186
187 void print_menusel(int y, int x, char *mess1, char *mess2)
188 {
189     mvwaddstr(main_sub, y, x, mess1);
190     wattrset(main_sub, A_BOLD);
191     waddstr(main_sub, mess2);
192     wattrset(main_sub, A_NORMAL);
193     wrefresh(main_sub);
194 }
195
196 void print_bottom(char *mess)
197 {
198     int i;
199     char message[100];
200     extern short ap_type;
201     extern char *ap_types[];
202
203     sprintf(message, _("Current AP: %s Type: %s"), mess, ap_types[ap_type]);
204     /* íÁÌÀÀ ÒÁÍËÕ */
205     for (i = 0; i < COLS - MCOLS - 1; i++)
206         mvwaddch(main_win, LINES - 3, i, ACS_BSBS);
207     wattrset(main_win, A_BOLD);
208     mvwaddstr(main_win, LINES - 3, COLS - MCOLS - strlen(message) - 1,
209               message);
210     wattrset(main_win, A_NORMAL);
211     wrefresh(main_win);
212 }
213
214
215 void clear_main(int m)
216 {
217     clear_main_new(m, LINES - 4);
218 }
219
220 void clear_main_new(int m, int n)
221 {
222     int i, j;
223     wmove(main_sub, m, 0);
224     for (i = m; i < n; i++)
225         for (j = 0; j < COLS - MCOLS - 1; j++)
226             waddch(main_sub, ' ');
227     wrefresh(main_sub);
228 }
229
230 int conv_rssi(int raw_rssi)
231 {
232     switch (sts_viewtype) {
233         case dBm:
234            return (-96 + raw_rssi); 
235         case percentage:
236            return ((int)((minimum (raw_rssi, 40)) * (float)2.5));
237         case rawval:
238            return raw_rssi;
239     }
240     /* Should never happen */
241     return -1;
242 }
243