1 package jp.sfjp.gokigen.a01c.thetacamerawrapper
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
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
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"
41 override fun connectFinished()
46 changeCaptureImageMode(sessionIdHolder.isApiLevelV21())
54 override fun setLiveViewListener(listener: CameraLiveViewListenerImpl)
56 Log.v(TAG, " setLiveViewListener() : ${sessionIdHolder.isApiLevelV21()} ")
57 this.liveViewControl = ThetaLiveViewControl(listener)
60 override fun changeLiveViewSize(size: String?)
63 Log.v(toString(), " changeLiveViewSize: $size")
66 override fun startLiveView()
71 if (::liveViewControl.isInitialized)
73 liveViewControl.startLiveView(sessionIdHolder)
82 override fun stopLiveView()
84 if (::liveViewControl.isInitialized)
86 liveViewControl.stopLiveView()
90 override fun updateTakeMode()
92 if (::featureDispatcher.isInitialized)
94 Log.v(TAG, " MODE CHANGE FROM $takeMode")
97 "Movie" -> changeCaptureImageMode(sessionIdHolder.isApiLevelV21())
98 "P" -> changeCaptureVideoMode(sessionIdHolder.isApiLevelV21())
103 override fun getCaptureMode() : String
108 override fun setCaptureMode(captureMode : String)
111 "image" -> takeMode = "P"
112 "video" -> takeMode = "Movie"
113 "_video" -> takeMode = "Movie"
117 private fun changeCaptureImageMode(apiV21 : Boolean)
121 optionSet.setOptions("\"captureMode\" : \"image\"", apiV21)
125 catch (e : Exception)
131 private fun changeCaptureVideoMode(apiV21 : Boolean)
137 optionSet.setOptions("\"captureMode\" : \"video\"", apiV21)
141 optionSet.setOptions("\"captureMode\" : \"_video\"", apiV21)
143 // API Level 1 の対応機種では、Videoモードでライブビューが動かないので止める
148 catch (e : Exception)
154 override fun driveAutoFocus(event: MotionEvent?): Boolean
159 override fun unlockAutoFocus()
164 override fun isContainsAutoFocusPoint(event: MotionEvent?): Boolean
169 override fun singleShot()
171 singleShot.singleShot(sessionIdHolder.isApiLevelV21())
174 override fun movieControl()
176 movieShot.movieControl(sessionIdHolder.isApiLevelV21())
179 override fun bracketingShot(bracketingStyle: Int, bracketingCount: Int, durationSeconds: Int)
181 // TODO("Not yet implemented")
184 override fun setRecViewMode(isRecViewMode: Boolean)
189 override fun toggleAutoExposure()
194 override fun toggleManualFocus()
199 override fun isManualFocus(): Boolean
204 override fun isAFLock(): Boolean
209 override fun isAELock(): Boolean
214 override fun updateStatusAll()
219 override fun getStatusWatcher(): ICameraStatusWatcher
221 return (statusWatcher)
224 override fun getCameraPropertyProvider(): IOlyCameraPropertyProvider
226 return (dummyOperation)
229 override fun getCameraPropertyLoadSaveOperations(): ICameraPropertyLoadSaveOperations
231 return (dummyOperation)
234 override fun getLoadSaveCameraProperties(): ILoadSaveCameraProperties
236 return (dummyOperation)
239 override fun getChangeRunModeExecutor(): ICameraRunMode
241 return (dummyOperation)
244 override fun getConnectionInterface(): ICameraConnection
246 return (cameraConnection)
249 override fun getZoomLensHolder(): IZoomLensHolder
251 return (dummyOperation)
254 override fun getLevelGauge(): ILevelGauge
256 return (dummyOperation)
259 override fun getFeatureDispatcher(context: AppCompatActivity, statusDrawer: IShowInformation, camera: ICameraController, accessWrapper: PreferenceDataStore, liveImageView: ILiveImageStatusNotify): ICameraFeatureDispatcher
261 if (!(::featureDispatcher.isInitialized))
263 featureDispatcher = ThetaFeatureDispatcher(context, statusDrawer, camera, accessWrapper, liveImageView, optionSet, this, this)
265 return (featureDispatcher)
268 override fun onAfLockUpdate(isAfLocked: Boolean)
270 //TODO("Not yet implemented")
273 override fun onShootingStatusUpdate(status: IIndicatorControl.shootingStatus?)
275 //TODO("Not yet implemented")
278 private fun waitMs(waitMs: Int)
282 Thread.sleep(waitMs.toLong())
292 private val TAG = ThetaCameraController::class.java.simpleName
295 override fun getSessionId(): String
297 return (sessionIdHolder.sessionId)