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
30 class ThetaCameraController(val context: AppCompatActivity, private val focusFrameDisplay: IAutoFocusFrameDisplay, private val showInformation: IShowInformation, private val receiver: ICameraStatusReceiver, private val preferences: PreferenceAccessWrapper) : ICameraController, IIndicatorControl
32 private lateinit var featureDispatcher : ThetaFeatureDispatcher
33 private lateinit var liveViewControl : ThetaLiveViewControl
34 private val dummyOperation = ThetaDummyOperation()
35 private val sessionIdHolder = ThetaSessionHolder()
36 private val cameraConnection = ThetaCameraConnection(context, receiver, sessionIdHolder)
37 private val singleShot = ThetaSingleShotControl(sessionIdHolder, this, this)
38 private val movieShot = ThetaMovieRecordingControl(context, sessionIdHolder, this, showInformation, this)
39 private val optionSet = ThetaOptionUpdateControl(sessionIdHolder, this, this)
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 when (featureDispatcher.takeMode)
96 "P" -> changeCaptureImageMode(sessionIdHolder.isApiLevelV21())
97 "Movie" -> changeCaptureVideoMode(sessionIdHolder.isApiLevelV21())
102 private fun changeCaptureImageMode(apiV21 : Boolean)
106 optionSet.setOptions("\"captureMode\" : \"image\"", apiV21)
110 catch (e : Exception)
116 private fun changeCaptureVideoMode(apiV21 : Boolean)
122 optionSet.setOptions("\"captureMode\" : \"video\"", apiV21)
126 optionSet.setOptions("\"captureMode\" : \"_video\"", apiV21)
128 // API Level 1 の対応機種では、Videoモードでライブビューが動かないので止める
133 catch (e : Exception)
139 override fun driveAutoFocus(event: MotionEvent?): Boolean
144 override fun unlockAutoFocus()
149 override fun isContainsAutoFocusPoint(event: MotionEvent?): Boolean
154 override fun singleShot()
156 singleShot.singleShot(sessionIdHolder.isApiLevelV21())
159 override fun movieControl()
161 movieShot.movieControl(sessionIdHolder.isApiLevelV21())
164 override fun bracketingShot(bracketingStyle: Int, bracketingCount: Int, durationSeconds: Int)
166 // TODO("Not yet implemented")
169 override fun setRecViewMode(isRecViewMode: Boolean)
174 override fun toggleAutoExposure()
179 override fun toggleManualFocus()
184 override fun isManualFocus(): Boolean
189 override fun isAFLock(): Boolean
194 override fun isAELock(): Boolean
199 override fun updateStatusAll()
204 override fun getCameraPropertyProvider(): IOlyCameraPropertyProvider
206 return (dummyOperation)
209 override fun getCameraPropertyLoadSaveOperations(): ICameraPropertyLoadSaveOperations
211 return (dummyOperation)
214 override fun getLoadSaveCameraProperties(): ILoadSaveCameraProperties
216 return (dummyOperation)
219 override fun getChangeRunModeExecutor(): ICameraRunMode
221 return (dummyOperation)
224 override fun getConnectionInterface(): ICameraConnection
226 return (cameraConnection)
229 override fun getZoomLensHolder(): IZoomLensHolder
231 return (dummyOperation)
234 override fun getLevelGauge(): ILevelGauge
236 return (dummyOperation)
239 override fun getFeatureDispatcher(context: AppCompatActivity, statusDrawer: IShowInformation, camera: ICameraController, accessWrapper: PreferenceDataStore, liveImageView: ILiveImageStatusNotify): ICameraFeatureDispatcher
241 if (!(::featureDispatcher.isInitialized))
243 featureDispatcher = ThetaFeatureDispatcher(context, statusDrawer, camera, accessWrapper, liveImageView)
245 return (featureDispatcher)
248 override fun onAfLockUpdate(isAfLocked: Boolean)
250 //TODO("Not yet implemented")
253 override fun onShootingStatusUpdate(status: IIndicatorControl.shootingStatus?)
255 //TODO("Not yet implemented")
258 private fun waitMs(waitMs: Int)
262 Thread.sleep(waitMs.toLong())
272 private val TAG = ThetaCameraController::class.java.simpleName