blob: dd6b28383341cf263a9b5382eecce31f2f93d5a8 [file] [log] [blame]
Venkateshwarlu Domakondaacdd9a42015-03-24 10:28:37 +05301/*
2Copyright (c) 2015, The Linux Foundation. All rights reserved.
3
4Redistribution and use in source and binary forms, with or without
5modification, are permitted provided that the following conditions are
6met:
7 * Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 * Redistributions in binary form must reproduce the above
10 copyright notice, this list of conditions and the following
11 disclaimer in the documentation and/or other materials provided
12 with the distribution.
13 * Neither the name of The Linux Foundation nor the names of its
14 contributors may be used to endorse or promote products derived
15 from this software without specific prior written permission.
16
17THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*/
29
30#include <cstdlib>
31#include <cstring>
32#include <utils/Log.h>
33#include "ConfigFmThs.h"
34#include "FmPerformanceParams.h"
35#include "FmRadioController.h"
36
37static int compare_name
38(
39 const void *name1, const void *name2
40)
41{
42 char *first = (char *)name1;
43 struct NAME_MAP *second = (struct NAME_MAP *)name2;
44
45 return(strcmp(first, second->name));
46}
47
48ConfigFmThs :: ConfigFmThs
49(
50)
51{
52 keyfile = NULL;
53}
54
55ConfigFmThs :: ~ConfigFmThs
56(
57)
58{
59 free_key_file(keyfile);
60}
61
62void ConfigFmThs :: set_band_cfgs
63(
64 UINT fd
65)
66{
67 signed char ret = FM_SUCCESS;
68 char **keys;
69 char **keys_cpy;
70 char *key_value;
71 int value;
72 FmPerformanceParams perf_params;
73 struct NAME_MAP *found;
74
75 if(keyfile != NULL) {
76 keys_cpy = keys = get_keys(keyfile, GRPS_MAP[1].name);
77 if(keys != NULL) {
78 while(*keys != NULL) {
79 ALOGE("key found is: %s\n", *keys);
80 found = (NAME_MAP *)bsearch(*keys, BAND_CFG_MAP,
81 MAX_BAND_PARAMS, sizeof(NAME_MAP), compare_name);
82 if(found != NULL) {
83 key_value = get_value(keyfile,
84 GRPS_MAP[1].name, found->name);
85 if((key_value != NULL) && strcmp(key_value, "")) {
86 value = atoi(key_value);
87 switch(found->num) {
88 case RADIO_BAND:
89 ALOGE("RADIO_BAND\n");
90 if((value >= BAND_87500_108000)
91 && (value <= BAND_76000_90000)) {
92 ALOGE("%s:Set band as: %d\n",__func__, value);
93 ret = perf_params.SetBand(fd, value);
94 if(ret == FM_FAILURE)
95 ALOGE("Error in setting band\n");
96 }
97 break;
98 case EMPHASIS:
99 ALOGE("EMPHASIS\n");
100 if((value >= DE_EMP75)
101 && (value <= DE_EMP50)) {
102 ALOGE("%s:Set Emphasis as: %d\n",__func__, value);
103 ret = perf_params.SetEmphsis(fd, value);
104 if(ret == FM_FAILURE)
105 ALOGE("Error in setting Emphasis\n");
106 }
107 break;
108 case CHANNEL_SPACING:
109 ALOGE("CHANNEL_SPACING\n");
110 if((value >= CHAN_SPACE_200)
111 && (value <= CHAN_SPACE_50)) {
112 ALOGE("%s:Set CH space as: %d\n",__func__, value);
113 ret = perf_params.SetChannelSpacing(fd, value);
114 if(ret == FM_FAILURE)
115 ALOGE("Error in setting channel spacing\n");
116 }
117 break;
118 }
119 }else {
120 ALOGE("key_val for key: %s is empty\n",
121 *keys);
122 }
123 free(key_value);
124 }
125 keys++;
126 }
127 }else {
128 ALOGE("No of keys found is zero\n");
129 }
130 free_strs(keys_cpy);
131 }else {
132 ALOGE("key file is null\n");
133 }
134}
135
136void ConfigFmThs :: set_af_ths
137(
138 UINT fd
139)
140{
141 signed char ret = FM_SUCCESS;
142 char **keys;
143 char **keys_cpy;
144 char *key_value;
145 int value;
146 FmPerformanceParams perf_params;
147 struct NAME_MAP *found;
148
149 if(keyfile != NULL) {
150 keys_cpy = keys = get_keys(keyfile, GRPS_MAP[0].name);
151 if(keys != NULL) {
152 while(*keys != NULL) {
153 ALOGE("key found is: %s\n", *keys);
154 found = (NAME_MAP *)bsearch(*keys, AF_PARAMS_MAP,
155 MAX_AF_PARAMS, sizeof(NAME_MAP), compare_name);
156 if(found != NULL) {
157 key_value = get_value(keyfile,
158 GRPS_MAP[0].name, found->name);
159 if((key_value != NULL) && strcmp(key_value, "")) {
160 value = atoi(key_value);
161 switch(found->num) {
162 case AF_RMSSI_TH:
163 if((value >= AF_RMSSI_TH_MIN)
164 && (value <= AF_RMSSI_TH_MAX)) {
165 ALOGE("Set af rmssi th: %d\n", value);
166 ret = perf_params.SetAfRmssiTh(fd, value);
167 if(ret == FM_FAILURE) {
168 ALOGE("Error in setting Af Rmssi th\n");
169 break;
170 }
171 unsigned short th;
172 ret = perf_params.GetAfRmssiTh(fd, th);
173 if(ret == FM_SUCCESS) {
174 ALOGE("Read af rmssith: %hd\n", th);
175 }else {
176 ALOGE("Error in reading Af Rmssi th\n");
177 }
178 }
179 break;
180 case AF_RMSSI_SAMPLES:
181 if((value >= AF_RMSSI_SAMPLES_MIN)
182 && (value <= AF_RMSSI_SAMPLES_MAX)) {
183 ALOGE("Set af rmssi samples cnt: %d\n", value);
184 ret = perf_params.SetAfRmssiSamplesCnt(fd, value);
185 if(ret == FM_FAILURE) {
186 ALOGE("Error in setting af rmssi samples\n");
187 break;
188 }
189 unsigned char cnt;
190 ret = perf_params.GetAfRmssiSamplesCnt(fd, cnt);
191 if(ret == FM_SUCCESS) {
192 ALOGE("Read af rmssi samples cnt: %hhd\n", cnt);
193 }else {
194 ALOGE("Error in reading rmssi samples\n");
195 }
196 }
197 break;
198 case GOOD_CH_RMSSI_TH:
199 if((value >= GOOD_CH_RMSSI_TH_MIN)
200 && (value <= GOOD_CH_RMSSI_TH_MAX)) {
201 ALOGE("Set Good channle rmssi th: %d\n", value);
202 ret = perf_params.SetGoodChannelRmssiTh(fd, value);
203 if(ret == FM_FAILURE) {
204 ALOGE("Error in setting Good channle rmssi th\n");
205 break;
206 }
207 signed char th;
208 ret = perf_params.GetGoodChannelRmssiTh(fd, th);
209 if(ret == FM_SUCCESS) {
210 ALOGE("Read good channel rmssi th: %d\n", th);
211 }else {
212 ALOGE("Error in reading Good channle rmssi th\n");
213 }
214 }
215 break;
216 }
217 }else {
218 ALOGE("key_val for key: %s is empty\n",
219 *keys);
220 }
221 free(key_value);
222 }
223 keys++;
224 }
225 }else {
226 ALOGE("No of keys found is zero\n");
227 }
228 free_strs(keys_cpy);
229 }else {
230 ALOGE("key file is null\n");
231 }
232}
233
234void ConfigFmThs :: set_srch_ths
235(
236 UINT fd
237)
238{
239 signed char ret = FM_SUCCESS;
240 char **keys = NULL;
241 char **keys_cpy = NULL;
242 char *key_value = NULL;
243 int value;
244 FmPerformanceParams perf_params;
245 struct NAME_MAP *found = NULL;
246
247 if(keyfile != NULL) {
248 keys_cpy = keys = get_keys(keyfile, GRPS_MAP[3].name);
249 if(keys != NULL) {
250 while(*keys != NULL) {
251 found = (NAME_MAP *)bsearch(*keys, SEACH_PARAMS_MAP,
252 MAX_SRCH_PARAMS, sizeof(NAME_MAP), compare_name);
253 if(found != NULL) {
254 key_value = get_value(keyfile, GRPS_MAP[2].name, found->name);
255 ALOGE("found srch ths: %s: %s\n", found->name, key_value);
256 if((key_value != NULL) && strcmp(key_value, "")) {
257 value = atoi(key_value);
258 switch(found->num) {
259 case SINR_FIRST_STAGE:
260 if((value >= SINR_FIRST_STAGE_MIN)
261 && (value <= SINR_FIRST_STAGE_MAX)) {
262 ALOGE("Set sinr first stage: %d\n", value);
263 ret = perf_params.SetSinrFirstStage(fd, value);
264 if(ret == FM_FAILURE) {
265 ALOGE("Error in setting sinr first stage\n");
266 break;
267 }
268 signed char th;
269 ret = perf_params.GetSinrFirstStage(fd, th);
270 if(ret == FM_SUCCESS) {
271 ALOGE("Read sinr first stage: %d\n", th);
272 }else {
273 ALOGE("Error in reading sinr first stage\n");
274 }
275 }
276 break;
277 case RMSSI_FIRST_STAGE:
278 if((value >= RMSSI_FIRST_STAGE_MIN)
279 && (value <= RMSSI_FIRST_STAGE_MAX)) {
280 ALOGE("Set rmssi first stage: %d\n", value);
281 ret = perf_params.SetRmssiFirstStage(fd, value);
282 if(ret == FM_FAILURE) {
283 ALOGE("Error in setting rmssi first stage\n");
284 break;
285 }
286 signed char th;
287 ret = perf_params.GetRmssiFirstStage(fd, th);
288 if(ret == FM_SUCCESS) {
289 ALOGE("Read rmssi first stage: %d\n", th);
290 }else {
291 ALOGE("Error in reading rmssi first stage\n");
292 }
293 }
294 break;
295 case INTF_LOW_TH:
296 if((value >= INTF_LOW_TH_MIN)
297 && (value <= INTF_LOW_TH_MAX)) {
298 ALOGE("Set intf low th: %d\n", value);
299 ret = perf_params.SetIntfLowTh(fd, value);
300 if(ret == FM_FAILURE) {
301 ALOGE("Error in setting intf low th\n");
302 break;
303 }
304 unsigned char th;
305 ret = perf_params.GetIntfLowTh(fd, th);
306 if(ret == FM_SUCCESS) {
307 ALOGE("Read intf low th: %u\n", th);
308 }else {
309 ALOGE("Error in reading intf low th\n");
310 }
311 }
312 break;
313 case INTF_HIGH_TH:
314 if((value >= INTF_HIGH_TH_MIN)
315 && (value <= INTF_HIGH_TH_MAX)) {
316 ALOGE("Set intf high th: %d\n", value);
317 ret = perf_params.SetIntfHighTh(fd, value);
318 if(ret == FM_FAILURE) {
319 ALOGE("Error in setting intf high th\n");
320 break;
321 }
322 unsigned char th;
323 ret = perf_params.GetIntfHighTh(fd, th);
324 if(ret == FM_SUCCESS) {
325 ALOGE("Read intf high th: %u\n", th);
326 }else {
327 ALOGE("Error in reading intf high th\n");
328 }
329 }
330 break;
331 case CF0_TH:
332 ALOGE("Set cf0 th: %d\n", value);
333 ret = perf_params.SetCf0Th12(fd, value);
334 if(ret == FM_FAILURE) {
335 ALOGE("Error in setting cf0 th\n");
336 break;
337 }
338 int th;
339 ret = perf_params.GetCf0Th12(fd, th);
340 if(ret == FM_SUCCESS) {
341 ALOGE("Read CF012 th: %d\n", th);
342 }else {
343 ALOGE("Error in reading cf0 th\n");
344 }
345 break;
346 case SRCH_ALGO_TYPE:
347 if((value >= SRCH_ALGO_TYPE_MIN)
348 && (value <= SRCH_ALGO_TYPE_MAX)) {
349 ALOGE("Set search algo type: %d\n", value);
350 ret = perf_params.SetSrchAlgoType(fd, value);
351 if(ret == FM_FAILURE) {
352 ALOGE("Error in setting search algo type\n");
353 break;
354 }
355 unsigned char algo;
356 ret = perf_params.GetSrchAlgoType(fd, algo);
357 if(ret == FM_SUCCESS) {
358 ALOGE("Read algo type: %u\n", algo);
359 }else {
360 ALOGE("Error in reading search algo type\n");
361 }
362 }
363 break;
364 case SINR_SAMPLES:
365 if((value >= SINR_SAMPLES_CNT_MIN)
366 && (value <= SINR_SAMPLES_CNT_MAX)) {
367 ALOGE("Set sinr samples count: %d\n", value);
368 ret = perf_params.SetSinrSamplesCnt(fd, value);
369 if(ret == FM_FAILURE) {
370 ALOGE("Error in setting sinr samples count\n");
371 break;
372 }
373 unsigned char cnt;
374 ret = perf_params.GetSinrSamplesCnt(fd, cnt);
375 if(ret == FM_SUCCESS) {
376 ALOGE("Read sinr samples cnt: %u\n", cnt);
377 }else {
378 ALOGE("Error in reading sinr samples count\n");
379 }
380 }
381 break;
382 case SINR:
383 if((value >= SINR_FINAL_STAGE_MIN)
384 && (value <= SINR_FINAL_STAGE_MAX)) {
385 ALOGE("Set final stage sinr: %d\n", value);
386 ret = perf_params.SetSinrFinalStage(fd, value);
387 if(ret == FM_FAILURE) {
388 ALOGE("Error in setting final stage sinr\n");
389 break;
390 }
391 signed char th;
392 ret = perf_params.GetSinrFinalStage(fd, th);
393 if(ret == FM_SUCCESS) {
394 ALOGE("Read final stage sinr: %d\n", th);
395 }else {
396 ALOGE("Error in reading final stage sinr\n");
397 }
398 }
399 break;
400 }
401 }else {
402 ALOGE("key_value for key: %s is empty\n",
403 *keys);
404 }
405 free(key_value);
406 }
407 keys++;
408 }
409 }else {
410 ALOGE("No of keys found is zero\n");
411 }
412 free_strs(keys_cpy);
413 }else {
414 ALOGE("key file is null\n");
415 }
416}
417
418void ConfigFmThs :: set_hybrd_list
419(
420 UINT fd
421)
422{
423 signed char ret = FM_SUCCESS;
424 char **keys = NULL;
425 char **keys_cpy = NULL;
426 char *key_value = NULL;
427 char *freqs = NULL;
428 unsigned int *freqs_array = NULL;
429 signed char *sinrs_array = NULL;
430 char *sinrs = NULL;
431 int value;
432 unsigned int freq_cnt = 0;
433 unsigned int sinr_cnt = 0;
434 FmPerformanceParams perf_params;
435 struct NAME_MAP *found;
436
437 ALOGE("Inside hybrid srch list\n");
438 if(keyfile != NULL) {
439 keys_cpy = keys = get_keys(keyfile, GRPS_MAP[2].name);
440 if(keys != NULL) {
441 while(*keys != NULL) {
442 found = (NAME_MAP *)bsearch(*keys, HYBRD_SRCH_MAP,
443 MAX_HYBRID_SRCH_PARAMS, sizeof(NAME_MAP), compare_name);
444 if(found != NULL) {
445 key_value = get_value(keyfile, GRPS_MAP[1].name, found->name);
446 if((key_value != NULL) && strcmp(key_value, "")) {
447 switch(found->num) {
448 case FREQ_LIST:
449 freqs = key_value;
450 break;
451 case SINR_LIST:
452 sinrs = key_value;
453 break;
454 default:
455 free(key_value);
456 break;
457 }
458 }
459 }
460 keys++;
461 }
462 free_strs(keys_cpy);
463 }else {
464 ALOGE("No of keys found is zero\n");
465 }
466 }else {
467 ALOGE("key file is null\n");
468 }
469
470 freq_cnt = extract_comma_sep_freqs(freqs, &freqs_array, ",");
471 sinr_cnt = extract_comma_sep_sinrs(sinrs, &sinrs_array, ",");
472
473 if((freq_cnt == sinr_cnt) && (sinr_cnt > 0)) {
474 perf_params.SetHybridSrchList(fd, freqs_array, sinrs_array, freq_cnt);
475 }
476
477 free(freqs);
478 free(sinrs);
479 free(freqs_array);
480 free(sinrs_array);
481}
482
483unsigned int ConfigFmThs :: extract_comma_sep_freqs
484(
485 char *freqs,
486 unsigned int **freqs_arr,
487 const char *str
488)
489{
490 char *next_freq;
Mahesh Kumar Sharma256218b2015-08-13 17:05:53 -0700491 char *saveptr;
Venkateshwarlu Domakondaacdd9a42015-03-24 10:28:37 +0530492 unsigned int freq;
493 unsigned int *freqs_new_arr;
494 unsigned int size = 0;
495 unsigned int len = 0;
496
Mahesh Kumar Sharma256218b2015-08-13 17:05:53 -0700497 next_freq = strtok_r(freqs, str, &saveptr);
Venkateshwarlu Domakondaacdd9a42015-03-24 10:28:37 +0530498 while(next_freq != NULL) {
499 freq = atoi(next_freq);
500 ALOGD("HYBRID_SRCH freq: %u\n", freq);
501 if(size == len) {
502 size <<= 1;
503 if(size == 0)
504 size = 1;
505 freqs_new_arr = (unsigned int *)realloc(*freqs_arr,
506 size * sizeof(unsigned int));
507 if(freqs_new_arr == NULL) {
508 free(*freqs_arr);
509 *freqs_arr = NULL;
510 break;
511 }
512 *freqs_arr = freqs_new_arr;
513 }
514 (*freqs_arr)[len] = freq;
515 len++;
Mahesh Kumar Sharma256218b2015-08-13 17:05:53 -0700516 next_freq = strtok_r(NULL, str, &saveptr);
Venkateshwarlu Domakondaacdd9a42015-03-24 10:28:37 +0530517 }
518 return len;
519}
520
521unsigned int ConfigFmThs :: extract_comma_sep_sinrs
522(
523 char *sinrs,
524 signed char **sinrs_arr,
525 const char *str
526)
527{
528 char *next_sinr;
Mahesh Kumar Sharma256218b2015-08-13 17:05:53 -0700529 char *saveptr;
Venkateshwarlu Domakondaacdd9a42015-03-24 10:28:37 +0530530 signed char *sinrs_new_arr;
531 unsigned int size = 0;
532 unsigned int len = 0;
533 signed char sinr;
534
Mahesh Kumar Sharma256218b2015-08-13 17:05:53 -0700535 next_sinr = strtok_r(sinrs, str, &saveptr);
Venkateshwarlu Domakondaacdd9a42015-03-24 10:28:37 +0530536 while(next_sinr != NULL) {
537 sinr = atoi(next_sinr);
538 ALOGD("HYBRID_SRCH sinr: %d\n", sinr);
539 if(size == len) {
540 size <<= 1;
541 if(size == 0)
542 size = 1;
543 sinrs_new_arr = (signed char *)realloc(*sinrs_arr,
544 size * sizeof(signed char));
545 if(sinrs_new_arr == NULL) {
546 free(*sinrs_arr);
547 *sinrs_arr = NULL;
548 break;
549 }
550 *sinrs_arr = sinrs_new_arr;
551 }
552 (*sinrs_arr)[len] = sinr;
553 len++;
Mahesh Kumar Sharma256218b2015-08-13 17:05:53 -0700554 next_sinr = strtok_r(NULL, str,&saveptr);
Venkateshwarlu Domakondaacdd9a42015-03-24 10:28:37 +0530555 }
556 return len;
557}
558
559void ConfigFmThs :: SetRxSearchAfThs
560(
561 const char *file, UINT fd
562)
563{
564 int index;
565 struct NAME_MAP *found;
566 char **grps = NULL;
567 char **grps_cpy = NULL;
568
569 keyfile = get_key_file();
570
571 ALOGE("file name is: %s\n", file);
572 if(!parse_load_file(keyfile, file)) {
573 ALOGE("Error in loading threshold file\n");
574 }else {
575 grps_cpy = grps = get_grps(keyfile);
576 if(grps != NULL) {
577 while(*grps != NULL) {
578 ALOGE("Search grp: %s\n", *grps);
579 found = (NAME_MAP *)bsearch(*grps, GRPS_MAP, MAX_GRPS,
580 sizeof(NAME_MAP), compare_name);
581 if(found != NULL) {
582 ALOGE("Found group: %s\n", found->name);
583 switch(found->num) {
584 case AF_THS:
585 set_af_ths(fd);
586 break;
587 case SRCH_THS:
588 set_srch_ths(fd);
589 break;
590 case HYBRD_SRCH_LIST:
591 set_hybrd_list(fd);
592 break;
593 case BAND_CFG:
594 set_band_cfgs(fd);
595 break;
596 }
597 }
598 grps++;
599 }
600 }else {
601 ALOGE("No of groups found is zero\n");
602 }
603 free_strs(grps_cpy);
604 }
605 free_key_file(keyfile);
606 keyfile = NULL;
607}