OSDN Git Service

bfe9f8e709e02413d3f54b348589fea9803dcd8b
[gokigen/A01c.git] / wear / src / main / java / jp / sfjp / gokigen / a01c / olycamerawrapper / OlyCameraCoordinator.java
1 package jp.sfjp.gokigen.a01c.olycamerawrapper;
2
3 import android.app.Activity;
4 import android.graphics.PointF;
5 import android.graphics.RectF;
6 import android.util.Log;
7 import android.view.MotionEvent;
8 import android.widget.Toast;
9
10 import jp.co.olympus.camerakit.OLYCamera;
11 import jp.co.olympus.camerakit.OLYCameraLiveViewListener;
12 import jp.co.olympus.camerakit.OLYCameraStatusListener;
13
14 import jp.sfjp.gokigen.a01c.IShowInformation;
15 import jp.sfjp.gokigen.a01c.R;
16 import jp.sfjp.gokigen.a01c.liveview.IAutoFocusFrameDisplay;
17 import jp.sfjp.gokigen.a01c.liveview.ICameraStatusReceiver;
18 import jp.sfjp.gokigen.a01c.olycamerawrapper.indicator.CameraStatusDisplay;
19 import jp.sfjp.gokigen.a01c.olycamerawrapper.indicator.ICameraStatusDisplay;
20 import jp.sfjp.gokigen.a01c.olycamerawrapper.listeners.CameraPropertyListenerImpl;
21 import jp.sfjp.gokigen.a01c.olycamerawrapper.listeners.CameraRecordingListenerImpl;
22 import jp.sfjp.gokigen.a01c.olycamerawrapper.listeners.CameraStatusListenerImpl;
23 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.ICameraPropertyLoadSaveOperations;
24 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.ILoadSaveCameraProperties;
25 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.IOlyCameraProperty;
26 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.IOlyCameraPropertyProvider;
27 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.LoadSaveCameraProperties;
28 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.OlyCameraPropertyProxy;
29 import jp.sfjp.gokigen.a01c.olycamerawrapper.takepicture.AutoFocusControl;
30 import jp.sfjp.gokigen.a01c.olycamerawrapper.takepicture.BracketingShotControl;
31 import jp.sfjp.gokigen.a01c.olycamerawrapper.takepicture.MovieRecordingControl;
32 import jp.sfjp.gokigen.a01c.olycamerawrapper.takepicture.SingleShotControl;
33 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.CameraPropertyLoadSaveOperations;
34 import jp.sfjp.gokigen.a01c.preference.IPreferenceCameraPropertyAccessor;
35
36 /**
37  *   OlyCameraCoordinator : Olympus Air との接続、切断の間をとりもつクラス。
38  *                         (OLYCameraクラスの実体を保持する)
39  *
40  *    1. クラスを作成する
41  *    2. connectWifi() でカメラと接続する
42  *    3. disconnect() でカメラと切断する
43  *
44  *    X. onDisconnectedByError() でカメラの通信状態が変更されたことを受信する
45  *    o. CameraInteractionCoordinator.ICameraCallback でカメラとの接続状態を通知する
46  *
47  */
48 public class OlyCameraCoordinator implements IOlyCameraCoordinator, IIndicatorControl, ICameraRunMode, IOLYCameraObjectProvider
49 {
50     private final String TAG = toString();
51     private final IAutoFocusFrameDisplay focusFrameDisplay;
52     private final OLYCamera camera;
53     private final Activity context;
54
55     // 本クラスの配下のカメラ制御クラス群
56     private final AutoFocusControl autoFocus;
57     private final SingleShotControl singleShot;
58     private final MovieRecordingControl movieControl;
59     private final BracketingShotControl bracketingShot;
60     private final OlyCameraPropertyProxy propertyProxy;
61     private final CameraPropertyLoadSaveOperations loadSaveOperations;
62     private final LoadSaveCameraProperties loadSaveCameraProperties;
63     private final OlyCameraConnection cameraConnection;
64     private final ICameraStatusDisplay cameraStatusDisplay;
65     private final LevelMeterHolder levelMeter;
66     private final ZoomLensHolder zoomLensHolder;
67
68     private boolean isManualFocus = false;
69     private boolean isAutoFocusLocked = false;
70     //private boolean isExposureLocked = false;
71
72
73     /**
74      * コンストラクタ
75      */
76     public OlyCameraCoordinator(Activity context, IAutoFocusFrameDisplay focusFrameDisplay, IShowInformation showInformation, ICameraStatusReceiver receiver)
77     {
78         this.context = context;
79         this.focusFrameDisplay = focusFrameDisplay;
80
81         // OLYMPUS CAMERA クラスの初期化、リスナの設定
82         camera = new OLYCamera();
83         camera.setContext(context.getApplicationContext());
84
85         this.cameraConnection = new OlyCameraConnection(context, camera, receiver);
86         camera.setConnectionListener(cameraConnection);
87
88         // 本クラスの配下のカメラ制御クラス群の設定
89         autoFocus = new AutoFocusControl(camera, focusFrameDisplay, this); // AF制御
90         singleShot = new SingleShotControl(camera, focusFrameDisplay, this, showInformation);  // 1枚撮影
91         movieControl = new MovieRecordingControl(context, camera, showInformation); // ムービー撮影
92         bracketingShot = new BracketingShotControl(camera, focusFrameDisplay, this, showInformation);  // ブラケッティング&インターバル撮影
93         propertyProxy = new OlyCameraPropertyProxy(camera); // カメラプロパティ
94         cameraStatusDisplay = new CameraStatusDisplay(propertyProxy, showInformation);  // 画面表示
95         this.levelMeter = new LevelMeterHolder(showInformation, android.support.v7.preference.PreferenceManager.getDefaultSharedPreferences(context).getBoolean(IPreferenceCameraPropertyAccessor.SHOW_LEVEL_GAUGE_STATUS, false));  // デジタル水準器
96         camera.setCameraStatusListener(new CameraStatusListenerImpl(context, cameraStatusDisplay, levelMeter));
97         camera.setCameraPropertyListener(new CameraPropertyListenerImpl(cameraStatusDisplay));
98         camera.setRecordingListener(new CameraRecordingListenerImpl(context, showInformation));
99         loadSaveCameraProperties = new LoadSaveCameraProperties(context, propertyProxy, this);
100         loadSaveOperations = new CameraPropertyLoadSaveOperations(context, loadSaveCameraProperties, cameraStatusDisplay);
101         zoomLensHolder = new ZoomLensHolder(camera);
102     }
103
104     /**
105      * ライブビューの設定
106      */
107     public void setLiveViewListener(OLYCameraLiveViewListener listener)
108     {
109         Log.v(TAG, "setLiveViewListener()");
110         try
111         {
112             camera.setLiveViewListener(listener);
113         }
114         catch (Exception e)
115         {
116             e.printStackTrace();
117         }
118     }
119
120     /**
121      *   ライブビューの解像度を設定する
122      *
123      */
124     @Override
125     public void changeLiveViewSize(String size)
126     {
127         Log.v(TAG, "changeLiveViewSize() : " + size);
128         try
129         {
130             camera.changeLiveViewSize(CameraPropertyUtilities.toLiveViewSizeType(size));
131         }
132         catch (Exception e)
133         {
134             e.printStackTrace();
135         }
136     }
137
138     /**
139      *   ライブビューの開始
140      *
141      */
142     @Override
143     public void startLiveView()
144     {
145         Log.v(TAG, "startLiveView()");
146         try
147         {
148             camera.startLiveView();
149         }
150         catch (Exception e)
151         {
152             e.printStackTrace();
153         }
154     }
155
156     /**
157      *   ライブビューの終了
158      *
159      */
160     @Override
161     public void stopLiveView()
162     {
163         Log.v(TAG, "stopLiveView()");
164         try
165         {
166             camera.stopLiveView();
167         }
168         catch (Exception e)
169         {
170             e.printStackTrace();
171         }
172     }
173
174     /**
175      *   撮影モードの更新
176      *
177      */
178     @Override
179     public void updateTakeMode()
180     {
181         cameraStatusDisplay.updateTakeMode();
182     }
183
184     /**
185      *   フォーカスロックの実行
186      */
187     public boolean driveAutoFocus(MotionEvent event)
188     {
189         if (event.getAction() != MotionEvent.ACTION_DOWN)
190         {
191             return (false);
192         }
193         PointF point = focusFrameDisplay.getPointWithEvent(event);
194         return ((focusFrameDisplay.isContainsPoint(point)) && autoFocus.lockAutoFocus(point));
195     }
196
197     /**
198      *   オートフォーカスのポイントに含まれているか確認する (trueだったら含まれる)
199      *
200      */
201     @Override
202     public boolean isContainsAutoFocusPoint(MotionEvent event)
203     {
204         //// 以下の機能は、タッチイベントの受信時のみ動作させる
205         //if (event.getAction() != MotionEvent.ACTION_DOWN)
206         //{
207         //    return (false);
208         //}
209         try
210         {
211             // タッチした位置を取得する
212             PointF point = focusFrameDisplay.getPointWithEvent(event);
213
214             // AFの有効座標を取得する
215             RectF rect = camera.getAutoFocusEffectiveArea();
216             //Log.v(TAG, "AF POINT (" + point.x + "," + point.y + ")");
217             //Log.v(TAG, "AF EFFECTIVE AREA (" + rect.left + "," + rect.left + ") - (" + rect.right + "," + rect.bottom + ")");
218             return (rect.contains(point.x, point.y));
219         }
220         catch (Exception e)
221         {
222             e.printStackTrace();
223         }
224         return (false);
225     }
226
227     /**
228      *   フォーカスロックの解除
229      */
230     public void unlockAutoFocus()
231     {
232         autoFocus.unlockAutoFocus();
233         focusFrameDisplay.hideFocusFrame();
234         isAutoFocusLocked = false;
235     }
236
237     /**
238      *   画像を1枚撮影
239      */
240     @Override
241     public void singleShot()
242     {
243         singleShot.singleShot();
244         {
245             // 撮影の表示をToastで行う (成功とか失敗とか言っていない)
246             Toast.makeText(context, R.string.shoot_camera, Toast.LENGTH_SHORT).show();
247         }
248     }
249
250     /**
251      *   ムービーの撮影・停止
252      */
253     @Override
254     public void movieControl()
255     {
256         movieControl.movieControl();
257     }
258
259     /**
260      *   インターバル&ブラケッティング撮影の実行
261      *
262      *     @param bracketingStyle : ブラケッティングスタイル
263      *     @param bracketingCount : 撮影枚数
264      *     @param durationSeconds : 撮影間隔(単位:秒)
265      *
266      */
267     @Override
268     public void bracketingShot(int bracketingStyle, int bracketingCount, int durationSeconds)
269     {
270         bracketingShot.bracketingShot(bracketingStyle, bracketingCount, durationSeconds);
271     }
272
273     /**
274      *   撮影確認画像を生成するか設定する
275      *
276      */
277     @Override
278     public void setRecViewMode(boolean isRecViewMode)
279     {
280         try
281         {
282             String value = "<" + IOlyCameraProperty.REC_PREVIEW + "/";
283             if (isRecViewMode)
284             {
285                 value = value + "ON>";
286             }
287             else
288             {
289                 value = value + "OFF>";
290             }
291             propertyProxy.setCameraPropertyValue(IOlyCameraProperty.REC_PREVIEW, value);
292         }
293         catch (Exception e)
294         {
295             e.printStackTrace();
296         }
297     }
298
299
300     @Override
301     public void toggleAutoExposure()
302     {
303         try
304         {
305             if (isAELock())
306             {
307                 Log.v(TAG, "toggleAutoExposure() : unlockAutoExposure()");
308                 camera.unlockAutoExposure();
309             }
310             else
311             {
312                 Log.v(TAG, "toggleAutoExposure() : lockAutoExposure()");
313                 camera.lockAutoExposure();
314             }
315             updateIndicatorScreen(false);
316         }
317         catch (Exception e)
318         {
319             e.printStackTrace();
320         }
321         cameraStatusDisplay.updateAeLockState();
322     }
323
324     /**
325      *   AF/MF の切り替えを行う
326      *
327      */
328     @Override
329     public void toggleManualFocus()
330     {
331         try
332         {
333             boolean isHideFocusFrame = false;
334             String property_name = IOlyCameraProperty.FOCUS_STILL;
335             String poverty_value = "<" + IOlyCameraProperty.FOCUS_STILL + "/";
336
337             // マニュアルフォーカス切替え
338             if (!isManualFocus)
339             {
340                 // AF -> MF  : オートフォーカスを解除して設定する
341                 Log.v(TAG, "toggleManualFocus() : to " + IOlyCameraProperty.FOCUS_MF);
342                 poverty_value = poverty_value + IOlyCameraProperty.FOCUS_MF + ">";
343                 camera.unlockAutoFocus();
344                 camera.setCameraPropertyValue(property_name, poverty_value);
345                 isHideFocusFrame = true;
346             }
347             else
348             {
349                 // MF -> AF
350                 Log.v(TAG, "toggleManualFocus() : to " + IOlyCameraProperty.FOCUS_SAF);
351                 poverty_value = poverty_value + IOlyCameraProperty.FOCUS_SAF + ">";
352                 camera.setCameraPropertyValue(property_name, poverty_value);
353             }
354             updateIndicatorScreen(isHideFocusFrame);
355         }
356         catch (Exception e)
357         {
358             e.printStackTrace();
359         }
360     }
361
362     private void updateIndicatorScreen(boolean isHideFocusFrame)
363     {
364         isManualFocus();
365         if (isHideFocusFrame)
366         {
367             isAutoFocusLocked = false;
368             focusFrameDisplay.hideFocusFrame();
369         }
370         cameraStatusDisplay.updateCameraStatus();
371     }
372
373     @Override
374     public boolean isManualFocus()
375     {
376         isManualFocus = propertyProxy.isManualFocus();
377         return (isManualFocus);
378     }
379
380     @Override
381     public boolean isAFLock()
382     {
383         return (isAutoFocusLocked);
384     }
385
386     @Override
387     public boolean isAELock()
388     {
389         return (propertyProxy.isExposureLocked());
390     }
391
392     @Override
393     public void setCameraStatusListener(OLYCameraStatusListener listener)
394     {
395         camera.setCameraStatusListener(listener);
396     }
397
398     @Override
399     public String getCameraStatusSummary(ICameraStatusSummary decoder)
400     {
401         return (decoder.getCameraStatusMessage(camera, ""));
402     }
403
404     /**
405      *   ステータス表示をすべて更新する
406      *
407      */
408     @Override
409     public void updateStatusAll()
410     {
411         cameraStatusDisplay.updateCameraStatusAll();
412     }
413
414     @Override
415     public void changeRunMode(boolean isRecording)
416     {
417         OLYCamera.RunMode runMode = (isRecording) ? OLYCamera.RunMode.Recording : OLYCamera.RunMode.Playback;
418         Log.v(TAG, "changeRunMode() : " + runMode);
419         try
420         {
421             camera.changeRunMode(runMode);
422         }
423         catch (Exception e)
424         {
425             e.printStackTrace();
426         }
427     }
428
429     @Override
430     public boolean isRecordingMode()
431     {
432         boolean isRecordingMode = false;
433         try
434         {
435             OLYCamera.RunMode runMode = camera.getRunMode();
436             isRecordingMode =  (runMode == OLYCamera.RunMode.Recording);
437         }
438         catch (Exception e)
439         {
440             e.printStackTrace();
441         }
442
443         return (isRecordingMode);
444     }
445
446     @Override
447     public IOlyCameraPropertyProvider getCameraPropertyProvider()
448     {
449         return (propertyProxy);
450     }
451
452     @Override
453     public ICameraPropertyLoadSaveOperations getCameraPropertyLoadSaveOperations()
454     {
455         return (loadSaveOperations);
456     }
457
458     @Override
459     public ILoadSaveCameraProperties getLoadSaveCameraProperties()
460     {
461         return (loadSaveCameraProperties);
462     }
463
464     @Override
465     public ICameraRunMode getChangeRunModeExecutor()
466     {
467         return (this);
468     }
469
470     @Override
471     public IOlyCameraConnection getConnectionInterface()
472     {
473         return (cameraConnection);
474     }
475
476     @Override
477     public IZoomLensHolder getZoomLensHolder()
478     {
479         return (zoomLensHolder);
480     }
481
482     @Override
483     public ILevelGauge getLevelGauge()
484     {
485         return (levelMeter);
486     }
487
488     @Override
489     public void onAfLockUpdate(boolean isAfLocked)
490     {
491         isAutoFocusLocked = isAfLocked;
492         updateIndicatorScreen(false);
493     }
494
495     @Override
496     public OLYCamera getOLYCamera()
497     {
498         return (camera);
499     }
500
501 }