]> Gitweb @ Texas Instruments - Open Source Git Repositories - git.TI.com/gitweb - tas2555sw-android/tas2555-ftc-android-app.git/blob - TAS2555-FTC/app/src/main/java/com/ti/tas2555/tas2555_ftc/MainActivity.java
add for first commmit
[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