OSDN Git Service

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