[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.pm.ProviderInfo;\r
5 import android.database.Cursor;\r
6 import android.media.AudioManager;\r
7 import android.media.MediaPlayer;\r
8 import android.net.Uri;\r
9 import android.os.Bundle;\r
10 import android.support.design.widget.FloatingActionButton;\r
11 import android.support.design.widget.Snackbar;\r
12 import android.support.v7.app.AppCompatActivity;\r
13 import android.support.v7.widget.Toolbar;\r
14 import android.util.Log;\r
15 import android.view.View;\r
16 import android.view.Menu;\r
17 import android.view.MenuItem;\r
18 import android.widget.Button;\r
19 \r
20 import com.ti.tas2555.ftcc.TAS2555Node;\r
21 import com.ti.tas2555.ftcc.TFTCConfiguration;\r
22 \r
23 import java.io.File;\r
24 import java.util.Timer;\r
25 import java.util.TimerTask;\r
26 \r
27 public class MainActivity extends AppCompatActivity implements MediaPlayer.OnPreparedListener {\r
28 private String TAG = "TAS2555-FTC";\r
29 private TAS2555Node mDevNode;\r
30 private TFTCConfiguration mFTCConfiguration;\r
31 private Button mStartButton;\r
32 private MediaPlayer mMediaPlayer;\r
33 private Timer mTimer;\r
34 private Cal_State mCalState = Cal_State.IDLE;\r
35 \r
36 private enum Cal_State{\r
37 IDLE,\r
38 CALIBRATE,\r
39 VARIFY\r
40 }\r
41 \r
42 @Override\r
43 protected void onCreate(Bundle savedInstanceState) {\r
44 super.onCreate(savedInstanceState);\r
45 setContentView(R.layout.activity_main);\r
46 Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);\r
47 setSupportActionBar(toolbar);\r
48 \r
49 FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);\r
50 fab.setOnClickListener(new View.OnClickListener() {\r
51 @Override\r
52 public void onClick(View view) {\r
53 Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)\r
54 .setAction("Action", null).show();\r
55 }\r
56 });\r
57 \r
58 mTimer = new Timer("PlaybackTimer");\r
59 mMediaPlayer = new MediaPlayer();\r
60 mDevNode = new TAS2555Node();\r
61 mFTCConfiguration = new TFTCConfiguration();\r
62 mStartButton = (Button) findViewById(R.id.bnStart);\r
63 mStartButton.setOnClickListener(new View.OnClickListener() {\r
64 @Override\r
65 public void onClick(View v) {\r
66 FTCStart();\r
67 }\r
68 });\r
69 }\r
70 \r
71 @Override\r
72 public boolean onCreateOptionsMenu(Menu menu) {\r
73 // Inflate the menu; this adds items to the action bar if it is present.\r
74 getMenuInflater().inflate(R.menu.menu_main, menu);\r
75 return true;\r
76 }\r
77 \r
78 @Override\r
79 public boolean onOptionsItemSelected(MenuItem item) {\r
80 // Handle action bar item clicks here. The action bar will\r
81 // automatically handle clicks on the Home/Up button, so long\r
82 // as you specify a parent activity in AndroidManifest.xml.\r
83 int id = item.getItemId();\r
84 \r
85 //noinspection SimplifiableIfStatement\r
86 if (id == R.id.action_settings) {\r
87 return true;\r
88 }\r
89 \r
90 return super.onOptionsItemSelected(item);\r
91 }\r
92 \r
93 private void FTCStart(){\r
94 try {\r
95 mFTCConfiguration.LoadFTCC("/data/speaker.ftcfg");\r
96 mDevNode.OpenNode("/dev/tiload_node");\r
97 mFTCConfiguration.nTCal = 25;\r
98 mFTCConfiguration.bLoadCalibration = true;\r
99 // STEP 1: Load TAS2555 calibration configuration\r
100 mDevNode.set_Configuration(mFTCConfiguration.nConfigurationCalibration);\r
101 File file=new File("/data/TAS2555_cal_m28dB.wav");\r
102 if(file.exists()){\r
103 mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);\r
104 mMediaPlayer.setDataSource(file.getAbsolutePath());\r
105 mCalState = Cal_State.CALIBRATE;\r
106 mMediaPlayer.setOnPreparedListener(this);\r
107 mMediaPlayer.prepareAsync();\r
108 }\r
109 }catch (Exception ex){\r
110 Log.e(TAG, ex.toString());\r
111 }\r
112 }\r
113 \r
114 public void onPrepared(MediaPlayer mp) {\r
115 if(mCalState == Cal_State.CALIBRATE) {\r
116 // STEP 2: Play calibration signal\r
117 mMediaPlayer.start();\r
118 try {\r
119 Thread.sleep(500);\r
120 }catch (Exception ex){\r
121 Log.e(TAG, ex.toString());\r
122 }\r
123 \r
124 // STEP 3: Re-program Re for worst case\r
125 double re = mFTCConfiguration.nPPC3_Re0;\r
126 re = mFTCConfiguration.nPPC3_Re0 * (1 - 2 * mFTCConfiguration.nSpkReTolPer / 100.0);\r
127 mDevNode.set_Re(mFTCConfiguration.nPPC3_Re0, re, mFTCConfiguration.nSpkReAlpha);\r
128 mDevNode.set_NFS(mFTCConfiguration.nNFS);\r
129 mDevNode.set_SCTH(mFTCConfiguration.nSCTH);\r
130 \r
131 // STEP 4: Wait for algorithm to converge\r
132 mTimer.schedule(new TimerTask() {\r
133 @Override\r
134 public void run() {\r
135 CalTimeReached();\r
136 }\r
137 }, mFTCConfiguration.nCalibrationTime);\r
138 }else if(mCalState == Cal_State.VARIFY){\r
139 mMediaPlayer.start();\r
140 try {\r
141 Thread.sleep(500);\r
142 }catch (Exception ex){\r
143 Log.e(TAG, ex.toString());\r
144 }\r
145 \r
146 mTimer.schedule(new TimerTask() {\r
147 @Override\r
148 public void run() {\r
149 VerifyTimeReached();\r
150 }\r
151 }, mFTCConfiguration.nVerificationTime);\r
152 }\r
153 }\r
154 \r
155 private void CalTimeReached(){\r
156 mFTCConfiguration.nRe = mDevNode.get_Re(mFTCConfiguration.nPPC3_Re0);\r
157 mFTCConfiguration.nF0 = mDevNode.get_f0(mFTCConfiguration.nFSRate);\r
158 mFTCConfiguration.nQ = mDevNode.get_Q(mFTCConfiguration.nFSRate);\r
159 // t_cal = sys_get_ambient_temp(); // Set t_cal to ambient temperature //use command line parameter instead\r
160 \r
161 // STEP 6: Verify Speaker at gpFTCC->nTestDeltaT\r
162 int prm_pow = mDevNode.Calc_Prm_Pow(mFTCConfiguration.nRe,\r
163 mFTCConfiguration.nTestDeltaT,\r
164 mFTCConfiguration.nPPC3_RTV,\r
165 mFTCConfiguration.nPPC3_RTM,\r
166 mFTCConfiguration.nPPC3_RTVA,\r
167 mFTCConfiguration.nPPC3_SysGain);\r
168 int prm_tlimit = mDevNode.calc_Prm_Tlimit(mFTCConfiguration.nTestDeltaT,\r
169 mFTCConfiguration.nSpkReAlpha,\r
170 mFTCConfiguration.nPPC3_DevNonlinPer,\r
171 mFTCConfiguration.nPPC3_RTV,\r
172 mFTCConfiguration.nPPC3_RTM,\r
173 mFTCConfiguration.nPPC3_RTVA);\r
174 \r
175 mDevNode.set_Re(mFTCConfiguration.nPPC3_Re0,\r
176 mFTCConfiguration.nRe,\r
177 mFTCConfiguration.nSpkReAlpha);\r
178 mDevNode.set_TempCal(prm_pow, prm_tlimit);\r
179 \r
180 mMediaPlayer.stop();\r
181 \r
182 StartVerify();\r
183 }\r
184 \r
185 private void StartVerify(){\r
186 try {\r
187 File file=new File("/data/TAS2555_verify_m06.wav");\r
188 if(file.exists()){\r
189 mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);\r
190 mMediaPlayer.setDataSource(file.getAbsolutePath());\r
191 mCalState = Cal_State.VARIFY;\r
192 mMediaPlayer.prepareAsync();\r
193 }\r
194 }catch (Exception ex){\r
195 Log.e(TAG, ex.toString());\r
196 }\r
197 }\r
198 \r
199 private void VerifyTimeReached(){\r
200 double re = mDevNode.get_Re(mFTCConfiguration.nPPC3_Re0);\r
201 mFTCConfiguration.ntest_delta_tv = (re/mFTCConfiguration.nRe - 1) / mFTCConfiguration.nSpkReAlpha;\r
202 \r
203 mFTCConfiguration.nResult = mFTCConfiguration.check_spk_bounds(\r
204 mFTCConfiguration.nRe,\r
205 mFTCConfiguration.nF0,\r
206 mFTCConfiguration.nQ,\r
207 mFTCConfiguration.ntest_delta_tv);\r
208 \r
209 // STEP 7: Set temperature limit to target TMAX\r
210 mFTCConfiguration.nprm_pow = mDevNode.Calc_Prm_Pow(\r
211 mFTCConfiguration.nRe,\r
212 mFTCConfiguration.nSpkTMax - mFTCConfiguration.nTCal,\r
213 mFTCConfiguration.nPPC3_RTV,\r
214 mFTCConfiguration.nPPC3_RTM,\r
215 mFTCConfiguration.nPPC3_RTVA,\r
216 mFTCConfiguration.nPPC3_SysGain);\r
217 \r
218 mFTCConfiguration.nprm_tlimit = mDevNode.calc_Prm_Tlimit(\r
219 mFTCConfiguration.nSpkTMax - mFTCConfiguration.nTCal,\r
220 mFTCConfiguration.nSpkReAlpha,\r
221 mFTCConfiguration.nPPC3_DevNonlinPer,\r
222 mFTCConfiguration.nPPC3_RTV,\r
223 mFTCConfiguration.nPPC3_RTM,\r
224 mFTCConfiguration.nPPC3_RTVA);\r
225 \r
226 mDevNode.set_Re(\r
227 mFTCConfiguration.nPPC3_Re0,\r
228 mFTCConfiguration.nRe,\r
229 mFTCConfiguration.nSpkReAlpha);\r
230 \r
231 mDevNode.set_TempCal(\r
232 mFTCConfiguration.nprm_pow,\r
233 mFTCConfiguration.nprm_tlimit);\r
234 \r
235 mMediaPlayer.stop();\r
236 \r
237 PostCalibration();\r
238 }\r
239 \r
240 private void PostCalibration(){\r
241 try {\r
242 // STEP 8: Save Re, f0, Q and Cal Temp into a file\r
243 mFTCConfiguration.saveCalResult("/data/tas2555_cal.txt");\r
244 \r
245 // STEP 9: Save .bin file for TAS2555 driver\r
246 if (mFTCConfiguration.nResult == mFTCConfiguration.RESULT_PASS)\r
247 {\r
248 byte[] fwContent = mDevNode.getFwContent();\r
249 mFTCConfiguration.saveCalFirmware("/data/tas2555_cal.bin", fwContent);\r
250 \r
251 if(mFTCConfiguration.bLoadCalibration)\r
252 mDevNode.set_Calibration(0xff);\r
253 }\r
254 }catch (Exception ex){\r
255 Log.e(TAG, ex.toString());\r
256 }\r
257 \r
258 mMediaPlayer.release();\r
259 }\r
260 }\r