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