comparison rvinterf/etmsync/l1tmcmd.c @ 273:18a8fb3d845b

fc-tmsync: user command wrappers implemented
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 16 Nov 2017 23:33:50 +0000
parents
children 81da9717babe
comparison
equal deleted inserted replaced
272:3e272b956ef4 273:18a8fb3d845b
1 /*
2 * This module contains the user command wrappers around the functions
3 * in the l1tmops.c module.
4 */
5
6 #include <sys/types.h>
7 #include <ctype.h>
8 #include <stdio.h>
9 #include <string.h>
10 #include <strings.h>
11 #include <stdlib.h>
12 #include "pktmux.h"
13 #include "limits.h"
14 #include "localtypes.h"
15 #include "tm3.h"
16 #include "l1tm.h"
17 #include "exitcodes.h"
18
19 extern void write_afcparams_table();
20 extern void write_agcwords_table();
21 extern void write_agcglobals_table();
22 extern void write_il2agc_table();
23 extern void write_tx_levels_table();
24 extern void write_tx_calchan_table();
25 extern void write_tx_caltemp_table();
26 extern void write_rx_calchan_table();
27 extern void write_rx_caltemp_table();
28 extern void write_rx_agcparams_table();
29
30 cmd_tms(argc, argv)
31 char **argv;
32 {
33 u16 arg;
34
35 arg = strtoul(argv[1], 0, 0);
36 return do_tms(arg);
37 }
38
39 static
40 is_num_string(argstr)
41 char *argstr;
42 {
43 char *cp = argstr;
44
45 if (!isdigit(*cp++))
46 return(0);
47 while (*cp) {
48 if (!isdigit(*cp++))
49 return(0);
50 }
51 return(1);
52 }
53
54 struct kwtab {
55 char *kw;
56 int val;
57 };
58
59 static
60 keyword_or_num(argstr, kwtab, valp)
61 char *argstr;
62 struct kwtab *kwtab;
63 u16 *valp;
64 {
65 struct kwtab *tp;
66
67 if (is_num_string(argstr)) {
68 *valp = atoi(argstr);
69 return(0);
70 }
71 for (tp = kwtab; tp->kw; tp++) {
72 if (!strcmp(tp->kw, argstr)) {
73 *valp = tp->val;
74 return(0);
75 }
76 }
77 printf("error: non-numeric argument not understood\n");
78 return(ERROR_USAGE);
79 }
80
81 static struct kwtab rf_param_arg[] = {
82 {"bcch-arfcn", BCCH_ARFCN},
83 {"tch-arfcn", TCH_ARFCN},
84 {"mon-arfcn", MON_ARFCN},
85 {"pdtch-arfcn", PDTCH_ARFCN},
86 {"std-band", STD_BAND_FLAG},
87 {"afc-enable", AFC_ENA_FLAG},
88 {"afc-dac-val", AFC_DAC_VALUE},
89 {"init-afc-dac", INITIAL_AFC_DAC},
90 {"multislot-class", MULTISLOT_CLASS},
91 {0, 0}
92 };
93
94 cmd_rfpw2(argc, argv)
95 char **argv;
96 {
97 u16 index, value;
98
99 if (keyword_or_num(argv[1], rf_param_arg, &index))
100 return(ERROR_USAGE);
101 value = strtol(argv[2], 0, 0);
102 return do_rfpw(index, value);
103 }
104
105 cmd_rfpw3(argc, argv)
106 char **argv;
107 {
108 u16 index;
109 u8 val1, val2;
110
111 if (keyword_or_num(argv[1], rf_param_arg, &index))
112 return(ERROR_USAGE);
113 val1 = strtoul(argv[2], 0, 0);
114 val2 = strtoul(argv[3], 0, 0);
115 return do_rfpw(index, (val2 << 8) | val1);
116 }
117
118 cmd_rfpw(argc, argv)
119 char **argv;
120 {
121 switch (argc) {
122 case 3:
123 return cmd_rfpw2(argc, argv);
124 case 4:
125 return cmd_rfpw3(argc, argv);
126 default:
127 fprintf(stderr, "BUG: wrong argc in cmd_rfpw()\n");
128 return(ERROR_BUG);
129 }
130 }
131
132 cmd_rfpr(argc, argv)
133 char **argv;
134 {
135 u16 index, val;
136 int rc;
137
138 if (keyword_or_num(argv[1], rf_param_arg, &index))
139 return(ERROR_USAGE);
140 rc = do_rfpr(index, &val);
141 if (rc)
142 return(rc);
143 if (val >= 0x8000)
144 printf("read value: 0x%04X (%u or %d)", val, val,
145 (int)val - 65536);
146 else
147 printf("read value: 0x%04X (%u)", val, val);
148 return(0);
149 }
150
151 static struct kwtab rf_table_arg[] = {
152 {"rx-agc-table", RX_AGC_TABLE},
153 {"afcparams", AFC_PARAMS},
154 {"rx-agc-global-params", RX_AGC_GLOBAL_PARAMS},
155 {"rx-il2agc-max", RX_IL_2_AGC_MAX},
156 {"rx-il2agc-pwr", RX_IL_2_AGC_PWR},
157 {"rx-il2agc-av", RX_IL_2_AGC_AV},
158 {"tx-levels", TX_LEVELS},
159 {"tx-calchan", TX_CAL_CHAN},
160 {"tx-caltemp", TX_CAL_TEMP},
161 {"rx-calchan", RX_CAL_CHAN},
162 {"rx-caltemp", RX_CAL_TEMP},
163 {"rx-agcparams", RX_AGC_PARAMS},
164 {0, 0}
165 };
166
167 static struct table_map {
168 int index;
169 int size;
170 void (*func)();
171 } table_map[] = {
172 {RX_AGC_TABLE, 40, write_agcwords_table},
173 {AFC_PARAMS, 24, write_afcparams_table},
174 {RX_AGC_GLOBAL_PARAMS, 8, write_agcglobals_table},
175 {RX_IL_2_AGC_MAX, 121, write_il2agc_table},
176 {RX_IL_2_AGC_PWR, 121, write_il2agc_table},
177 {RX_IL_2_AGC_AV, 121, write_il2agc_table},
178 {TX_LEVELS, 128, write_tx_levels_table},
179 {TX_CAL_CHAN, 128, write_tx_calchan_table},
180 {TX_CAL_TEMP, 40, write_tx_caltemp_table},
181 {RX_CAL_CHAN, 40, write_rx_calchan_table},
182 {RX_CAL_TEMP, 44, write_rx_caltemp_table},
183 {RX_AGC_PARAMS, 8, write_rx_agcparams_table},
184 {0, 0, 0}
185 };
186
187 cmd_rftr(argc, argv)
188 char **argv;
189 {
190 u16 index;
191 struct table_map *tp;
192 u_char table_data[MAX_RF_TABLE_SIZE];
193 int rc;
194
195 if (keyword_or_num(argv[1], rf_table_arg, &index))
196 return(ERROR_USAGE);
197 for (tp = table_map; tp->index; tp++) {
198 if (tp->index == index)
199 break;
200 }
201 if (!tp->index) {
202 printf("error: table index %u not supported, use fc-tmsh\n",
203 index);
204 return(ERROR_USAGE);
205 }
206 rc = do_rftr(index, table_data, tp->size);
207 if (rc)
208 return(rc);
209 tp->func(table_data, stdout);
210 return(0);
211 }
212
213 cmd_ttr(argc, argv)
214 char **argv;
215 {
216 unsigned index;
217 u_char ramp_data[32];
218 int rc;
219
220 index = strtoul(argv[1], 0, 0);
221 if (index >= 16) {
222 printf("error: index out of range\n");
223 return(ERROR_USAGE);
224 }
225 rc = do_ttr(index, ramp_data);
226 if (rc)
227 return(rc);
228 write_tx_ramp(ramp_data, stdout);
229 return(0);
230 }