OSDN Git Service

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