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