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 = "";
144 case IBracketingShotStyle.BRACKET_ART_FILTER:
146 targetPropertyName = IOlyCameraProperty.ART_FILTER;
154 originalPropertyIndex = prepareBracketProperty(targetPropertyName);
160 * 写真撮影(ブラケッティング撮影)を開始する
161 * bracketingStyle : ブラケッティングスタイル
162 * bracketingCount : 撮影枚数
163 * durationSeconds : 撮影間隔(単位:秒)
165 public void bracketingShot(int bracketingStyle, int bracketingCount, int durationSeconds)
167 if ((camera.isTakingPicture())||(camera.isRecordingVideo())||(isBracketingAction))
169 // スチル or ムービー撮影中、ブラケッティング撮影中なら、何もしない
174 bracketCount = bracketingCount;
175 if (!decideBracketProperty(bracketingStyle))
177 // ブラケッティング指定ではないので、何もせずに終了する
182 waitSeconds = durationSeconds;
184 // ブラケッティング撮影開始! (別スレッドでブラケッティング撮影を開始する)
185 ExecutorService executor = Executors.newSingleThreadExecutor();
186 executor.submit(new Runnable()
191 isBracketingAction = true;
192 updateMessage("BRACKET");
201 isBracketingAction = false;
210 * @param msg 表示するメッセージ
212 private void updateMessage(String msg)
214 statusDrawer.setMessage(IShowInformation.AREA_C, Color.CYAN, msg);
221 * 一番小さい選択肢(インデックス)から設定された撮影枚数分、
225 private void startBracket()
227 int startIndex = originalPropertyIndex - (bracketCount / 2);
228 if (propertyValueList != null)
230 if ((startIndex + bracketCount) > propertyValueList.size())
232 startIndex = propertyValueList.size() - bracketCount;
240 PointF afPoint = camera.getActualAutoFocusPoint();
241 statusDrawer.setEnabledOperation(false, true); // 画面のタッチ操作を禁止
242 for (int index = 0; index < bracketCount; index++)
245 updateBracketingStatus(index, startIndex);
253 camera.setAutoFocusPoint(afPoint);
261 if (bracketCount == 1)
263 // 1枚しか撮影しない時は、撮影前にウェイトをかける
264 waitSeconds(waitSeconds);
270 camera.takePicture(new HashMap<String, Object>(), this);
271 isShootingWait = true;
272 while (isShootingWait)
275 Thread.sleep(BRACKETING_INTERVAL_MILLISECOND);
276 updateShootingWaitStatus();
284 // 撮影したことをバイブレータで知らせる
285 statusDrawer.vibrate(IShowInformation.VIBRATE_PATTERN_SIMPLE_SHORT);
287 // 指定された時間待機、ただし、最後の撮影が終わったあとには待たないようにする。
288 if ((index + 1) < bracketCount)
290 waitSeconds(waitSeconds);
295 // 変更したプロパティ値を元の値に戻す...ちょっと待ってから
296 Thread.sleep(BRACKETING_INTERVAL_MILLISECOND);
297 if (originalProperty != null)
299 camera.setCameraPropertyValue(targetPropertyName, originalProperty);
303 camera.clearAutoFocusPoint();
304 autoFocusFrame.hideFocusFrame();
306 indicator.onAfLockUpdate(false);
309 statusDrawer.vibrate(IShowInformation.VIBRATE_PATTERN_SIMPLE_MIDDLE);
315 statusDrawer.setEnabledOperation(true, false); // 画面のタッチ操作を有効化する
321 * @param seconds 待機秒数
323 private void waitSeconds(int seconds)
325 for (int count = seconds; count > 0; count--)
330 // BKT表示(撮影枚数表示と待ち時間)を変える
331 updateMessage("WAIT " + count + "sec.");
345 * @param index 撮影が終了したカウント(0始まり)
347 private void updateBracketingStatus(int index, int currentIndex)
349 Log.v(TAG, "updateBracketingStatus() : " + index + "(" + currentIndex + ")");
354 if (propertyValueList != null)
356 Thread.sleep(BRACKETING_INTERVAL_MILLISECOND);
357 camera.setCameraPropertyValue(targetPropertyName, propertyValueList.get(currentIndex));
364 // 頭に来たので、再度呼ぶ (リトライオーバーするまで)
365 if (retryUpdateBracketingStatus < BRACKETING_PROPERTY_VALUE_SET_RETRY)
367 retryUpdateBracketingStatus++;
368 updateBracketingStatus(index, currentIndex);
371 retryUpdateBracketingStatus = 0;
374 updateMessage("BRACKET " + (index + 1) + "/" + bracketCount);
378 * カメラの状態を取得し、撮影可能か確認する。
379 * (trueならまだ撮影処理中、falseなら撮影可能)
381 private void updateShootingWaitStatus()
383 boolean isBusy = false;
386 isBusy = ((camera.isTakingPicture())||(camera.isMediaBusy())||(camera.isRecordingVideo()));
389 String messageToShow = "getShootingBusyStatus() : " + String.valueOf(isBusy);
390 Log.v(TAG, messageToShow);
396 isShootingWait = isBusy;
400 * OLYCamera.TakePictureCallback の実装
405 public void onProgress(OLYCamera olyCamera, OLYCamera.TakingProgress takingProgress, OLYCameraAutoFocusResult olyCameraAutoFocusResult)
411 * OLYCamera.TakePictureCallback の実装
415 public void onCompleted()
418 updateShootingWaitStatus();
422 * OLYCamera.TakePictureCallback の実装
427 public void onErrorOccurred(Exception e)
432 updateShootingWaitStatus();