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
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, this, this)
38 private val statusWatcher = ThetaCameraStatusWatcher()
40 override fun connectFinished()
45 changeCaptureImageMode(sessionIdHolder.isApiLevelV21())
53 override fun setLiveViewListener(listener: CameraLiveViewListenerImpl)
55 Log.v(TAG, " setLiveViewListener() : ${sessionIdHolder.isApiLevelV21()} ")
56 this.liveViewControl = ThetaLiveViewControl(listener)
59 override fun changeLiveViewSize(size: String?)
62 Log.v(toString(), " changeLiveViewSize: $size")
65 override fun startLiveView()
70 if (::liveViewControl.isInitialized)
72 liveViewControl.startLiveView(sessionIdHolder)
81 override fun stopLiveView()
83 if (::liveViewControl.isInitialized)
85 liveViewControl.stopLiveView()
89 override fun updateTakeMode()
91 if (::featureDispatcher.isInitialized)
93 when (featureDispatcher.takeMode)
95 "P" -> changeCaptureImageMode(sessionIdHolder.isApiLevelV21())
96 "Movie" -> changeCaptureVideoMode(sessionIdHolder.isApiLevelV21())
101 private fun changeCaptureImageMode(apiV21 : Boolean)
105 optionSet.setOptions("\"captureMode\" : \"image\"", apiV21)
109 catch (e : Exception)
115 private fun changeCaptureVideoMode(apiV21 : Boolean)
121 optionSet.setOptions("\"captureMode\" : \"video\"", apiV21)
125 optionSet.setOptions("\"captureMode\" : \"_video\"", apiV21)
127 // API Level 1 の対応機種では、Videoモードでライブビューが動かないので止める
132 catch (e : Exception)
138 override fun driveAutoFocus(event: MotionEvent?): Boolean
143 override fun unlockAutoFocus()
148 override fun isContainsAutoFocusPoint(event: MotionEvent?): Boolean
153 override fun singleShot()
155 singleShot.singleShot(sessionIdHolder.isApiLevelV21())
158 override fun movieControl()
160 movieShot.movieControl(sessionIdHolder.isApiLevelV21())
163 override fun bracketingShot(bracketingStyle: Int, bracketingCount: Int, durationSeconds: Int)
165 // TODO("Not yet implemented")
168 override fun setRecViewMode(isRecViewMode: Boolean)
173 override fun toggleAutoExposure()
178 override fun toggleManualFocus()
183 override fun isManualFocus(): Boolean
188 override fun isAFLock(): Boolean
193 override fun isAELock(): Boolean
198 override fun updateStatusAll()
203 override fun getStatusWatcher(): ICameraStatusWatcher
205 return (statusWatcher)
208 override fun getCameraPropertyProvider(): IOlyCameraPropertyProvider
210 return (dummyOperation)
213 override fun getCameraPropertyLoadSaveOperations(): ICameraPropertyLoadSaveOperations
215 return (dummyOperation)
218 override fun getLoadSaveCameraProperties(): ILoadSaveCameraProperties
220 return (dummyOperation)
223 override fun getChangeRunModeExecutor(): ICameraRunMode
225 return (dummyOperation)
228 override fun getConnectionInterface(): ICameraConnection
230 return (cameraConnection)
233 override fun getZoomLensHolder(): IZoomLensHolder
235 return (dummyOperation)
238 override fun getLevelGauge(): ILevelGauge
240 return (dummyOperation)
243 override fun getFeatureDispatcher(context: AppCompatActivity, statusDrawer: IShowInformation, camera: ICameraController, accessWrapper: PreferenceDataStore, liveImageView: ILiveImageStatusNotify): ICameraFeatureDispatcher
245 if (!(::featureDispatcher.isInitialized))
247 featureDispatcher = ThetaFeatureDispatcher(context, statusDrawer, camera, accessWrapper, liveImageView)
249 return (featureDispatcher)
252 override fun onAfLockUpdate(isAfLocked: Boolean)
254 //TODO("Not yet implemented")
257 override fun onShootingStatusUpdate(status: IIndicatorControl.shootingStatus?)
259 //TODO("Not yet implemented")
262 private fun waitMs(waitMs: Int)
266 Thread.sleep(waitMs.toLong())
276 private val TAG = ThetaCameraController::class.java.simpleName