IPControlsJB.java revision 013ee925cef494eb0b12118803e842ac8f22c4c1
1/*
2 * Copyright (C) 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.rs.imagejb;
18
19import android.app.Activity;
20import android.os.Bundle;
21import android.os.Handler;
22import android.os.Message;
23import android.graphics.Canvas;
24import android.graphics.Point;
25import android.view.SurfaceView;
26import android.widget.AdapterView;
27import android.widget.ArrayAdapter;
28import android.widget.ImageView;
29import android.widget.SeekBar;
30import android.widget.Spinner;
31import android.widget.ToggleButton;
32import android.widget.TextView;
33import android.widget.CompoundButton;
34import android.widget.ListView;
35import android.view.View;
36import java.util.ArrayList;
37import java.util.ListIterator;
38import android.util.Log;
39import android.content.Intent;
40
41import android.os.Environment;
42import java.io.BufferedWriter;
43import java.io.File;
44import java.io.FileWriter;
45import java.io.IOException;
46
47public class IPControlsJB extends Activity {
48    private final String TAG = "Img";
49    public final String RESULT_FILE = "image_processing_result.csv";
50
51    private ToggleButton mIOButton;
52    private Spinner mResSpinner;
53    private ListView mTestListView;
54    private TextView mResultView;
55
56    private ArrayAdapter<String> mTestListAdapter;
57    private ArrayList<String> mTestList = new ArrayList<String>();
58
59    private boolean mToggleIO = false;
60    private boolean mToggleDVFS = true;
61    private boolean mToggleLong = false;
62    private boolean mTogglePause = false;
63
64    private float mResults[];
65
66    public enum Resolutions {
67        RES_4K(3840, 2160, "4k (3840x2160)"),
68        RES_1080P(1920, 1080, "1080p (1920x1080)"),
69        RES_720P(1280, 720, "720p (1280x720)"),
70        RES_WVGA(800, 480, "WVGA (800x480)");
71
72        private final String name;
73        public final int width;
74        public final int height;
75
76        private Resolutions(int w, int h, String s) {
77            width = w;
78            height = h;
79            name = s;
80        }
81
82        // return quoted string as displayed test name
83        public String toString() {
84            return name;
85        }
86    }
87    private Resolutions mRes;
88
89
90    private AdapterView.OnItemSelectedListener mResSpinnerListener =
91            new AdapterView.OnItemSelectedListener() {
92                public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
93                    mRes = Resolutions.values()[pos];
94                }
95
96                public void onNothingSelected(AdapterView parent) {
97                }
98            };
99
100    void init() {
101        mIOButton = (ToggleButton) findViewById(R.id.io_control);
102
103        mResSpinner = (Spinner) findViewById(R.id.image_size);
104        mResSpinner.setOnItemSelectedListener(mResSpinnerListener);
105        mResSpinner.setAdapter(new ArrayAdapter<Resolutions>(
106            this, R.layout.spinner_layout, Resolutions.values()));
107
108        for (int i=0; i < IPTestListJB.TestName.values().length; i++) {
109            mTestList.add(IPTestListJB.TestName.values()[i].toString());
110        }
111
112        mTestListView = (ListView) findViewById(R.id.test_list);
113        mTestListAdapter = new ArrayAdapter(this,
114                android.R.layout.simple_list_item_activated_1,
115                mTestList);
116
117        mTestListView.setAdapter(mTestListAdapter);
118        mTestListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
119        mTestListAdapter.notifyDataSetChanged();
120
121        ToggleButton toggle;
122        toggle = (ToggleButton) findViewById(R.id.io_control);
123        toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
124            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
125                mToggleIO = isChecked;
126            }
127        });
128        toggle.setChecked(mToggleIO);
129
130        toggle = (ToggleButton) findViewById(R.id.length_control);
131        toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
132            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
133                mToggleLong = isChecked;
134            }
135        });
136        toggle.setChecked(mToggleLong);
137
138        toggle = (ToggleButton) findViewById(R.id.background_work);
139        toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
140            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
141                mToggleDVFS = isChecked;
142            }
143        });
144        toggle.setChecked(mToggleDVFS);
145
146        toggle = (ToggleButton) findViewById(R.id.pause);
147        toggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
148            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
149                mTogglePause = isChecked;
150            }
151        });
152        toggle.setChecked(mTogglePause);
153
154        mResultView = (TextView) findViewById(R.id.results);
155
156
157        Point size = new Point();
158        getWindowManager().getDefaultDisplay().getSize(size);
159        int md = (size.x > size.y) ? size.x : size.y;
160        for (int ct=0; ct < Resolutions.values().length; ct++) {
161            if (Resolutions.values()[ct].width <= (int)(md * 1.2)) {
162                mResSpinner.setSelection(ct);
163                break;
164            }
165        }
166    }
167
168    @Override
169    protected void onCreate(Bundle savedInstanceState) {
170        super.onCreate(savedInstanceState);
171        setContentView(R.layout.controls);
172        init();
173    }
174
175    @Override
176    protected void onPause() {
177        super.onPause();
178
179        //cleanup();
180    }
181
182
183    @Override
184    protected void onResume() {
185        super.onResume();
186
187       // init();
188    }
189
190    private void checkGroup(int group) {
191        IPTestListJB.TestName t[] = IPTestListJB.TestName.values();
192        for (int i=0; i < t.length; i++) {
193            mTestListView.setItemChecked(i, group == t[i].group);
194        }
195    }
196
197    public void btnRun(View v) {
198        IPTestListJB.TestName t[] = IPTestListJB.TestName.values();
199
200        int count = 0;
201        for (int i = 0; i < t.length; i++) {
202            if (mTestListView.isItemChecked(i)) {
203                count++;
204            }
205        }
206        if (count == 0) {
207            return;
208        }
209
210        int testList[] = new int[count];
211        count = 0;
212        for (int i = 0; i < t.length; i++) {
213            if (mTestListView.isItemChecked(i)) {
214                testList[count++] = i;
215            }
216        }
217
218        Intent intent = new Intent(this, ImageProcessingActivityJB.class);
219        intent.putExtra("tests", testList);
220        intent.putExtra("enable io", mToggleIO);
221        intent.putExtra("enable dvfs", mToggleDVFS);
222        intent.putExtra("enable long", mToggleLong);
223        intent.putExtra("enable pause", mTogglePause);
224        intent.putExtra("resolution X", mRes.width);
225        intent.putExtra("resolution Y", mRes.height);
226        startActivityForResult(intent, 0);
227    }
228
229    float rebase(float v, IPTestListJB.TestName t) {
230        if (v > 0.001) {
231            v = t.baseline / v;
232        }
233        float pr = (1920.f / mRes.width) * (1080.f / mRes.height);
234        return v / pr;
235    }
236
237    private void writeResults() {
238        // write result into a file
239        File externalStorage = Environment.getExternalStorageDirectory();
240        if (!externalStorage.canWrite()) {
241            Log.v(TAG, "sdcard is not writable");
242            return;
243        }
244        File resultFile = new File(externalStorage, RESULT_FILE);
245        resultFile.setWritable(true, false);
246        try {
247            BufferedWriter rsWriter = new BufferedWriter(new FileWriter(resultFile));
248            Log.v(TAG, "Saved results in: " + resultFile.getAbsolutePath());
249            java.text.DecimalFormat df = new java.text.DecimalFormat("######.##");
250
251            for (int ct=0; ct < IPTestListJB.TestName.values().length; ct++) {
252                IPTestListJB.TestName t = IPTestListJB.TestName.values()[ct];
253                final float r = mResults[ct];
254                float r2 = rebase(r, t);
255                String s = new String("" + t.toString() + ", " + df.format(r) + ", " + df.format(r2));
256                rsWriter.write(s + "\n");
257            }
258            rsWriter.close();
259        } catch (IOException e) {
260            Log.v(TAG, "Unable to write result file " + e.getMessage());
261        }
262    }
263
264    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
265        if (requestCode == 0) {
266            if (resultCode == RESULT_OK) {
267                java.text.DecimalFormat df = new java.text.DecimalFormat("######.#");
268                mResults = new float[IPTestListJB.TestName.values().length];
269
270                float r[] = data.getFloatArrayExtra("results");
271                int id[] = data.getIntArrayExtra("tests");
272
273                for (int ct=0; ct < id.length; ct++) {
274                    IPTestListJB.TestName t = IPTestListJB.TestName.values()[id[ct]];
275
276                    String s = t.toString() + "   " + df.format(rebase(r[ct], t)) +
277                            "X,   " + df.format(r[ct]) + "ms";
278                    mTestList.set(id[ct], s);
279                    mTestListAdapter.notifyDataSetChanged();
280                    mResults[id[ct]] = r[ct];
281                }
282
283                double gm[] = {1.0, 1.0, 1.0};
284                double count[] = {0, 0, 0};
285                for (int ct=0; ct < IPTestListJB.TestName.values().length; ct++) {
286                    IPTestListJB.TestName t = IPTestListJB.TestName.values()[ct];
287                    gm[t.group] *= rebase(mResults[ct], t);
288                    count[t.group] += 1.0;
289                }
290                gm[0] = java.lang.Math.pow(gm[0], 1.0 / count[0]);
291                gm[1] = java.lang.Math.pow(gm[1], 1.0 / count[1]);
292                gm[2] = java.lang.Math.pow(gm[2], 1.0 / count[2]);
293
294                String s = "Results:  fp full=" + df.format(gm[0]) +
295                        ",  fp relaxed=" +df.format(gm[1]) +
296                        ",  intrinsics=" + df.format(gm[2]);
297                mResultView.setText(s);
298                writeResults();
299            }
300        }
301    }
302
303    public void btnSelAll(View v) {
304        IPTestListJB.TestName t[] = IPTestListJB.TestName.values();
305        for (int i=0; i < t.length; i++) {
306            mTestListView.setItemChecked(i, true);
307        }
308    }
309
310    public void btnSelNone(View v) {
311        checkGroup(-1);
312    }
313
314    public void btnSelHp(View v) {
315        checkGroup(0);
316    }
317
318    public void btnSelLp(View v) {
319        checkGroup(1);
320    }
321
322    public void btnSelIntrinsic(View v) {
323        checkGroup(2);
324    }
325
326
327
328}
329