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.ICameraConnection
8 import jp.sfjp.gokigen.a01c.ICameraController
9 import jp.sfjp.gokigen.a01c.ICameraFeatureDispatcher
10 import jp.sfjp.gokigen.a01c.IShowInformation
11 import jp.sfjp.gokigen.a01c.liveview.CameraLiveViewListenerImpl
12 import jp.sfjp.gokigen.a01c.liveview.IAutoFocusFrameDisplay
13 import jp.sfjp.gokigen.a01c.liveview.ICameraStatusReceiver
14 import jp.sfjp.gokigen.a01c.liveview.ILiveImageStatusNotify
15 import jp.sfjp.gokigen.a01c.olycamerawrapper.ICameraRunMode
16 import jp.sfjp.gokigen.a01c.olycamerawrapper.IIndicatorControl
17 import jp.sfjp.gokigen.a01c.olycamerawrapper.ILevelGauge
18 import jp.sfjp.gokigen.a01c.olycamerawrapper.IZoomLensHolder
19 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.ICameraPropertyLoadSaveOperations
20 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.ILoadSaveCameraProperties
21 import jp.sfjp.gokigen.a01c.olycamerawrapper.property.IOlyCameraPropertyProvider
22 import jp.sfjp.gokigen.a01c.preference.PreferenceAccessWrapper
23 import jp.sfjp.gokigen.a01c.thetacamerawrapper.connection.ThetaCameraConnection
24 import jp.sfjp.gokigen.a01c.thetacamerawrapper.liveview.ThetaLiveViewControl
25 import jp.sfjp.gokigen.a01c.thetacamerawrapper.operation.ThetaDummyOperation
26 import jp.sfjp.gokigen.a01c.thetacamerawrapper.operation.ThetaMovieRecordingControl
27 import jp.sfjp.gokigen.a01c.thetacamerawrapper.operation.ThetaOptionUpdateControl
28 import jp.sfjp.gokigen.a01c.thetacamerawrapper.operation.ThetaSingleShotControl
31 class ThetaCameraController(val context: AppCompatActivity, private val focusFrameDisplay: IAutoFocusFrameDisplay, private val showInformation: IShowInformation, private val receiver: ICameraStatusReceiver, private val preferences: PreferenceAccessWrapper) : ICameraController, IIndicatorControl
33 private lateinit var featureDispatcher : ThetaFeatureDispatcher
34 private lateinit var liveViewControl : ThetaLiveViewControl
35 private val dummyOperation = ThetaDummyOperation()
36 private val sessionIdHolder = ThetaSessionHolder()
37 private val cameraConnection = ThetaCameraConnection(context, receiver, sessionIdHolder)
38 private val singleShot = ThetaSingleShotControl(sessionIdHolder, this, this)
39 private val movieShot = ThetaMovieRecordingControl(context, sessionIdHolder, this, showInformation, this)
40 private val optionSet = ThetaOptionUpdateControl(sessionIdHolder, this, this)
42 override fun connectFinished()
47 changeCaptureImageMode(sessionIdHolder.isApiLevelV21())
55 override fun setLiveViewListener(listener: CameraLiveViewListenerImpl)
57 Log.v(TAG, " setLiveViewListener() : ${sessionIdHolder.isApiLevelV21()} ")
58 this.liveViewControl = ThetaLiveViewControl(listener)
61 override fun changeLiveViewSize(size: String?)
64 Log.v(toString(), " changeLiveViewSize: $size")
67 override fun startLiveView()
72 if (::liveViewControl.isInitialized)
74 liveViewControl.startLiveView(sessionIdHolder)
83 override fun stopLiveView()
85 if (::liveViewControl.isInitialized)
87 liveViewControl.stopLiveView()
91 override fun updateTakeMode()
93 if (::featureDispatcher.isInitialized)
95 when (featureDispatcher.takeMode)
97 "P" -> changeCaptureImageMode(sessionIdHolder.isApiLevelV21())
98 "Movie" -> changeCaptureVideoMode(sessionIdHolder.isApiLevelV21())
103 private fun changeCaptureImageMode(apiV21 : Boolean)
107 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)
128 catch (e : Exception)
134 override fun driveAutoFocus(event: MotionEvent?): Boolean
139 override fun unlockAutoFocus()
144 override fun isContainsAutoFocusPoint(event: MotionEvent?): Boolean
149 override fun singleShot()
151 singleShot.singleShot(sessionIdHolder.isApiLevelV21())
154 override fun movieControl()
156 movieShot.movieControl(sessionIdHolder.isApiLevelV21())
159 override fun bracketingShot(bracketingStyle: Int, bracketingCount: Int, durationSeconds: Int)
161 // TODO("Not yet implemented")
164 override fun setRecViewMode(isRecViewMode: Boolean)
169 override fun toggleAutoExposure()
174 override fun toggleManualFocus()
179 override fun isManualFocus(): Boolean
184 override fun isAFLock(): Boolean
189 override fun isAELock(): Boolean
194 override fun updateStatusAll()
199 override fun getCameraPropertyProvider(): IOlyCameraPropertyProvider
201 return (dummyOperation)
204 override fun getCameraPropertyLoadSaveOperations(): ICameraPropertyLoadSaveOperations
206 return (dummyOperation)
209 override fun getLoadSaveCameraProperties(): ILoadSaveCameraProperties
211 return (dummyOperation)
214 override fun getChangeRunModeExecutor(): ICameraRunMode
216 return (dummyOperation)
219 override fun getConnectionInterface(): ICameraConnection
221 return (cameraConnection)
224 override fun getZoomLensHolder(): IZoomLensHolder
226 return (dummyOperation)
229 override fun getLevelGauge(): ILevelGauge
231 return (dummyOperation)
234 override fun getFeatureDispatcher(context: AppCompatActivity, statusDrawer: IShowInformation, camera: ICameraController, accessWrapper: PreferenceDataStore, liveImageView: ILiveImageStatusNotify): ICameraFeatureDispatcher
236 if (!(::featureDispatcher.isInitialized))
238 featureDispatcher = ThetaFeatureDispatcher(context, statusDrawer, camera, accessWrapper, liveImageView)
240 return (featureDispatcher)
243 override fun onAfLockUpdate(isAfLocked: Boolean)
245 //TODO("Not yet implemented")
248 override fun onShootingStatusUpdate(status: IIndicatorControl.shootingStatus?)
250 //TODO("Not yet implemented")
253 private fun waitMs(waitMs: Int)
257 Thread.sleep(waitMs.toLong())
267 private val TAG = ThetaCameraController::class.java.simpleName