]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - tas2555sw-android/tas2555-ftc-android-app.git/blob - TAS2555-FTC/ftcc/src/main/java/com/ti/tas2555/ftcc/TFTCConfiguration.java
fix display bug
[tas2555sw-android/tas2555-ftc-android-app.git] / TAS2555-FTC / ftcc / src / main / java / com / ti / tas2555 / ftcc / TFTCConfiguration.java
1 package com.ti.tas2555.ftcc;\r
2 \r
3 import android.content.Context;\r
4 import android.util.Log;\r
5 \r
6 import java.io.BufferedReader;\r
7 import java.io.BufferedWriter;\r
8 import java.io.File;\r
9 import java.io.FileNotFoundException;\r
10 import java.io.FileOutputStream;\r
11 import java.io.FileReader;\r
12 import java.io.FileWriter;\r
13 import java.util.Arrays;\r
14 import java.util.InvalidPropertiesFormatException;\r
15 \r
16 /**\r
17  * Created by a0220410 on 6/10/2016.\r
18  */\r
19 public class TFTCConfiguration {\r
20     private static final String TAG  = "TFTCConfiguration";\r
21     private static final String CALIBRATION_TIME = "CALIBRATION_TIME";\r
22     private static final String VERIFICATION_TIME = "VERIFICATION_TIME";\r
23     private static final String TEST_DELTA_T = "TEST_DELTA_T";\r
24     private static final String CONFIGURATION = "CONFIGURATION";\r
25     private static final String CONFIGURATION_CALIBRATION = "CONFIGURATION_CALIBRATION";\r
26     private static final String SPK_T_MAX = "SPK_T_MAX";\r
27     private static final String SPK_RE_TOL_PER = "SPK_RE_TOL_PER";\r
28     private static final String SPK_RE_ALPHA = "SPK_RE_ALPHA";\r
29     private static final String PPC3_RE0 = "PPC3_RE0";\r
30     private static final String PPC3_RTV = "PPC3_RTV";\r
31     private static final String PPC3_RTM = "PPC3_RTM";\r
32     private static final String PPC3_RTVA = "PPC3_RTVA";\r
33     private static final String PPC3_SYSGAIN = "PPC3_SYSGAIN";\r
34     private static final String PPC3_DEV_NONLIN_PER = "PPC3_DEV_NONLIN_PER";\r
35     private static final String PPC3_DELTA_T_LIMIT = "PPC3_DELTA_T_LIMIT";\r
36     private static final String FS_RATE = "FS_RATE";\r
37     private static final String RE_HI = "RE_HI";\r
38     private static final String RE_LO = "RE_LO";\r
39     private static final String F0_HI = "F0_HI";\r
40     private static final String F0_LO = "F0_LO";\r
41     private static final String Q_HI = "Q_HI";\r
42     private static final String Q_LO = "Q_LO";\r
43     private static final String T_HI = "T_HI";\r
44     private static final String T_LO = "T_LO";\r
45     private static final String NFS = "NFS";\r
46     private static final String SCTH = "SCTH";\r
47     public static final String Re = "Re";\r
48     public static final String F0 = "f0";\r
49     public static final String Q = "Q";\r
50     public static final String Delta_tv = "delta_tv";\r
51 \r
52     public static final int RESULT_PASS = 0x00000000;\r
53     public static final int RE_FAIL_HI = 0x00000001;\r
54     public static final int RE_FAIL_LO = 0x00000010;\r
55     public static final int F0_FAIL_HI = 0x00000100;\r
56     public static final int F0_FAIL_LO = 0x00001000;\r
57     public static final int Q_FAIL_HI  = 0x00010000;\r
58     public static final int Q_FAIL_LO  = 0x00100000;\r
59     public static final int T_FAIL_HI  = 0x01000000;\r
60     public static final int T_FAIL_LO  = 0x10000000;\r
61 \r
62     public boolean bVerbose;\r
63     public boolean bLoadCalibration;\r
64 \r
65     public int nCalibrationTime;\r
66     public int nVerificationTime;\r
67 \r
68     public double nNFS;\r
69     public double nSCTH;\r
70 \r
71     public boolean bFTCBypass;\r
72     public double nTestDeltaT;\r
73     public int nConfiguration;\r
74     public int nConfigurationCalibration;\r
75 \r
76     public double nSpkTMax;\r
77     public double nSpkReTolPer;\r
78     public double nSpkReAlpha;\r
79 \r
80     public double nPPC3_Re0;\r
81     public double nPPC3_RTV;\r
82     public double nPPC3_RTM;\r
83     public double nPPC3_RTVA;\r
84     public double nPPC3_SysGain;\r
85     public double nPPC3_DevNonlinPer;\r
86     public double nPPC3_DeltaTLimit;\r
87     public int nFSRate;\r
88 \r
89     public double nReHi;\r
90     public double nReLo;\r
91     public double nF0Hi;\r
92     public double nF0Lo;\r
93     public double nQHi;\r
94     public double nQLo;\r
95     public double nTHi;\r
96     public double nTLo;\r
97 \r
98     public double nRe;\r
99     public double nF0;\r
100     public double nQ;\r
101     public double nTCal;\r
102     public double ntest_delta_tv;\r
103     public int nResult;\r
104     public int nprm_pow;\r
105     public int nprm_tlimit;\r
106 \r
107     private int MAX_BIN_SIZE = 2048;\r
108     private byte[] gpBin = new byte[MAX_BIN_SIZE];\r
109     private int gnBinIndex = 0;\r
110     private int gnBinBlockIndex = 0;\r
111 \r
112     public void LoadFTCC(String filename)throws java.io.IOException{\r
113         FileReader fileReader = new FileReader(filename);\r
114         BufferedReader bufferedReader = new BufferedReader(fileReader);\r
115 \r
116         while (bufferedReader.ready()){\r
117             String line = bufferedReader.readLine();\r
118             if(line == null) break;\r
119             if(line.isEmpty() || line.startsWith(";")) continue;\r
120 \r
121             int idx = line.indexOf(';');\r
122             if(idx != -1) line = line.substring(0, idx -1);\r
123             ftcc_parse(line);\r
124         }\r
125 \r
126         bufferedReader.close();\r
127         fileReader.close();\r
128     }\r
129 \r
130     private void ftcc_parse(String line) throws InvalidPropertiesFormatException{\r
131         if(line.contains(CALIBRATION_TIME))\r
132             nCalibrationTime = getInt(CALIBRATION_TIME, line);\r
133         else if(line.contains(VERIFICATION_TIME))\r
134             nVerificationTime = getInt(VERIFICATION_TIME, line);\r
135         else if(line.contains(TEST_DELTA_T))\r
136             nTestDeltaT = getFloat(TEST_DELTA_T, line);\r
137         else if(line.contains(CONFIGURATION_CALIBRATION))\r
138             nConfigurationCalibration = getInt(CONFIGURATION_CALIBRATION, line);\r
139         else if(line.contains(CONFIGURATION))\r
140             nConfiguration = getInt(CONFIGURATION, line);\r
141         else if(line.contains(SPK_T_MAX))\r
142             nSpkTMax = getFloat(SPK_T_MAX, line);\r
143         else if(line.contains(SPK_RE_TOL_PER))\r
144             nSpkReTolPer = getFloat(SPK_RE_TOL_PER, line);\r
145         else if(line.contains(SPK_RE_ALPHA))\r
146             nSpkReAlpha = getFloat(SPK_RE_ALPHA, line);\r
147         else if(line.contains(PPC3_RE0))\r
148             nPPC3_Re0 = getFloat(PPC3_RE0, line);\r
149         else if(line.contains(PPC3_RTVA))\r
150             nPPC3_RTVA = getFloat(PPC3_RTVA, line);\r
151         else if(line.contains(PPC3_RTV))\r
152             nPPC3_RTV = getFloat(PPC3_RTV, line);\r
153         else if(line.contains(PPC3_RTM))\r
154             nPPC3_RTM = getFloat(PPC3_RTM, line);\r
155         else if(line.contains(PPC3_SYSGAIN))\r
156             nPPC3_SysGain = getFloat(PPC3_SYSGAIN, line);\r
157         else if(line.contains(PPC3_DEV_NONLIN_PER))\r
158             nPPC3_DevNonlinPer = getFloat(PPC3_DEV_NONLIN_PER, line);\r
159         else if(line.contains(PPC3_DELTA_T_LIMIT))\r
160             nPPC3_DeltaTLimit = getFloat(PPC3_DELTA_T_LIMIT, line);\r
161         else if(line.contains(FS_RATE))\r
162             nFSRate = getInt(FS_RATE, line);\r
163         else if(line.contains(RE_HI))\r
164             nReHi = getFloat(RE_HI, line);\r
165         else if(line.contains(RE_LO))\r
166             nReLo = getFloat(RE_LO, line);\r
167         else if(line.contains(F0_HI))\r
168             nF0Hi = getFloat(F0_HI, line);\r
169         else if(line.contains(F0_LO))\r
170             nF0Lo = getFloat(F0_LO, line);\r
171         else if(line.contains(Q_HI))\r
172             nQHi = getFloat(Q_HI, line);\r
173         else if(line.contains(Q_LO))\r
174             nQLo = getFloat(Q_LO, line);\r
175         else if(line.contains(T_HI))\r
176             nTHi = getFloat(T_HI, line);\r
177         else if(line.contains(T_LO))\r
178             nTLo = getFloat(T_LO, line);\r
179         else if(line.contains(NFS))\r
180             nNFS = getFloat(NFS, line);\r
181         else if(line.contains(SCTH))\r
182             nSCTH = getFloat(SCTH, line);\r
183     }\r
184 \r
185     private int getInt(String key, String line) throws InvalidPropertiesFormatException{\r
186         int val = 0;\r
187         int idx = line.lastIndexOf('=');\r
188         if(idx < key.length())\r
189             throw new InvalidPropertiesFormatException(line);\r
190 \r
191         String convert = line.substring(idx + 1);\r
192         convert.replace('\r', ' ');\r
193         convert.replace('\n', ' ');\r
194         convert.replace('\t', ' ');\r
195         convert = convert.trim();\r
196 \r
197         val = Integer.valueOf(convert);\r
198 \r
199         return val;\r
200     }\r
201 \r
202     private float getFloat(String key, String line)throws InvalidPropertiesFormatException{\r
203         float val = 0;\r
204         int idx = line.lastIndexOf('=');\r
205         if(idx < key.length())\r
206             throw new InvalidPropertiesFormatException(line);\r
207 \r
208         String convert = line.substring(idx + 1);\r
209         convert.replace('\r', ' ');\r
210         convert.replace('\n', ' ');\r
211         convert.replace('\t', ' ');\r
212         convert = convert.trim();\r
213 \r
214         val = Float.valueOf(convert);\r
215         return val;\r
216     }\r
217 \r
218     public int check_spk_bounds(double re, double f0, double q, double test_delta_tv)\r
219     {\r
220         int result = RESULT_PASS;\r
221 \r
222         if(re>nReHi)\r
223             result |= RE_FAIL_HI;\r
224         if(re<nReLo)\r
225             result |= RE_FAIL_LO;\r
226         if(f0>nF0Hi)\r
227             result |= F0_FAIL_HI;\r
228         if(f0<nF0Lo)\r
229             result |= F0_FAIL_LO;\r
230         if(q>nQHi)\r
231             result |= Q_FAIL_HI;\r
232         if(q<nQLo)\r
233             result |= Q_FAIL_LO;\r
234         if(test_delta_tv>nTHi)\r
235             result |= T_FAIL_HI;\r
236         if(test_delta_tv<nTLo)\r
237             result |= T_FAIL_LO;\r
238 \r
239         return result;\r
240     }\r
241 \r
242     public void saveCalResult(String file) throws java.io.IOException{\r
243         FileWriter fileWriter = new FileWriter(file);\r
244         BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);\r
245 \r
246         bufferedWriter.write(String.format("Re = %1.2f\n\r", nRe));\r
247         bufferedWriter.write(String.format("F0 = %3.0f\n\r", nF0));\r
248         bufferedWriter.write(String.format("Q  = %1.3f\n\r", nQ));\r
249         bufferedWriter.write(String.format("t0 = %2.2f\n\r\n\r", nTCal));\r
250         bufferedWriter.write(String.format("rms_pow       = 0x%08X\n\r", nprm_pow));\r
251         bufferedWriter.write(String.format("t_limit       = 0x%08X\n\r", nprm_tlimit));\r
252         bufferedWriter.write(String.format("test_delta_tv = %2.2f C\n\r", ntest_delta_tv));\r
253         bufferedWriter.write(String.format("result        = 0x%08X\n\r", nResult));\r
254 \r
255         bufferedWriter.flush();\r
256         bufferedWriter.close();\r
257         fileWriter.close();\r
258     }\r
259 \r
260     public void saveCalFirmware(String file, byte[] fwData) throws java.io.IOException{\r
261         FileOutputStream fileOutputStream = new FileOutputStream(file, false);\r
262 \r
263         PrepareCalFWHeader();\r
264 \r
265         for(int i=0; i < fwData.length; i++){\r
266             gpBin[gnBinIndex++] = fwData[i];\r
267         }\r
268 \r
269         PrepareClosure();\r
270 \r
271         fileOutputStream.write(gpBin, 0, gnBinIndex);\r
272         fileOutputStream.flush();\r
273         fileOutputStream.close();\r
274     }\r
275 \r
276     private void PrepareCalFWHeader(){\r
277         String datafile = "Calibration Data File";\r
278         String description = "Calibration Data File for TAS2555";\r
279         gpBin[3] = '2';\r
280         gpBin[2] = '5';\r
281         gpBin[1] = '5';\r
282         gpBin[0] = '5';\r
283 \r
284         for(int i=0; i < datafile.length(); i++){\r
285             gpBin[24+i] = (byte) datafile.charAt(i);\r
286         }\r
287 \r
288         for(int i=0; i < description.length(); i++){\r
289             gpBin[24 + 64 + i] = (byte)description.charAt(i);\r
290         }\r
291 \r
292 \r
293         gnBinIndex += 24 + 64 + description.length() + 1;\r
294 \r
295         gnBinIndex +=\r
296                 4 +     //device family index\r
297                         4 +     //device index\r
298                         2 +     //num PLL index\r
299                         0 +     //array PLL index\r
300                         2 +     //num programs index\r
301                         0 +     //array programs index\r
302                         2 +     //num configurations index\r
303                         0;      //array configurations index\r
304 \r
305         gpBin[gnBinIndex++] = 0x00;\r
306         gpBin[gnBinIndex++] = 0x01; // one calibration data block\r
307 \r
308         String CalibrationData = "Calibration Data";\r
309         for(int i=0; i < CalibrationData.length(); i++){\r
310             gpBin[gnBinIndex+ i] = (byte)CalibrationData.charAt(i);\r
311         }\r
312         gnBinIndex += 64;\r
313 \r
314         String CalibrationData2555 = "Calibration Data for TAS2555";\r
315         for(int i=0; i < CalibrationData2555.length(); i++){\r
316             gpBin[gnBinIndex+ i] = (byte)CalibrationData2555.charAt(i);\r
317         }\r
318         gnBinIndex += CalibrationData2555.length() + 1;\r
319 \r
320         gpBin[gnBinIndex++] = 0x00; // compatible program = smart amp (index 0)\r
321         gpBin[gnBinIndex++] = (byte)nConfiguration; // compatible configuration\r
322 \r
323         gpBin[gnBinIndex++] = 0x00;\r
324         gpBin[gnBinIndex++] = 0x00;\r
325         gpBin[gnBinIndex++] = 0x00;\r
326         gpBin[gnBinIndex++] = 0x0A; // block type = 0x0A (calibration)\r
327         gnBinBlockIndex = gnBinIndex;\r
328 \r
329         gnBinIndex += 4; // number of commands index\r
330     }\r
331 \r
332     private void PrepareClosure(){\r
333         int nCommands;\r
334         byte pCommit[] = {\r
335             0x00, 0x04, (byte) 0x85, 0x00,\r
336             (byte) 0x8C, 0x19, 0x7C, 0x00,\r
337             0x00, 0x00, 0x01, 0x00\r
338         };\r
339 \r
340         // write the commit sequence\r
341         for(int i=0; i < pCommit.length; i++){\r
342             gpBin[gnBinIndex++] = pCommit[i];\r
343         }\r
344 \r
345         nCommands = ((gnBinIndex - gnBinBlockIndex) / 4) - 1;\r
346 \r
347         // write number of commands for calibration block\r
348         gpBin[gnBinBlockIndex++] = (byte) ((nCommands & 0xFF000000) >> 24);\r
349         gpBin[gnBinBlockIndex++] = (byte)((nCommands & 0x00FF0000) >> 16);\r
350         gpBin[gnBinBlockIndex++] = (byte)((nCommands & 0x0000FF00) >> 8);\r
351         gpBin[gnBinBlockIndex++] = (byte)(nCommands & 0x000000FF);\r
352 \r
353         // write bin file size\r
354         gpBin[4] = (byte)((gnBinIndex & 0xFF000000) >> 24);\r
355         gpBin[5] = (byte)((gnBinIndex & 0x00FF0000) >> 16);\r
356         gpBin[6] = (byte)((gnBinIndex & 0x0000FF00) >> 8);\r
357         gpBin[7] = (byte)((gnBinIndex & 0x000000FF));\r
358     }\r
359 }\r