package cs495.pocketdslr;
import android.hardware.camera2.CameraCharacteristics;
import android.util.Pair;
import android.util.Range;
import java.lang.reflect.Array;
import java.text.DecimalFormat;
import java.util.ArrayDeque;
import java.util.List;
/**
* Created by Chris on 4/6/2015.
*/
public class CameraSetting {
protected String settingKey;
protected Object[] possibleValues;
public Object lookup;
private CameraSetting(String settingKey, Object[] possibleValues){
this.settingKey = settingKey;
this.possibleValues = possibleValues;
}
public String getSettingKey(){
return this.settingKey;
}
public Pair<Integer, String> translateSettingValue(int value){
int possibleValuesCount = this.possibleValues.length;
int valueIndex = (int)(possibleValuesCount * (value / 100.0));
return this.getPossibleValueAt(valueIndex);
}
public int reverseTranslatedValue(int value) {
for (int i = 0; i < this.possibleValues.length; i++) {
if (this.getPossibleValueAt(i).first.equals(value)){
return (int)(100 * ((float)i / this.possibleValues.length));
}
}
return 0;
}
public Pair<Integer, String> getSettingValue(int value) {
for (int i = 0; i < this.possibleValues.length; i++) {
Pair<Integer, String> settingValue = this.getPossibleValueAt(i);
if (settingValue.first.equals(value)) {
return settingValue;
}
}
return this.getPossibleValueAt(0);
}
public void setRange(CameraCharacteristics cameraCharacteristics) {
Object[] possibleValues = new Object[100];
switch (this.settingKey) {
case ManualCameraSettings.EXPOSURE_TIME:
Range<Long> exposureRange = cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_EXPOSURE_TIME_RANGE);
int lower = (int)(exposureRange.getLower() / (long)1000000) + 1;
int upper = (int)(exposureRange.getUpper() / (long)1000000);
int range = upper - lower;
int incrementer = (int)(range / 100.0);
for (int i = 0; i < 100; i++) {
Integer value = i * incrementer + lower;
possibleValues[i] = new Pair<Integer, String>(value, value.toString() + "ms");
}
this.possibleValues = possibleValues;
break;
case ManualCameraSettings.APERTURE_SIZE:
float availableApertures = cameraCharacteristics.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE);
//this.lookup = availableApertures;
//possibleValues = new Object[availableApertures.length];
//for (int i = 0; i < availableApertures.length; i++) {
// possibleValues[i] = new Pair<Integer, String>(i, "f " + availableApertures[i]);
//}
float[] preciseFocusDistances = new float[100];
float incrementerFocus = availableApertures / 100.0f;
for (int i = 0; i < 100; i++) {
Float distance = i * incrementerFocus;
preciseFocusDistances[i] = distance;
DecimalFormat decimalFormat = new DecimalFormat("##.00");
possibleValues[i] = new Pair<Integer, String>(i, decimalFormat.format(distance));
}
this.lookup = preciseFocusDistances;
this.possibleValues = possibleValues;
break;
case ManualCameraSettings.ISO:
Range<Integer> isoRange = cameraCharacteristics.get(CameraCharacteristics.SENSOR_INFO_SENSITIVITY_RANGE);
int rangeIso = isoRange.getUpper() - isoRange.getLower();
int incrementerIso = (int)(rangeIso / 100.0);
for (int i = 0; i < 99; i++) {
Integer value = isoRange.getLower() + i * incrementerIso;
possibleValues[i] = new Pair<Integer, String>(value, "ISO " + value.toString());
}
possibleValues[99] = new Pair<Integer, String>(isoRange.getUpper(), "ISO " + isoRange.getUpper());
this.possibleValues = possibleValues;
break;
}
}
private Pair<Integer, String> getPossibleValueAt(int index) {
if (index >= this.possibleValues.length) {
index--;
}
else if (index < 0) {
index = 0;
}
return (Pair<Integer, String>)this.possibleValues[index];
}
public static CameraSetting createISOCameraSetting() {
Object[] possibleValues = new Object[100];
for (int i = 0; i < 99; i++) {
Integer value = 40 + i * 100;
possibleValues[i] = new Pair<Integer, String>(value, "ISO " + value.toString());
}
possibleValues[99] = new Pair<Integer, String>(10000, "ISO 10000");
return new CameraSetting(ManualCameraSettings.ISO, possibleValues);
}
public static CameraSetting createExposeTimeCameraSetting() {
Object[] possibleValues = new Object[100];
possibleValues[0] = new Pair<Integer, String>(2, "1/2");
for (int i = 1; i < 100; i++) {
Integer value = i * 750;
possibleValues[i] = new Pair<Integer, String>(value, "1/" + value.toString());
}
return new CameraSetting(ManualCameraSettings.EXPOSURE_TIME, possibleValues);
}
public static CameraSetting createApertureCameraSetting() {
Object[] possibleValues = new Object[1];
possibleValues[0] = new Pair<Integer, String>(1, "14.29");
return new CameraSetting(ManualCameraSettings.APERTURE_SIZE, possibleValues);
}
}