3d046d3ecec004d365dda01f7f2b664ff3a59ea5
[tas2555sw-android/tas2555-ftc-android-app.git] / TAS2555-FTC / app / src / main / java / com / ti / tas2555 / tas2555_ftc / MainActivity.java
1 package com.ti.tas2555.tas2555_ftc;\r
2 \r
3 import android.content.ContentResolver;\r
4 import android.content.Context;\r
5 import android.content.pm.ProviderInfo;\r
6 import android.database.Cursor;\r
7 import android.graphics.Color;\r
8 import android.media.AudioManager;\r
9 import android.media.MediaPlayer;\r
10 import android.net.Uri;\r
11 import android.os.Bundle;\r
12 import android.support.design.widget.FloatingActionButton;\r
13 import android.support.design.widget.Snackbar;\r
14 import android.support.v7.app.AppCompatActivity;\r
15 import android.support.v7.widget.Toolbar;\r
16 import android.util.Log;\r
17 import android.view.View;\r
18 import android.view.Menu;\r
19 import android.view.MenuItem;\r
20 import android.widget.Button;\r
21 import android.widget.EditText;\r
22 import android.widget.ListView;\r
23 \r
24 import com.ti.tas2555.ftcc.TAS2555Node;\r
25 import com.ti.tas2555.ftcc.TFTCConfiguration;\r
26 \r
27 import java.io.File;\r
28 import java.util.Timer;\r
29 import java.util.TimerTask;\r
30 \r
31 public class MainActivity extends AppCompatActivity implements MediaPlayer.OnPreparedListener {\r
32 private String TAG = "TAS2555-FTC";\r
33 private TAS2555Node mDevNode;\r
34 private TFTCConfiguration mFTCConfiguration;\r
35 private Button mStartButton;\r
36 private MediaPlayer mMediaPlayer;\r
37 private Timer mTimer;\r
38 private Cal_State mCalState = Cal_State.IDLE;\r
39 private ListView mFTCItem;\r
40 private FTCListViewAdapter mAdapter;\r
41 private EditText mInfo;\r
42 \r
43 private enum Cal_State{\r
44 IDLE,\r
45 CALIBRATE,\r
46 VARIFY\r
47 }\r
48 \r
49 @Override\r
50 protected void onCreate(Bundle savedInstanceState) {\r
51 super.onCreate(savedInstanceState);\r
52 setContentView(R.layout.activity_main);\r
53 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);\r
54 setSupportActionBar(toolbar);\r
55 \r
56 FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);\r
57 fab.setOnClickListener(new View.OnClickListener() {\r
58 @Override\r
59 public void onClick(View view) {\r
60 Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)\r
61 .setAction("Action", null).show();\r
62 }\r
63 });\r
64 \r
65 mFTCItem = (ListView)findViewById(R.id.lvFTCItem);\r
66 mTimer = new Timer("PlaybackTimer");\r
67 mDevNode = new TAS2555Node();\r
68 mFTCConfiguration = new TFTCConfiguration();\r
69 mAdapter = new FTCListViewAdapter(getApplicationContext(), mFTCConfiguration);\r
70 mFTCItem.setAdapter(mAdapter);\r
71 mStartButton = (Button) findViewById(R.id.bnStart);\r
72 mStartButton.setOnClickListener(new View.OnClickListener() {\r
73 @Override\r
74 public void onClick(View v) {\r
75 FTCStart();\r
76 }\r
77 });\r
78 mInfo = (EditText)findViewById(R.id.dtInfo);\r
79 \r
80 mInfo.setText("please put TAS2555_cal_m28dB.wav, TAS2555_verify_m06.wav, speaker.ftcfg to /data before run FTC\n");\r
81 mInfo.setSelection(mInfo.getText().length());\r
82 }\r
83 \r
84 private boolean checkfileExist(){\r
85 File file1=new File("/data/TAS2555_cal_m28dB.wav");\r
86 if(file1.exists())\r
87 mInfo.append(file1.getAbsolutePath() + " found\n");\r
88 else\r
89 mInfo.append(file1.getAbsolutePath() + " not found\n");\r
90 \r
91 mInfo.setSelection(mInfo.getText().length());\r
92 \r
93 File file2=new File("/data/TAS2555_verify_m06.wav");\r
94 if(file2.exists())\r
95 mInfo.append(file2.getAbsolutePath() + " found\n");\r
96 else\r
97 mInfo.append(file2.getAbsolutePath() + " not found\n");\r
98 \r
99 mInfo.setSelection(mInfo.getText().length());\r
100 \r
101 File file3=new File("/data/speaker.ftcfg");\r
102 if(file3.exists())\r
103 mInfo.append(file3.getAbsolutePath() + " found\n");\r
104 else\r
105 mInfo.append(file3.getAbsolutePath() + " not found\n");\r
106 \r
107 mInfo.setSelection(mInfo.getText().length());\r
108 if(file1.exists() && file2.exists() && file3.exists())\r
109 return true;\r
110 else\r
111 return false;\r
112 }\r
113 \r
114 @Override\r
115 protected void onStop() {\r
116 if(mMediaPlayer != null) mMediaPlayer.release();\r
117 mTimer.cancel();\r
118 mDevNode.CloseNode();\r
119 super.onStop();\r
120 }\r
121 \r
122 @Override\r
123 public boolean onCreateOptionsMenu(Menu menu) {\r
124 // Inflate the menu; this adds items to the action bar if it is present.\r
125 getMenuInflater().inflate(R.menu.menu_main, menu);\r
126 return true;\r
127 }\r
128 \r
129 @Override\r
130 public boolean onOptionsItemSelected(MenuItem item) {\r
131 // Handle action bar item clicks here. The action bar will\r
132 // automatically handle clicks on the Home/Up button, so long\r
133 // as you specify a parent activity in AndroidManifest.xml.\r
134 int id = item.getItemId();\r
135 \r
136 //noinspection SimplifiableIfStatement\r
137 if (id == R.id.action_settings) {\r
138 return true;\r
139 }\r
140 \r
141 return super.onOptionsItemSelected(item);\r
142 }\r
143 \r
144 private void FTCStart(){\r
145 if(!checkfileExist())\r
146 return;\r
147 \r
148 try {\r
149 mFTCConfiguration.LoadFTCC("/data/speaker.ftcfg");\r
150 mInfo.append("/data/speaker.ftcfg loaded\n");\r
151 mInfo.setSelection(mInfo.getText().length());\r
152 mInfo.append("calibration configuration :" + mFTCConfiguration.nConfigurationCalibration + "\n");\r
153 mInfo.setSelection(mInfo.getText().length());\r
154 mInfo.append("calibration time :" + mFTCConfiguration.nCalibrationTime + "\n");\r
155 mInfo.setSelection(mInfo.getText().length());\r
156 mInfo.append("verify time :" + mFTCConfiguration.nVerificationTime+ "\n");\r
157 mInfo.setSelection(mInfo.getText().length());\r
158 mAdapter.notifyDataSetChanged();\r
159 mDevNode.OpenNode("/dev/tiload_node");\r
160 mInfo.append("/dev/tiload_node opened \n");\r
161 mInfo.setSelection(mInfo.getText().length());\r
162 mFTCConfiguration.nTCal = 25;\r
163 mInfo.append("ambient temperature :" + mFTCConfiguration.nTCal + "\n");\r
164 mInfo.setSelection(mInfo.getText().length());\r
165 mFTCConfiguration.bLoadCalibration = false;\r
166 mInfo.append("reload calibration :" + mFTCConfiguration.bLoadCalibration + "\n");\r
167 mInfo.setSelection(mInfo.getText().length());\r
168 // STEP 1: Load TAS2555 calibration configuration\r
169 mInfo.append("STEP1: change configuration to " + mFTCConfiguration.nConfigurationCalibration + "\n");\r
170 mInfo.setSelection(mInfo.getText().length());\r
171 mDevNode.set_Configuration(mFTCConfiguration.nConfigurationCalibration);\r
172 File file=new File("/data/TAS2555_cal_m28dB.wav");\r
173 if(file.exists()){\r
174 mMediaPlayer = new MediaPlayer();\r
175 mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);\r
176 mMediaPlayer.setDataSource(file.getAbsolutePath());\r
177 mCalState = Cal_State.CALIBRATE;\r
178 mMediaPlayer.setOnPreparedListener(this);\r
179 mInfo.append("preparing " + file.getAbsolutePath() + "\n");\r
180 mInfo.setSelection(mInfo.getText().length());\r
181 mMediaPlayer.prepareAsync();\r
182 }\r
183 }catch (Exception ex){\r
184 Log.e(TAG, ex.toString());\r
185 }\r
186 }\r
187 \r
188 public void onPrepared(MediaPlayer mp) {\r
189 if(mCalState == Cal_State.CALIBRATE) {\r
190 // STEP 2: Play calibration signal\r
191 mInfo.append("STEP2: start play /data/TAS2555_cal_m28dB.wav \n");\r
192 mInfo.setSelection(mInfo.getText().length());\r
193 mMediaPlayer.setScreenOnWhilePlaying(true);\r
194 mMediaPlayer.start();\r
195 try {\r
196 Thread.sleep(500);\r
197 }catch (Exception ex){\r
198 Log.e(TAG, ex.toString());\r
199 }\r
200 \r
201 // STEP 3: Re-program Re for worst case\r
202 mInfo.append("STEP3: Re-program Re for worst case \n");\r
203 mInfo.setSelection(mInfo.getText().length());\r
204 double re = mFTCConfiguration.nPPC3_Re0;\r
205 re = mFTCConfiguration.nPPC3_Re0 * (1 - 2 * mFTCConfiguration.nSpkReTolPer / 100.0);\r
206 mDevNode.set_Re(mFTCConfiguration.nPPC3_Re0, re, mFTCConfiguration.nSpkReAlpha);\r
207 mDevNode.set_NFS(mFTCConfiguration.nNFS);\r
208 mDevNode.set_SCTH(mFTCConfiguration.nSCTH);\r
209 \r
210 // STEP 4: Wait for algorithm to converge\r
211 mInfo.append("STEP4: Wait " + mFTCConfiguration.nCalibrationTime +"ms for algorithm to converge \n");\r
212 mInfo.setSelection(mInfo.getText().length());\r
213 mTimer.schedule(new TimerTask() {\r
214 @Override\r
215 public void run() {\r
216 CalTimeReached();\r
217 }\r
218 }, mFTCConfiguration.nCalibrationTime);\r
219 }else if(mCalState == Cal_State.VARIFY){\r
220 mInfo.append("start play /data/TAS2555_verify_m06.wav \n");\r
221 mInfo.setSelection(mInfo.getText().length());\r
222 mMediaPlayer.start();\r
223 try {\r
224 Thread.sleep(500);\r
225 }catch (Exception ex){\r
226 Log.e(TAG, ex.toString());\r
227 }\r
228 \r
229 mInfo.append("Wait " + mFTCConfiguration.nVerificationTime +" ms for verify \n");\r
230 mInfo.setSelection(mInfo.getText().length());\r
231 mTimer.schedule(new TimerTask() {\r
232 @Override\r
233 public void run() {\r
234 VerifyTimeReached();\r
235 }\r
236 }, mFTCConfiguration.nVerificationTime);\r
237 }\r
238 }\r
239 \r
240 private void CalTimeReached(){\r
241 // STEP 5: Get actual Re, f0 and Q from TAS2555\r
242 mFTCConfiguration.nRe = mDevNode.get_Re(mFTCConfiguration.nPPC3_Re0);\r
243 mFTCConfiguration.nF0 = mDevNode.get_f0(mFTCConfiguration.nFSRate);\r
244 mFTCConfiguration.nQ = mDevNode.get_Q(mFTCConfiguration.nFSRate);\r
245 runOnUiThread(new Runnable() {\r
246 @Override\r
247 public void run() {\r
248 mAdapter.notifyDataSetChanged();\r
249 mInfo.append("STEP5: Get actual Re, f0 and Q from TAS2555 \n");\r
250 mInfo.setSelection(mInfo.getText().length());\r
251 }\r
252 });\r
253 \r
254 // STEP 6: Verify Speaker at gpFTCC->nTestDeltaT\r
255 int prm_pow = mDevNode.Calc_Prm_Pow(mFTCConfiguration.nRe,\r
256 mFTCConfiguration.nTestDeltaT,\r
257 mFTCConfiguration.nPPC3_RTV,\r
258 mFTCConfiguration.nPPC3_RTM,\r
259 mFTCConfiguration.nPPC3_RTVA,\r
260 mFTCConfiguration.nPPC3_SysGain);\r
261 int prm_tlimit = mDevNode.calc_Prm_Tlimit(\r
262 mFTCConfiguration.nTestDeltaT,\r
263 mFTCConfiguration.nSpkReAlpha,\r
264 mFTCConfiguration.nPPC3_DevNonlinPer,\r
265 mFTCConfiguration.nPPC3_RTV,\r
266 mFTCConfiguration.nPPC3_RTM,\r
267 mFTCConfiguration.nPPC3_RTVA);\r
268 \r
269 mDevNode.set_Re(mFTCConfiguration.nPPC3_Re0,\r
270 mFTCConfiguration.nRe,\r
271 mFTCConfiguration.nSpkReAlpha);\r
272 mDevNode.set_TempCal(prm_pow, prm_tlimit);\r
273 \r
274 mMediaPlayer.stop();\r
275 mMediaPlayer.release();\r
276 mMediaPlayer = null;\r
277 \r
278 StartVerify();\r
279 }\r
280 \r
281 private void StartVerify(){\r
282 runOnUiThread(new Runnable() {\r
283 @Override\r
284 public void run() {\r
285 mInfo.append("STEP6: Verify Speaker at gpFTCC->nTestDeltaT \n");\r
286 mInfo.setSelection(mInfo.getText().length());\r
287 }\r
288 });\r
289 \r
290 try {\r
291 File file=new File("/data/TAS2555_verify_m06.wav");\r
292 if(file.exists()){\r
293 mMediaPlayer = new MediaPlayer();\r
294 mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);\r
295 mMediaPlayer.setDataSource(file.getAbsolutePath());\r
296 mCalState = Cal_State.VARIFY;\r
297 mMediaPlayer.setOnPreparedListener(this);\r
298 runOnUiThread(new Runnable() {\r
299 @Override\r
300 public void run() {\r
301 mInfo.append("preparing TAS2555_verify_m06.wav \n");\r
302 mInfo.setSelection(mInfo.getText().length());\r
303 }\r
304 });\r
305 mMediaPlayer.prepareAsync();\r
306 }\r
307 }catch (Exception ex){\r
308 Log.e(TAG, ex.toString());\r
309 }\r
310 }\r
311 \r
312 private void VerifyTimeReached(){\r
313 double re = mDevNode.get_Re(mFTCConfiguration.nPPC3_Re0);\r
314 mFTCConfiguration.ntest_delta_tv = (re/mFTCConfiguration.nRe - 1) / mFTCConfiguration.nSpkReAlpha;\r
315 \r
316 mFTCConfiguration.nResult = mFTCConfiguration.check_spk_bounds(\r
317 mFTCConfiguration.nRe,\r
318 mFTCConfiguration.nF0,\r
319 mFTCConfiguration.nQ,\r
320 mFTCConfiguration.ntest_delta_tv);\r
321 runOnUiThread(new Runnable() {\r
322 @Override\r
323 public void run() {\r
324 mAdapter.notifyDataSetChanged();\r
325 mInfo.append("verify time reached \n");\r
326 mInfo.setSelection(mInfo.getText().length());\r
327 mInfo.append("STEP7: Set temperature limit to target TMAX \n");\r
328 mInfo.setSelection(mInfo.getText().length());\r
329 }\r
330 });\r
331 \r
332 // STEP 7: Set temperature limit to target TMAX\r
333 mFTCConfiguration.nprm_pow = mDevNode.Calc_Prm_Pow(\r
334 mFTCConfiguration.nRe,\r
335 mFTCConfiguration.nSpkTMax - mFTCConfiguration.nTCal,\r
336 mFTCConfiguration.nPPC3_RTV,\r
337 mFTCConfiguration.nPPC3_RTM,\r
338 mFTCConfiguration.nPPC3_RTVA,\r
339 mFTCConfiguration.nPPC3_SysGain);\r
340 \r
341 mFTCConfiguration.nprm_tlimit = mDevNode.calc_Prm_Tlimit(\r
342 mFTCConfiguration.nSpkTMax - mFTCConfiguration.nTCal,\r
343 mFTCConfiguration.nSpkReAlpha,\r
344 mFTCConfiguration.nPPC3_DevNonlinPer,\r
345 mFTCConfiguration.nPPC3_RTV,\r
346 mFTCConfiguration.nPPC3_RTM,\r
347 mFTCConfiguration.nPPC3_RTVA);\r
348 \r
349 mDevNode.set_Re(\r
350 mFTCConfiguration.nPPC3_Re0,\r
351 mFTCConfiguration.nRe,\r
352 mFTCConfiguration.nSpkReAlpha);\r
353 \r
354 mDevNode.set_TempCal(\r
355 mFTCConfiguration.nprm_pow,\r
356 mFTCConfiguration.nprm_tlimit);\r
357 \r
358 mMediaPlayer.stop();\r
359 mMediaPlayer.release();\r
360 mMediaPlayer = null;\r
361 PostCalibration();\r
362 }\r
363 \r
364 private void PostCalibration(){\r
365 try {\r
366 runOnUiThread(new Runnable() {\r
367 @Override\r
368 public void run() {\r
369 mInfo.append("STEP8: Save Re, f0, Q and Cal Temp into " + getApplicationContext().getFilesDir().getAbsolutePath() + "/tas2555_cal.txt \n");\r
370 mInfo.setSelection(mInfo.getText().length());\r
371 }\r
372 });\r
373 // STEP 8: Save Re, f0, Q and Cal Temp into a file\r
374 Context context = getApplicationContext();\r
375 File file = context.getFilesDir();\r
376 mFTCConfiguration.saveCalResult(file.getAbsolutePath() + "/tas2555_cal.txt");\r
377 \r
378 // STEP 9: Save .bin file for TAS2555 driver\r
379 runOnUiThread(new Runnable() {\r
380 @Override\r
381 public void run() {\r
382 mInfo.append("mFTCConfiguration.nResult = " + String.format("0x%x", mFTCConfiguration.nResult) + "\n");\r
383 mInfo.setSelection(mInfo.getText().length());\r
384 }\r
385 });\r
386 \r
387 if (mFTCConfiguration.nResult == mFTCConfiguration.RESULT_PASS)\r
388 {\r
389 byte[] fwContent = mDevNode.getFwContent();\r
390 mFTCConfiguration.saveCalFirmware(file.getAbsolutePath() + "/tas2555_cal.bin", fwContent);\r
391 \r
392 runOnUiThread(new Runnable() {\r
393 @Override\r
394 public void run() {\r
395 mInfo.append(getApplicationContext().getFilesDir().getAbsolutePath() + "/tas2555_cal.bin saved \n");\r
396 mInfo.setSelection(mInfo.getText().length());\r
397 if(mFTCConfiguration.bLoadCalibration) {\r
398 mInfo.append("Load Calibration \n");\r
399 mInfo.setSelection(mInfo.getText().length());\r
400 }\r
401 }\r
402 });\r
403 \r
404 if(mFTCConfiguration.bLoadCalibration) {\r
405 mDevNode.set_Calibration(0xff);\r
406 }\r
407 }\r
408 \r
409 mDevNode.CloseNode();\r
410 }catch (Exception ex){\r
411 Log.e(TAG, ex.toString());\r
412 }\r
413 }\r
414 }\r