summaryrefslogtreecommitdiffstats
path: root/qcom
diff options
context:
space:
mode:
authorVenkateshwarlu Domakonda <vdomak@codeaurora.org>2014-05-19 10:41:10 +0530
committerVenkateshwarlu Domakonda <vdomak@codeaurora.org>2014-05-23 21:22:54 +0530
commitc748b4b9ab0ad836cafa4c15cd73b2b0f5e37d63 (patch)
treed8d95642805ea090de34f940dc8d802683f34117 /qcom
parent5e32924236b3f6e7849edc430cc0c35bf9e95f78 (diff)
downloadandroid_hardware_qcom_fm-c748b4b9ab0ad836cafa4c15cd73b2b0f5e37d63.tar.gz
android_hardware_qcom_fm-c748b4b9ab0ad836cafa4c15cd73b2b0f5e37d63.tar.bz2
android_hardware_qcom_fm-c748b4b9ab0ad836cafa4c15cd73b2b0f5e37d63.zip
FM: Add support to configure the spur Rotation table
- Add support to configure the FM SOC spur table. Change-Id: I817268be67f29dfb6862314dc90a915c01f40342 CRs-Fixed: 664779
Diffstat (limited to 'qcom')
-rw-r--r--qcom/fmradio/FmConfig.java53
-rw-r--r--qcom/fmradio/FmReceiver.java46
-rw-r--r--qcom/fmradio/FmReceiverJNI.java8
-rw-r--r--qcom/fmradio/FmRxEventListner.java4
-rw-r--r--qcom/fmradio/FmTransceiver.java7
-rw-r--r--qcom/fmradio/Spur.java83
-rw-r--r--qcom/fmradio/SpurDetails.java105
-rw-r--r--qcom/fmradio/SpurFileFormatConst.java60
-rw-r--r--qcom/fmradio/SpurFileParser.java227
-rw-r--r--qcom/fmradio/SpurFileParserInterface.java34
-rw-r--r--qcom/fmradio/SpurTable.java72
11 files changed, 698 insertions, 1 deletions
diff --git a/qcom/fmradio/FmConfig.java b/qcom/fmradio/FmConfig.java
index 3044cc2..728d1d3 100644
--- a/qcom/fmradio/FmConfig.java
+++ b/qcom/fmradio/FmConfig.java
@@ -30,7 +30,7 @@ package qcom.fmradio;
import android.util.Log;
import android.os.SystemProperties;
-
+import java.util.List;
/**
*
@@ -47,6 +47,9 @@ public class FmConfig {
private static final int V4L2_CID_PRIVATE_TAVARUA_SPACING = V4L2_CID_PRIVATE_BASE + 14;
private static final int V4L2_CID_PRIVATE_TAVARUA_SRCH_ALGORITHM = V4L2_CID_PRIVATE_BASE + 0x2B;
+ private static final int each_Spur_entry_size = 16;
+ public static final int no_Of_Spurs_For_Entry = 3;
+
private static final String TAG = "FmConfig";
@@ -91,6 +94,54 @@ public class FmConfig {
*/
private int mBandUpperLimit;
+ public static boolean fmSpurConfig(int fd) {
+ SpurFileParser parser = new SpurFileParser();
+ SpurTable t;
+ int freq = 0, i = 0, j = 0;
+ byte no_of_spur_freq = 0;
+ int rotation_value = 0;
+ int re;
+
+ t = parser.GetSpurTable("/etc/fm/SpurTableFile.txt");
+ List <Spur> list = t.GetSpurList();
+ no_of_spur_freq = t.GetspurNoOfFreq();
+ short [] buff = new short[2 + (no_of_spur_freq * each_Spur_entry_size)];
+ buff[0] = t.GetMode();
+ buff[1] = no_of_spur_freq;
+ for(i = 0; i < no_of_spur_freq; i++) {
+ List <Spur> spur = t.GetSpurList();
+ freq = spur.get(i).getSpurFreq();
+ buff[(i * each_Spur_entry_size) + 2] = (short)(freq & 0xff);
+ buff[(i * each_Spur_entry_size) + 3] = (short)((freq >> 8) & 0xff);
+ buff[(i * each_Spur_entry_size) + 4] = (short)((freq >> 16) & 0xff);
+ buff[(i * each_Spur_entry_size) + 5] = spur.get(i).getNoOfSpursToTrack();
+ List <SpurDetails> spurDetails =
+ spur.get(i).getSpurDetailsList();
+ for(j = 0; j < no_Of_Spurs_For_Entry; j++) {
+ rotation_value = spurDetails.get(j).getRotationValue();
+ buff[(j * 4) + 6 + (i * each_Spur_entry_size)] =
+ (short)(rotation_value & 0xff);
+ buff[(j * 4) + 7 + (i * each_Spur_entry_size)] =
+ (short)((rotation_value >> 8) & 0xff);
+ buff[(j * 4) + 8 + (i * each_Spur_entry_size)] =
+ (short)((rotation_value >> 12) & 0xff);
+ buff[(j * 4) + 8 + (i * each_Spur_entry_size)] |=
+ (short)(spurDetails.get(j).getLsbOfIntegrationLength() << 4);
+ buff[(j * 4) + 8 + (i * each_Spur_entry_size)] |=
+ (short)(spurDetails.get(j).getFilterCoefficeint() << 5);
+ buff[(j * 4) + 8 + (i * each_Spur_entry_size)] |=
+ (short)(spurDetails.get(j).getIsEnableSpur() << 7);
+ buff[(j * 4) + 9 + (i * each_Spur_entry_size)] =
+ (short)spurDetails.get(j).getSpurLevel();
+ }
+ }
+ re = FmReceiverJNI.setSpurDataNative(fd, buff,
+ (2 + (no_of_spur_freq * each_Spur_entry_size)));
+ if (re < 0)
+ return false;
+ return true;
+ }
+
public int getRadioBand(){
return mRadioBand;
}
diff --git a/qcom/fmradio/FmReceiver.java b/qcom/fmradio/FmReceiver.java
index b1bdb31..832cb29 100644
--- a/qcom/fmradio/FmReceiver.java
+++ b/qcom/fmradio/FmReceiver.java
@@ -259,6 +259,8 @@ public class FmReceiver extends FmTransceiver
private static final int V4L2_CID_PRIVATE_BASE = 0x8000000;
private static final int V4L2_CID_PRIVATE_TAVARUA_SIGNAL_TH = V4L2_CID_PRIVATE_BASE + 8;
+ private static final int V4L2_CTRL_CLASS_USER = 0x00980000;
+ private static final int V4L2_CID_PRIVATE_IRIS_GET_SPUR_TBL = (V4L2_CTRL_CLASS_USER + 0x92E);
private static final int TAVARUA_BUF_SRCH_LIST=0;
@@ -2535,4 +2537,48 @@ public class FmReceiver extends FmTransceiver
{
return mControl.configureSpurTable(sFd);
}
+
+ public static int getSpurConfiguration(int freq)
+ {
+ int retval;
+
+ retval = FmReceiverJNI.setControlNative(sFd, V4L2_CID_PRIVATE_IRIS_GET_SPUR_TBL, freq);
+
+ if (retval !=0)
+ Log.d(TAG, "Failed/No Spurs for " +freq);
+ return retval;
+ }
+
+ public static void getSpurTableData()
+ {
+ int freq;
+ byte no_of_spurs;
+ int rotation_value;
+ byte lsbOfLen;
+ byte filterCoe;
+ byte isEnbale;
+ byte [] buff = new byte[STD_BUF_SIZE];
+ int i = 0;
+ FmReceiverJNI.getBufferNative(sFd, buff, 13);
+
+ freq = buff[0] & 0xFF;
+ freq |= ((buff[1] & 0xFF) << 8);
+ freq |= ((buff[2] & 0xFF) << 16);
+ Log.d (TAG, "freq = " +freq);
+ no_of_spurs = buff[3];
+ Log.d (TAG, "no_of_spurs = " + no_of_spurs);
+ for(i = 0; i < FmConfig.no_Of_Spurs_For_Entry; i++) {
+ rotation_value = buff[(i * 4) + 4] & 0xFF;
+ rotation_value |= ((buff[(i * 4) + 5] & 0xFF) << 8);
+ rotation_value |= ((buff[(i * 4) + 6] & 0x0F) << 12);
+ Log.d (TAG, "rotation_value = " +rotation_value);
+ lsbOfLen = (byte) (((buff[(i * 4) + 6] & 0xF0) >> 4) & 0x01);
+ Log.d (TAG, "lsbOfLen = "+lsbOfLen);
+ filterCoe = (byte) (((buff[(i * 4) + 6] & 0xF0) >> 5) & 0x03);
+ Log.d (TAG, "filterCoe = " +filterCoe);
+ isEnbale = (byte) (((buff[(i * 4) + 6] & 0xF0) >> 7) & 0x01);
+ Log.d (TAG, "spur level: " +buff[(i * 4) + 7]);
+ }
+ return;
+ }
}
diff --git a/qcom/fmradio/FmReceiverJNI.java b/qcom/fmradio/FmReceiverJNI.java
index 3c779c2..db75ccb 100644
--- a/qcom/fmradio/FmReceiverJNI.java
+++ b/qcom/fmradio/FmReceiverJNI.java
@@ -282,4 +282,12 @@ class FmReceiverJNI {
* {@link #FM_JNI_FAILURE}
*/
static native int configureSpurTable(int fd);
+
+ /**
+ * native method: Configures the new spur table
+ * @param fd file descriptor of device
+ * @return {@link #FM_JNI_SUCCESS}
+ * {@link #FM_JNI_FAILURE}
+ */
+ static native int setSpurDataNative(int fd, short buff[], int len);
}
diff --git a/qcom/fmradio/FmRxEventListner.java b/qcom/fmradio/FmRxEventListner.java
index 865aac7..de39d91 100644
--- a/qcom/fmradio/FmRxEventListner.java
+++ b/qcom/fmradio/FmRxEventListner.java
@@ -230,6 +230,10 @@ class FmRxEventListner {
Log.d(TAG, "got eRT event");
cb.FmRxEvERTInfo();
break;
+ case 22:
+ Log.d(TAG, "got IRIS_EVT_SPUR_TBL event");
+ FmReceiver.getSpurTableData();
+ break;
default:
Log.d(TAG, "Unknown event");
break;
diff --git a/qcom/fmradio/FmTransceiver.java b/qcom/fmradio/FmTransceiver.java
index 20f0544..fa2378e 100644
--- a/qcom/fmradio/FmTransceiver.java
+++ b/qcom/fmradio/FmTransceiver.java
@@ -29,6 +29,7 @@
package qcom.fmradio;
import android.util.Log;
+import java.io.File;
/** <code>FmTransceiver</code> is the superclass of classes
* <code>FmReceiver</code> and <code>FmTransmitter</code>
@@ -406,6 +407,12 @@ public class FmTransceiver
if( !acquire("/dev/radio0")){
return false;
}
+ if (new File("/etc/fm/SpurTableFile.txt").isFile()) {
+ Log.d(TAG, "Send Spur roation table");
+ FmConfig.fmSpurConfig(sFd);
+ } else {
+ Log.d(TAG, "No existing file to do spur configuration");
+ }
Log.d(TAG, "turning on " + device);
mControl.fmOn(sFd, device);
diff --git a/qcom/fmradio/Spur.java b/qcom/fmradio/Spur.java
new file mode 100644
index 0000000..d60d4e9
--- /dev/null
+++ b/qcom/fmradio/Spur.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of The Linux Foundation nor
+ * the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package qcom.fmradio;
+import java.util.ArrayList;
+import java.util.List;
+
+public class Spur {
+
+ private int SpurFreq;
+ private byte NoOfSpursToTrack;
+ private List <SpurDetails> spurDetailsList;
+
+ Spur() {
+
+ }
+
+ Spur(int SpurFreq, byte NoOfSpursToTrack,
+ List <SpurDetails> spurDetailsList) {
+
+ this.SpurFreq = SpurFreq;
+ this.NoOfSpursToTrack = NoOfSpursToTrack;
+ this.spurDetailsList = spurDetailsList;
+ }
+
+ public int getSpurFreq() {
+ return SpurFreq;
+ }
+
+ public void setSpurFreq(int spurFreq) {
+ SpurFreq = spurFreq;
+ }
+
+ public byte getNoOfSpursToTrack() {
+ return NoOfSpursToTrack;
+ }
+
+ public void setNoOfSpursToTrack(byte noOfSpursToTrack) {
+ NoOfSpursToTrack = noOfSpursToTrack;
+ }
+
+ public List<SpurDetails> getSpurDetailsList() {
+ return spurDetailsList;
+ }
+
+ public void setSpurDetailsList(List<SpurDetails> spurDetailsList) {
+ this.spurDetailsList = spurDetailsList;
+ }
+
+ public void addSpurDetails(SpurDetails spurDetails) {
+ if (spurDetailsList == null) {
+ spurDetailsList = new ArrayList<SpurDetails>();
+ }
+ spurDetailsList.add(spurDetails);
+ }
+
+}
+
diff --git a/qcom/fmradio/SpurDetails.java b/qcom/fmradio/SpurDetails.java
new file mode 100644
index 0000000..2683b1c
--- /dev/null
+++ b/qcom/fmradio/SpurDetails.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of The Linux Foundation nor
+ * the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package qcom.fmradio;
+
+import java.util.List;
+
+public class SpurDetails {
+
+ private int RotationValue;
+ private byte LsbOfIntegrationLength;
+ private byte FilterCoefficeint;
+ private byte IsEnableSpur;
+ private byte SpurLevel;
+
+
+ public int getRotationValue() {
+ return RotationValue;
+ }
+
+ public void setRotationValue(int rotationValue) {
+ RotationValue = rotationValue;
+ }
+
+ public byte getLsbOfIntegrationLength() {
+ return LsbOfIntegrationLength;
+ }
+
+ public void setLsbOfIntegrationLength(byte lsbOfIntegrationLength) {
+ LsbOfIntegrationLength = lsbOfIntegrationLength;
+ }
+
+ public byte getFilterCoefficeint() {
+ return FilterCoefficeint;
+ }
+
+ public void setFilterCoefficeint(byte filterCoefficeint) {
+ FilterCoefficeint = filterCoefficeint;
+ }
+
+ public byte getIsEnableSpur() {
+ return IsEnableSpur;
+ }
+
+ public void setIsEnableSpur(byte isEnableSpur) {
+ IsEnableSpur = isEnableSpur;
+ }
+
+ public byte getSpurLevel() {
+ return SpurLevel;
+ }
+
+ public void setSpurLevel(byte spurLevel) {
+ SpurLevel = spurLevel;
+ }
+
+ SpurDetails(int RotationValue, byte LsbOfIntegrationLength,
+ byte FilterCoefficeint, byte IsEnableSpur, byte SpurLevel) {
+
+ this.RotationValue = RotationValue;
+ this.LsbOfIntegrationLength = LsbOfIntegrationLength;
+ this.IsEnableSpur = IsEnableSpur;
+ this.SpurLevel = SpurLevel;
+ }
+
+ public SpurDetails() {
+
+ }
+
+ public SpurDetails(SpurDetails spurDetails) {
+ if (spurDetails != null) {
+ this.RotationValue = spurDetails.RotationValue;
+ this.LsbOfIntegrationLength =
+ spurDetails.LsbOfIntegrationLength;
+ this.IsEnableSpur = spurDetails.IsEnableSpur;
+ this.SpurLevel = spurDetails.SpurLevel;
+ }
+ }
+
+}
diff --git a/qcom/fmradio/SpurFileFormatConst.java b/qcom/fmradio/SpurFileFormatConst.java
new file mode 100644
index 0000000..e9c03aa
--- /dev/null
+++ b/qcom/fmradio/SpurFileFormatConst.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of The Linux Foundation nor
+ * the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package qcom.fmradio;
+
+import java.util.regex.Pattern;
+
+public final class SpurFileFormatConst {
+ public static final String SPUR_MODE = "Mode";
+ public static final String SPUR_NUM_ENTRY = "SpurNumEntry";
+ public static final String SPUR_FREQ = "SpurFreq";
+ public static final String SPUR_NO_OF = "NoOfSpursToTrack";
+ public static final String SPUR_ROTATION_VALUE = "RotationValue";
+ public static final String SPUR_LSB_LENGTH = "LsbOfIntegrationLength";
+ public static final String SPUR_FILTER_COEFF = "FilterCoefficeint";
+ public static final String SPUR_IS_ENABLE = "IsEnableSpur";
+ public static final String SPUR_LEVEL = "SpurLevel";
+ public static final char COMMENT = '#';
+ public static final char DELIMETER = '=';
+ public static final Pattern SPACE_PATTERN = Pattern.compile("\\s");
+ public static int SPUR_DETAILS_FOR_EACH_FREQ_CNT = 5;
+
+ public enum LineType {
+ EMPTY_LINE,
+ SPUR_MODE_LINE,
+ SPUR_N_ENTRY_LINE,
+ SPUR_FR_LINE,
+ SPUR_NO_OF_LINE,
+ SPUR_ROT0_LINE,
+ SPUR_LSB0_LINE,
+ SPUR_FILTER0_LINE,
+ SPUR_ENABLE0_LINE,
+ SPUR_LEVEL0_LINE,
+ }
+}
diff --git a/qcom/fmradio/SpurFileParser.java b/qcom/fmradio/SpurFileParser.java
new file mode 100644
index 0000000..d9f494e
--- /dev/null
+++ b/qcom/fmradio/SpurFileParser.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of The Linux Foundation nor
+ * the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package qcom.fmradio;
+
+import java.io.BufferedReader;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.regex.Matcher;
+import android.util.Log;
+import qcom.fmradio.SpurFileFormatConst.LineType;
+
+public class SpurFileParser implements SpurFileParserInterface {
+
+ private static final String TAG = "SPUR";
+
+ private boolean parse(BufferedReader reader, SpurTable t) {
+ int entryFound = 0;
+
+ if (t == null ) {
+ return false;
+ }
+
+ if ((reader != null)) {
+ String line;
+ LineType lastLine = LineType.EMPTY_LINE;
+ int indexEqual;
+ int SpurFreq = 0;
+ byte NoOfSpursToTrack = 0;
+ int RotationValue = 0;
+ byte LsbOfIntegrationLength = 0;
+ byte FilterCoefficeint = 0;
+ byte IsEnableSpur = 0;
+ byte spurLevel = 0;
+ byte noOfSpursFreq = 0;
+ byte mode;
+ byte freqCnt = 0;
+
+ try {
+ while(reader.ready() && (line = reader.readLine()) != null) {
+ line = removeSpaces(line);
+ System.out.println("line : " + line);
+ if (lineIsComment(line)) {
+ continue;
+ }
+ if ((entryFound == 2) && (freqCnt <= noOfSpursFreq)) {
+ if ((lastLine == LineType.EMPTY_LINE) &&
+ lineIsOfType(line, SpurFileFormatConst.SPUR_FREQ)) {
+
+ indexEqual = line.indexOf(SpurFileFormatConst.DELIMETER);
+ SpurFreq = Integer.parseInt(line.substring(indexEqual + 1));
+ lastLine = LineType.SPUR_FR_LINE;
+ freqCnt++;
+ } else if((lastLine == LineType.SPUR_FR_LINE) &&
+ lineIsOfType(line, SpurFileFormatConst.SPUR_NO_OF)) {
+
+ indexEqual = line.indexOf(SpurFileFormatConst.DELIMETER);
+ NoOfSpursToTrack = Byte.parseByte(line.substring(indexEqual + 1));
+ Spur spur = new Spur();
+ spur.setSpurFreq(SpurFreq);
+ spur.setNoOfSpursToTrack(NoOfSpursToTrack);
+ for(int i = 0; i < 3; i++) {
+ SpurDetails spurDetails = new SpurDetails();
+ for(int j = 0; (reader.ready()) &&
+ (j < SpurFileFormatConst.SPUR_DETAILS_FOR_EACH_FREQ_CNT); j++) {
+
+ line = reader.readLine();
+ line = removeSpaces(line);
+ System.out.println("inside line: " + line);
+ if (lineIsOfType(line,
+ (SpurFileFormatConst.SPUR_ROTATION_VALUE + i))) {
+
+ indexEqual = line.indexOf(SpurFileFormatConst.DELIMETER);
+ RotationValue = Integer.parseInt(
+ line.substring(indexEqual + 1));
+ spurDetails.setRotationValue(RotationValue);
+ } else if(lineIsOfType(line,
+ SpurFileFormatConst.SPUR_LSB_LENGTH + i)) {
+
+ indexEqual = line.indexOf(SpurFileFormatConst.DELIMETER);
+ LsbOfIntegrationLength = Byte.parseByte(
+ line.substring(indexEqual + 1));
+ spurDetails.setLsbOfIntegrationLength(
+ LsbOfIntegrationLength);
+ } else if(lineIsOfType(line,
+ SpurFileFormatConst.SPUR_FILTER_COEFF + i)) {
+
+ indexEqual = line.indexOf(SpurFileFormatConst.DELIMETER);
+ FilterCoefficeint = Byte.parseByte(
+ line.substring(indexEqual + 1));
+ spurDetails.setFilterCoefficeint(FilterCoefficeint);
+ } else if(lineIsOfType(line,
+ SpurFileFormatConst.SPUR_IS_ENABLE + i)) {
+
+ indexEqual = line.indexOf(SpurFileFormatConst.DELIMETER);
+ IsEnableSpur = Byte.parseByte(
+ line.substring(indexEqual + 1));
+ spurDetails.setIsEnableSpur(IsEnableSpur);
+ } else if(lineIsOfType(line,
+ SpurFileFormatConst.SPUR_LEVEL + i)) {
+
+ indexEqual = line.indexOf(SpurFileFormatConst.DELIMETER);
+ spurLevel = Byte.parseByte(line.substring(indexEqual + 1));
+ spurDetails.setSpurLevel(spurLevel);
+ }
+ }
+ spur.addSpurDetails(spurDetails);
+ }
+ t.InsertSpur(spur);
+ lastLine = LineType.EMPTY_LINE;
+ } else {
+ return false;
+ }
+ } else if(entryFound == 1) {
+ if (lineIsOfType(line, SpurFileFormatConst.SPUR_NUM_ENTRY)) {
+ indexEqual = line.indexOf(SpurFileFormatConst.DELIMETER);
+ noOfSpursFreq = Byte.parseByte(line.substring(indexEqual + 1));
+ t.SetspurNoOfFreq(noOfSpursFreq);
+ entryFound++;
+ } else {
+ return false;
+ }
+ } else {
+ if (lineIsOfType(line, SpurFileFormatConst.SPUR_MODE)) {
+ indexEqual = line.indexOf(SpurFileFormatConst.DELIMETER);
+ mode = Byte.parseByte(line.substring(indexEqual + 1));
+ t.SetMode(mode);
+ entryFound++;
+ } else {
+ return false;
+ }
+ }
+ } // END of while
+ } catch (NumberFormatException e) {
+ Log.d(TAG, "NumberFormatException");
+ e.printStackTrace();
+ return false;
+ } catch (IOException e) {
+ Log.d(TAG, "IOException");
+ e.printStackTrace();
+ return false;
+ }
+ } else {
+ return false;
+ }
+ return true;
+ }
+
+ private String removeSpaces(String s) {
+ Matcher matcher = SpurFileFormatConst.SPACE_PATTERN.matcher(s);
+ String newLine = matcher.replaceAll("");
+ return newLine;
+ }
+
+ private boolean lineIsOfType(String line, String lineType) {
+ int indexEqual;
+
+ try {
+ indexEqual = line.indexOf(SpurFileFormatConst.DELIMETER);
+ if ((indexEqual >= 0) && indexEqual < line.length()) {
+ if (line.startsWith(lineType)) {
+ int num = Integer.parseInt(line.substring(indexEqual + 1));
+ } else {
+ return false;
+ }
+ } else {
+ return false;
+ }
+ } catch (NumberFormatException e) {
+ return false;
+ }
+ return true;
+ }
+
+ private boolean lineIsComment(String s) {
+ if ((s == null) || (s == "") || (s == " ") || s.length() == 0) {
+ return true;
+ } else if(s.charAt(0) == SpurFileFormatConst.COMMENT) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public SpurTable GetSpurTable(String fileName) {
+ BufferedReader reader = null;
+ SpurTable t = new SpurTable();
+ try {
+ reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName)));
+ parse(reader, t);
+ reader.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return t;
+ }
+
+}
diff --git a/qcom/fmradio/SpurFileParserInterface.java b/qcom/fmradio/SpurFileParserInterface.java
new file mode 100644
index 0000000..e151769
--- /dev/null
+++ b/qcom/fmradio/SpurFileParserInterface.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of The Linux Foundation nor
+ * the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package qcom.fmradio;
+
+public interface SpurFileParserInterface {
+
+ SpurTable GetSpurTable(String fileName);
+}
diff --git a/qcom/fmradio/SpurTable.java b/qcom/fmradio/SpurTable.java
new file mode 100644
index 0000000..fd65c58
--- /dev/null
+++ b/qcom/fmradio/SpurTable.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2014, The Linux Foundation. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * * Neither the name of The Linux Foundation nor
+ * the names of its contributors may be used to endorse or promote
+ * products derived from this software without specific prior written
+ * permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package qcom.fmradio;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SpurTable {
+
+ private byte mode;
+ private byte spurNoOfFreq;
+ private List <Spur> spurs;
+
+ SpurTable() {
+ this.mode = -1;
+ this.spurNoOfFreq = 0;
+ this.spurs = null;
+ }
+
+ public List <Spur> GetSpurList() {
+ return spurs;
+ }
+
+ public void SetspurNoOfFreq(byte spurNoOfFreq) {
+ this.spurNoOfFreq = spurNoOfFreq;
+ }
+
+ public void SetMode(byte mode) {
+ this.mode = mode;
+ }
+
+ public void InsertSpur(Spur s) {
+ if (spurs == null) {
+ spurs = new ArrayList<Spur>();
+ }
+ spurs.add(s);
+ }
+
+ public byte GetMode() {
+ return mode;
+ }
+
+ public byte GetspurNoOfFreq() {
+ return spurNoOfFreq;
+ }
+}