1 package jp.sfjp.gokigen.a01c.olycamerawrapper.takepicture;
3 import android.graphics.Color;
4 import android.graphics.PointF;
5 import android.util.Log;
7 import java.util.HashMap;
9 import java.util.concurrent.ExecutorService;
10 import java.util.concurrent.Executors;
12 import jp.co.olympus.camerakit.OLYCamera;
13 import jp.co.olympus.camerakit.OLYCameraAutoFocusResult;
14 import jp.sfjp.gokigen.a01c.IShowInformation;
15 import jp.sfjp.gokigen.a01c.liveview.IAutoFocusFrameDisplay;
16 import jp.sfjp.gokigen.a01c.olycamerawrapper.IIndicatorControl;
17 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.IOlyCameraProperty;
20 * インターバル撮影&ブラケッティング撮影 実行クラス
23 * Created by MRSa on 2017/07/19.
25 public class BracketingShotControl implements OLYCamera.TakePictureCallback
27 private final String TAG = toString();
29 private static final int BRACKETING_INTERVAL_MILLISECOND = 300; // 撮影待ち時間(ms)
30 private static final int BRACKETING_PROPERTY_VALUE_SET_RETRY = 10;
32 private final OLYCamera camera;
33 private final IAutoFocusFrameDisplay autoFocusFrame;
34 private final IShowInformation statusDrawer;
35 private final IIndicatorControl indicator;
36 private boolean isShootingWait = false;
37 private boolean isBracketingAction = false;
38 private int retryUpdateBracketingStatus = 0;
39 private int waitSeconds = 0; // 撮影待ち時間
41 private int bracketCount = 0;
42 private String targetPropertyName = null;
43 private String originalProperty = null;
44 private int originalPropertyIndex = -1;
45 private List<String> propertyValueList = null;
51 public BracketingShotControl(OLYCamera camera, IAutoFocusFrameDisplay focusFrameDrawer, IIndicatorControl indicator, IShowInformation statusDrawer)
54 this.autoFocusFrame = focusFrameDrawer;
55 this.indicator = indicator;
56 this.statusDrawer = statusDrawer;
60 * ブラケッティング対象のプロパティの現在設定値と、その選択肢を記憶する
62 * @param name ブラケッティング対象の名前
63 * @return ブラケッティングの現在設定値
65 private int prepareBracketProperty(String name)
69 targetPropertyName = name;
70 if (name.length() > 0)
72 originalProperty = camera.getCameraPropertyValue(name);
73 propertyValueList = camera.getCameraPropertyValueList(name);
76 bracketCount = propertyValueList.size();
78 return (propertyValueList.indexOf(originalProperty));
82 originalProperty = null;
83 propertyValueList = null;
88 originalProperty = null;
89 propertyValueList = null;
98 * ブラケッティング対象のプロパティを特定する
100 * @param isBracketing プロパティ
101 * @return true : 対象の特定完了 / false : 対象の特定失敗
103 private boolean decideBracketProperty(int isBracketing)
105 switch (isBracketing)
107 case IBracketingShotStyle.BRACKET_EXPREV:
109 targetPropertyName = IOlyCameraProperty.EXPOSURE_COMPENSATION;
112 case IBracketingShotStyle.BRACKET_APERTURE:
114 targetPropertyName = IOlyCameraProperty.APERTURE;
117 case IBracketingShotStyle.BRACKET_ISO:
119 targetPropertyName = IOlyCameraProperty.ISO_SENSITIVITY;
122 case IBracketingShotStyle.BRACKET_SHUTTER:
124 targetPropertyName = IOlyCameraProperty.SHUTTER_SPEED;
127 case IBracketingShotStyle.BRACKET_WB:
129 targetPropertyName = IOlyCameraProperty.WB_MODE;
133 case IBracketingShotStyle.BRACKET_COLOR_TONE:
135 targetPropertyName = IOlyCameraProperty.COLOR_TONE;
139 case IBracketingShotStyle.BRACKET_NONE:
140 // パラメータは変更しないパターン...
141 targetPropertyName = "";
148 originalPropertyIndex = prepareBracketProperty(targetPropertyName);
154 * 写真撮影(ブラケッティング撮影)を開始する
155 * bracketingStyle : ブラケッティングスタイル
156 * bracketingCount : 撮影枚数
157 * durationSeconds : 撮影間隔(単位:秒)
159 public void bracketingShot(int bracketingStyle, int bracketingCount, int durationSeconds)
161 if ((camera.isTakingPicture())||(camera.isRecordingVideo())||(isBracketingAction))
163 // スチル or ムービー撮影中、ブラケッティング撮影中なら、何もしない
168 bracketCount = bracketingCount;
169 if (!decideBracketProperty(bracketingStyle))
171 // ブラケッティング指定ではないので、何もせずに終了する
176 waitSeconds = durationSeconds;
178 // ブラケッティング撮影開始! (別スレッドでブラケッティング撮影を開始する)
179 ExecutorService executor = Executors.newSingleThreadExecutor();
180 executor.submit(new Runnable()
185 isBracketingAction = true;
186 updateMessage("INT");
195 isBracketingAction = false;
204 * @param msg 表示するメッセージ
206 private void updateMessage(String msg)
208 statusDrawer.setMessage(IShowInformation.AREA_C, Color.CYAN, msg);
215 * 一番小さい選択肢(インデックス)から設定された撮影枚数分、
219 private void startBracket()
221 int startIndex = originalPropertyIndex - (bracketCount / 2);
222 if (propertyValueList != null)
224 if ((startIndex + bracketCount) > propertyValueList.size())
226 startIndex = propertyValueList.size() - bracketCount;
234 PointF afPoint = camera.getActualAutoFocusPoint();
235 for (int index = 0; index < bracketCount; index++)
238 updateBracketingStatus(index, startIndex);
246 camera.setAutoFocusPoint(afPoint);
254 if (bracketCount == 1)
256 // 1枚しか撮影しない時は、撮影前にウェイトをかける
257 waitSeconds(waitSeconds);
263 camera.takePicture(new HashMap<String, Object>(), this);
264 isShootingWait = true;
265 while (isShootingWait)
268 Thread.sleep(BRACKETING_INTERVAL_MILLISECOND);
269 updateShootingWaitStatus();
277 // 撮影したことをバイブレータで知らせる
278 statusDrawer.vibrate(IShowInformation.VIBRATE_PATTERN_SIMPLE_SHORT);
280 // 指定された時間待機、ただし、最後の撮影が終わったあとには待たないようにする。
281 if ((index + 1) < bracketCount)
283 waitSeconds(waitSeconds);
288 // 変更したプロパティ値を元の値に戻す...ちょっと待ってから
289 Thread.sleep(BRACKETING_INTERVAL_MILLISECOND);
290 if (originalProperty != null)
292 camera.setCameraPropertyValue(targetPropertyName, originalProperty);
296 camera.clearAutoFocusPoint();
297 autoFocusFrame.hideFocusFrame();
299 indicator.onAfLockUpdate(false);
302 statusDrawer.vibrate(IShowInformation.VIBRATE_PATTERN_SIMPLE_MIDDLE);
313 * @param seconds 待機秒数
315 private void waitSeconds(int seconds)
317 for (int count = seconds; count > 0; count--)
322 // BKT表示(撮影枚数表示と待ち時間)を変える
323 updateMessage("WAIT " + count + "s.");
337 * @param index 撮影が終了したカウント(0始まり)
339 private void updateBracketingStatus(int index, int currentIndex)
341 Log.v(TAG, "updateBracketingStatus() : " + index + "(" + currentIndex + ")");
346 if (propertyValueList != null)
348 Thread.sleep(BRACKETING_INTERVAL_MILLISECOND);
349 camera.setCameraPropertyValue(targetPropertyName, propertyValueList.get(currentIndex));
356 // 頭に来たので、再度呼ぶ (リトライオーバーするまで)
357 if (retryUpdateBracketingStatus < BRACKETING_PROPERTY_VALUE_SET_RETRY)
359 retryUpdateBracketingStatus++;
360 updateBracketingStatus(index, currentIndex);
363 retryUpdateBracketingStatus = 0;
366 updateMessage("INT " + (index + 1) + "/" + bracketCount);
370 * カメラの状態を取得し、撮影可能か確認する。
371 * (trueならまだ撮影処理中、falseなら撮影可能)
373 private void updateShootingWaitStatus()
375 boolean isBusy = false;
378 isBusy = ((camera.isTakingPicture())||(camera.isMediaBusy())||(camera.isRecordingVideo()));
381 String messageToShow = "getShootingBusyStatus() : " + String.valueOf(isBusy);
382 Log.v(TAG, messageToShow);
388 isShootingWait = isBusy;
392 * OLYCamera.TakePictureCallback の実装
397 public void onProgress(OLYCamera olyCamera, OLYCamera.TakingProgress takingProgress, OLYCameraAutoFocusResult olyCameraAutoFocusResult)
403 * OLYCamera.TakePictureCallback の実装
407 public void onCompleted()
410 updateShootingWaitStatus();
414 * OLYCamera.TakePictureCallback の実装
419 public void onErrorOccurred(Exception e)
424 updateShootingWaitStatus();