FreeCalypso > hg > freecalypso-tools
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 } |