]> git.decadent.org.uk Git - ap-utils.git/blob - lib/radio.c
296bb40b992ed95c8b722af6e06da70811ba27ba
[ap-utils.git] / lib / radio.c
1 /*
2  *      radio.c from Access Point SNMP Utils for Linux
3  *
4  * Copyright (c) 2002 Roman Festchook <roma at polesye dot net>
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License Version 2 from
8  * June 1991 as published by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, write to the Free Software Foundation, Inc.,
17  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18  *
19  */
20 #include <math.h>
21 #include <string.h>
22 #include <stdlib.h>
23 #include <sys/types.h>
24 #include "ap-utils.h"
25 #include "ap-curses.h"
26
27 #define RADIO_HELP _("[key] - power level; UIOP or LR - antenna; W - write config; Q - quit to menu")
28
29 #define ANTENNA _("Antenna:")
30 #define ANTENNA_LEFT _("[L] Left:")
31 #define ANTENNA_RIGHT _("[R] Right:")
32
33 extern WINDOW *main_sub;
34 extern short ap_type;
35
36 void power()
37 {
38     char TestModeRadioConfiguration[] =
39         { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x01, 0x08, 0x08,
40         0x00
41     };
42
43     char operAntennaSettings[] =
44         { 0x2B, 0x06, 0x01, 0x04, 0x01, 0x83, 0x1A, 0x01, 0x02, 0x01, 0x0C,
45         0x00
46     };
47
48 #if defined(WORDS_BIGENDIAN)
49     struct twobytes_antenna_struct {
50         int reserv2:6;
51         int trans_right:1;
52         int trans_left:1;
53         int reserv1:6;
54         int recv_right:1;
55         int recv_left:1;
56     };
57
58     struct onebyte_antenna_struct {
59         int reserv:6;
60         int right:1;
61         int left:1;
62     };
63 #else   /* !WORDS_BIGENDIAN */
64     struct twobytes_antenna_struct {
65         int recv_left:1;
66         int recv_right:1;
67         int reserv1:6;
68         int trans_left:1;
69         int trans_right:1;
70         int reserv2:6;
71     };
72
73     struct onebyte_antenna_struct {
74         int left:1;
75         int right:1;
76         int reserv:6;
77     };
78 #endif  /* !WORDS_BIGENDIAN */
79
80     union antenna_union {
81         struct twobytes_antenna_struct antennas_tb;
82         unsigned short antennai;
83         struct onebyte_antenna_struct antennas_ob;
84         char antennac;
85     } antenna;
86
87
88     char message[1024];
89     unsigned char power[14], m_power = 0, a[] = { 0, 0 }, m_antenna = 0;
90     varbind varbinds[2];
91     int i, c = 0, antenna_vlen;
92
93     if (ap_type == ATMEL12350) {
94         TestModeRadioConfiguration[5] = 0xE0;
95         TestModeRadioConfiguration[6] = 0x3E;
96         operAntennaSettings[5] = 0xE0;
97         operAntennaSettings[6] = 0x3E;
98     }
99
100     varbinds[0].oid = TestModeRadioConfiguration;
101     varbinds[0].len_oid = sizeof(TestModeRadioConfiguration);
102     varbinds[0].value = TestModeRadioConfiguration;
103     varbinds[0].len_val = 0;
104     varbinds[0].type = NULL_VALUE;
105     varbinds[1].oid = operAntennaSettings;
106     varbinds[1].value = TestModeRadioConfiguration;
107     varbinds[1].len_oid = sizeof(operAntennaSettings);
108     varbinds[1].len_val = 0;
109     varbinds[1].type = NULL_VALUE;
110
111     print_help(WAIT_RET);
112     if (snmp(varbinds, 2, GET) <= 0) {
113         print_helperr(ERR_RET);
114         goto exit;
115     }
116     print_help(RADIO_HELP);
117
118     memcpy(power, varbinds[0].value, 14);
119     antenna_vlen = varbinds[1].len_val;
120
121     print_title(_("Radio Configuration"));
122     mvwaddstr(main_sub, 0, 1, _("Output RF signal power level (CR31 register values)"));
123     mvwaddstr(main_sub, 1, 1, "---------------------------------------------------");
124     mvwaddstr(main_sub, 2, 1, _("Key Channel Level"));
125
126     for (i = 0; i < 14; i++) {
127         sprintf(message, "[%X]     %02u   %3u", i + 1, i + 1, power[i]);
128         mvwaddstr(main_sub, i + 3, 1, message);
129     }
130
131     if (antenna_vlen == 2) {
132         memcpy(&antenna.antennai, varbinds[1].value, 2);
133         antenna.antennai = ntohs(antenna.antennai);
134         sprintf(message, "%s %s %3s, %s %3s",
135             ANTENNA_RX,
136             ANTENNA_RX_LEFT, (antenna.antennas_tb.recv_left) ? ON : OFF,
137             ANTENNA_RX_RIGHT, (antenna.antennas_tb.recv_right) ? ON : OFF);
138         mvwaddstr(main_sub, 18, 1, message);
139         sprintf(message, "%s %s %3s, %s %3s",
140             ANTENNA_TX,
141             ANTENNA_TX_LEFT, (antenna.antennas_tb.trans_left) ? ON : OFF,
142             ANTENNA_TX_RIGHT, (antenna.antennas_tb.trans_right) ? ON : OFF);
143         mvwaddstr(main_sub, 19, 1, message);
144     } else { /* antenna_vlen == 1 */
145         antenna.antennac = *varbinds[1].value;
146         sprintf(message, "%s %s %3s, %s %3s",
147             ANTENNA,
148             ANTENNA_LEFT, (antenna.antennas_ob.left) ? ON : OFF,
149             ANTENNA_RIGHT, (antenna.antennas_ob.right) ? ON : OFF);
150         mvwaddstr(main_sub, 18, 1, message);
151     }
152
153     wrefresh(main_sub);
154     noecho();
155     while (1) {
156         c = getch();
157         switch (c) {
158         case '1':
159         case '2':
160         case '3':
161         case '4':
162         case '5':
163         case '6':
164         case '7':
165         case '8':
166         case '9':
167         case 'a':
168         case 'b':
169         case 'c':
170         case 'd':
171         case 'e':
172         case 'A':
173         case 'B':
174         case 'C':
175         case 'D':
176         case 'E':
177             a[0] = c;
178             i = strtol(a, NULL, 16);
179             get_value(message, i + 2, 14, 4, INT_STRING, 0, 255, RADIO_HELP);
180             c = atoi(message) & 0xFF;
181             power[i - 1] = c;
182             m_power = 1;
183             continue;
184         case 'i':
185         case 'I':
186             if (antenna_vlen == 1)
187                 continue;
188             i = strlen(ANTENNA_RX) + 1 +
189                 strlen(ANTENNA_RX_LEFT) + 6 +
190                 strlen(ANTENNA_RX_RIGHT) + 2;
191             m_antenna = on_off(18, i);
192             antenna.antennas_tb.recv_right = (m_antenna == 2) ? 0 : 1;
193             sprintf(message, "%3s", (antenna.antennas_tb.recv_right) ? ON : OFF);
194             print_menusel(18, i, NULL, message);
195             continue;
196         case 'u':
197         case 'U':
198             if (antenna_vlen == 1)
199                 continue;
200             i = strlen(ANTENNA_RX) + 1 +
201                 strlen(ANTENNA_RX_LEFT) + 2;
202             m_antenna = on_off(18, i);
203             antenna.antennas_tb.recv_left = (m_antenna == 2) ? 0 : 1;
204             sprintf(message, "%3s", (antenna.antennas_tb.recv_left) ? ON : OFF);
205             print_menusel(18, i, NULL, message);
206             continue;
207         case 'p':
208         case 'P':
209             if (antenna_vlen == 1)
210                 continue;
211             i = strlen(ANTENNA_TX) + 1 +
212                 strlen(ANTENNA_TX_LEFT) + 6 +
213                 strlen(ANTENNA_TX_RIGHT) + 2;
214             m_antenna = on_off(19, i);
215             antenna.antennas_tb.trans_right = (m_antenna == 2) ? 0 : 1;
216             sprintf(message, "%3s", (antenna.antennas_tb.trans_right) ? ON : OFF);
217             print_menusel(19, i, NULL, message);
218             continue;
219         case 'o':
220         case 'O':
221             if (antenna_vlen == 1)
222                 continue;
223             i = strlen(ANTENNA_TX) + 1 +
224                 strlen(ANTENNA_TX_LEFT) + 2;
225             m_antenna = on_off(19, i);
226             antenna.antennas_tb.trans_left = (m_antenna == 2) ? 0 : 1;
227             sprintf(message, "%3s", (antenna.antennas_tb.trans_left) ? ON : OFF);
228             print_menusel(19, i, NULL, message);
229             continue;
230         case 'r':
231         case 'R':
232             if (antenna_vlen == 2)
233                 continue;
234             i = strlen(ANTENNA) + 1 +
235                 strlen(ANTENNA_LEFT) + 6 +
236                 strlen(ANTENNA_RIGHT) + 2;
237             m_antenna = on_off(18, i);
238             antenna.antennas_ob.right = (m_antenna == 2) ? 0 : 1;
239             sprintf(message, "%3s", (antenna.antennas_ob.right) ? ON : OFF);
240             print_menusel(18, i, NULL, message);
241             continue;
242         case 'l':
243         case 'L':
244             if (antenna_vlen == 2)
245                 continue;
246             i = strlen(ANTENNA) + 1 +
247                 strlen(ANTENNA_LEFT) + 2;
248             m_antenna = on_off(18, i);
249             antenna.antennas_ob.left = (m_antenna == 2) ? 0 : 1;
250             sprintf(message, "%3s", (antenna.antennas_ob.left) ? ON : OFF);
251             print_menusel(18, i, NULL, message);
252             continue;
253         case 'q':
254         case 'Q':
255             goto quit;
256         case 'w':
257         case 'W':
258             i = 0;
259             if (m_power) {
260                 varbinds[i].oid = TestModeRadioConfiguration;
261                 varbinds[i].len_oid = sizeof(TestModeRadioConfiguration);
262                 varbinds[i].value = power;
263                 varbinds[i].len_val = 14;
264                 varbinds[i].type = STRING_VALUE;
265                 i++;
266             }
267
268             if (m_antenna) {
269                 if ( (antenna_vlen == 1 &&
270                         (antenna.antennas_ob.left == 0 &&
271                          antenna.antennas_ob.right == 0))
272                     ||
273                      (antenna_vlen == 2 &&
274                         ( (antenna.antennas_tb.trans_left == 0 &&
275                            antenna.antennas_tb.trans_right == 0) ||
276                           (antenna.antennas_tb.recv_left == 0 &&
277                            antenna.antennas_tb.recv_right == 0))) ) {
278                     print_helperr
279                         (_
280                          ("You can't disable both antennas; unable to save antenna-config. Press any key."));
281                     getch();
282                 } else {
283
284                     varbinds[i].oid = operAntennaSettings;
285                     varbinds[i].len_oid = sizeof(operAntennaSettings);
286                     if (antenna_vlen == 2) {
287                         unsigned short antenna_hw = htons(antenna.antennai);
288
289                         varbinds[i].value = (char *) &antenna_hw;
290                     } else /* antenna_vlen == 1 */
291                         varbinds[i].value = &antenna.antennac;
292                     varbinds[i].type = INT_VALUE;
293                     varbinds[i].len_val = antenna_vlen;
294                     i++;
295                 }
296             }
297
298             print_help(WAIT_SET);
299             if (snmp(varbinds, i, SET) <= 0) {
300                 print_helperr(ERR_SET);
301                 goto exit;
302             }
303             break;
304         default:
305             continue;
306         }
307         break;
308     }
309
310     print_help(ANY_KEY);
311   exit:
312     getch();
313   quit:
314     print_title("");
315     clear_main(0);
316 }