OSDN Git Service

38f94da3ab187f55b04435a8beef8c8052a5c656
[gokigen/A01c.git] / wear / src / main / java / jp / sfjp / gokigen / a01c / thetacamerawrapper / ThetaCameraController.kt
1 package jp.sfjp.gokigen.a01c.thetacamerawrapper
2
3 import android.util.Log
4 import android.view.MotionEvent
5 import androidx.appcompat.app.AppCompatActivity
6 import androidx.preference.PreferenceDataStore
7 import jp.sfjp.gokigen.a01c.*
8 import jp.sfjp.gokigen.a01c.liveview.CameraLiveViewListenerImpl
9 import jp.sfjp.gokigen.a01c.liveview.IAutoFocusFrameDisplay
10 import jp.sfjp.gokigen.a01c.liveview.ICameraStatusReceiver
11 import jp.sfjp.gokigen.a01c.liveview.ILiveImageStatusNotify
12 import jp.sfjp.gokigen.a01c.olycamerawrapper.ICameraRunMode
13 import jp.sfjp.gokigen.a01c.olycamerawrapper.IIndicatorControl
14 import jp.sfjp.gokigen.a01c.olycamerawrapper.ILevelGauge
15 import jp.sfjp.gokigen.a01c.olycamerawrapper.IZoomLensHolder
16 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.ICameraPropertyLoadSaveOperations
17 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.ILoadSaveCameraProperties
18 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.IOlyCameraPropertyProvider
19 import jp.sfjp.gokigen.a01c.preference.PreferenceAccessWrapper
20 import jp.sfjp.gokigen.a01c.thetacamerawrapper.connection.ThetaCameraConnection
21 import jp.sfjp.gokigen.a01c.thetacamerawrapper.liveview.ThetaLiveViewControl
22 import jp.sfjp.gokigen.a01c.thetacamerawrapper.operation.ThetaDummyOperation
23 import jp.sfjp.gokigen.a01c.thetacamerawrapper.operation.ThetaMovieRecordingControl
24 import jp.sfjp.gokigen.a01c.thetacamerawrapper.operation.ThetaOptionUpdateControl
25 import jp.sfjp.gokigen.a01c.thetacamerawrapper.operation.ThetaSingleShotControl
26 import jp.sfjp.gokigen.a01c.thetacamerawrapper.status.ThetaCameraStatusWatcher
27
28 class ThetaCameraController(val context: AppCompatActivity, private val focusFrameDisplay: IAutoFocusFrameDisplay, private val showInformation: IShowInformation, private val receiver: ICameraStatusReceiver, private val preferences: PreferenceAccessWrapper) : ICameraController, IIndicatorControl, IThetaSessionIdProvider, IThetaStatusHolder
29 {
30     private lateinit var featureDispatcher : ThetaFeatureDispatcher
31     private lateinit var liveViewControl : ThetaLiveViewControl
32     private val dummyOperation = ThetaDummyOperation()
33     private val sessionIdHolder = ThetaSessionHolder()
34     private val cameraConnection = ThetaCameraConnection(context, receiver, sessionIdHolder)
35     private val singleShot = ThetaSingleShotControl(sessionIdHolder, this, this)
36     private val movieShot = ThetaMovieRecordingControl(context, sessionIdHolder, this, showInformation, this)
37     private val optionSet = ThetaOptionUpdateControl(sessionIdHolder)
38     private val statusWatcher = ThetaCameraStatusWatcher(this, this, showInformation)
39     private var takeMode = "P"
40
41     override fun connectFinished()
42     {
43         try
44         {
45             // スチルモードに切り替える
46             changeCaptureImageMode(sessionIdHolder.isApiLevelV21())
47         }
48         catch (e : Exception)
49         {
50             e.printStackTrace()
51         }
52     }
53
54     override fun setLiveViewListener(listener: CameraLiveViewListenerImpl)
55     {
56         Log.v(TAG, " setLiveViewListener() : ${sessionIdHolder.isApiLevelV21()} ")
57         this.liveViewControl = ThetaLiveViewControl(listener)
58     }
59
60     override fun changeLiveViewSize(size: String?)
61     {
62         // ログだけ残す
63         Log.v(toString(), " changeLiveViewSize: $size")
64     }
65
66     override fun startLiveView()
67     {
68         try
69         {
70             // ライブビューの表示...
71             if (::liveViewControl.isInitialized)
72             {
73                 liveViewControl.startLiveView(sessionIdHolder)
74             }
75         }
76         catch (e : Exception)
77         {
78             e.printStackTrace()
79         }
80     }
81
82     override fun stopLiveView()
83     {
84         if (::liveViewControl.isInitialized)
85         {
86             liveViewControl.stopLiveView()
87         }
88     }
89
90     override fun updateTakeMode()
91     {
92         if (::featureDispatcher.isInitialized)
93         {
94             Log.v(TAG, " MODE CHANGE FROM $takeMode")
95             when (takeMode)
96             {
97                 "Movie" -> changeCaptureImageMode(sessionIdHolder.isApiLevelV21())
98                 "P" -> changeCaptureVideoMode(sessionIdHolder.isApiLevelV21())
99             }
100         }
101     }
102
103     override fun getCaptureMode() : String
104     {
105         return (takeMode)
106     }
107
108     override fun setCaptureMode(captureMode : String)
109     {
110         when (captureMode) {
111             "image" -> takeMode = "P"
112             "video" -> takeMode = "Movie"
113             "_video" -> takeMode = "Movie"
114         }
115     }
116
117     private fun changeCaptureImageMode(apiV21 : Boolean)
118     {
119         try
120         {
121             optionSet.setOptions("\"captureMode\" : \"image\"", apiV21)
122             waitMs(200)
123             startLiveView()
124         }
125         catch (e : Exception)
126         {
127             e.printStackTrace()
128         }
129     }
130
131     private fun changeCaptureVideoMode(apiV21 : Boolean)
132     {
133         try
134         {
135             if (apiV21)
136             {
137                 optionSet.setOptions("\"captureMode\" : \"video\"", apiV21)
138             }
139             else
140             {
141                 optionSet.setOptions("\"captureMode\" : \"_video\"", apiV21)
142
143                 // API Level 1 の対応機種では、Videoモードでライブビューが動かないので止める
144                 waitMs(200);
145                 stopLiveView()
146             }
147         }
148         catch (e : Exception)
149         {
150             e.printStackTrace()
151         }
152     }
153
154     override fun driveAutoFocus(event: MotionEvent?): Boolean
155     {
156         return (true)
157     }
158
159     override fun unlockAutoFocus()
160     {
161         // なにもしない
162     }
163
164     override fun isContainsAutoFocusPoint(event: MotionEvent?): Boolean
165     {
166         return (false)
167     }
168
169     override fun singleShot()
170     {
171         singleShot.singleShot(sessionIdHolder.isApiLevelV21())
172     }
173
174     override fun movieControl()
175     {
176         movieShot.movieControl(sessionIdHolder.isApiLevelV21())
177     }
178
179     override fun bracketingShot(bracketingStyle: Int, bracketingCount: Int, durationSeconds: Int)
180     {
181         // TODO("Not yet implemented")
182     }
183
184     override fun setRecViewMode(isRecViewMode: Boolean)
185     {
186         // なにもしない
187     }
188
189     override fun toggleAutoExposure()
190     {
191         // なにもしない
192     }
193
194     override fun toggleManualFocus()
195     {
196         // なにもしない
197     }
198
199     override fun isManualFocus(): Boolean
200     {
201         return (false)
202     }
203
204     override fun isAFLock(): Boolean
205     {
206         return (false)
207     }
208
209     override fun isAELock(): Boolean
210     {
211         return (false)
212     }
213
214     override fun updateStatusAll()
215     {
216         // なにもしない
217     }
218
219     override fun getStatusWatcher(): ICameraStatusWatcher
220     {
221         return (statusWatcher)
222     }
223
224     override fun getCameraPropertyProvider(): IOlyCameraPropertyProvider
225     {
226         return (dummyOperation)
227     }
228
229     override fun getCameraPropertyLoadSaveOperations(): ICameraPropertyLoadSaveOperations
230     {
231         return (dummyOperation)
232     }
233
234     override fun getLoadSaveCameraProperties(): ILoadSaveCameraProperties
235     {
236         return (dummyOperation)
237     }
238
239     override fun getChangeRunModeExecutor(): ICameraRunMode
240     {
241         return (dummyOperation)
242     }
243
244     override fun getConnectionInterface(): ICameraConnection
245     {
246         return (cameraConnection)
247     }
248
249     override fun getZoomLensHolder(): IZoomLensHolder
250     {
251         return (dummyOperation)
252     }
253
254     override fun getLevelGauge(): ILevelGauge
255     {
256         return (dummyOperation)
257     }
258
259     override fun getFeatureDispatcher(context: AppCompatActivity, statusDrawer: IShowInformation, camera: ICameraController, accessWrapper: PreferenceDataStore, liveImageView: ILiveImageStatusNotify): ICameraFeatureDispatcher
260     {
261         if (!(::featureDispatcher.isInitialized))
262         {
263             featureDispatcher = ThetaFeatureDispatcher(context, statusDrawer, camera, accessWrapper, liveImageView, optionSet, this, this)
264         }
265         return (featureDispatcher)
266     }
267
268     override fun onAfLockUpdate(isAfLocked: Boolean)
269     {
270         //TODO("Not yet implemented")
271     }
272
273     override fun onShootingStatusUpdate(status: IIndicatorControl.shootingStatus?)
274     {
275         //TODO("Not yet implemented")
276     }
277
278     private fun waitMs(waitMs: Int)
279     {
280         try
281         {
282             Thread.sleep(waitMs.toLong())
283         }
284         catch (e: Exception)
285         {
286             e.printStackTrace()
287         }
288     }
289
290     companion object
291     {
292         private val TAG = ThetaCameraController::class.java.simpleName
293     }
294
295     override fun getSessionId(): String
296     {
297         return (sessionIdHolder.sessionId)
298     }
299 }