1 package jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro
3 import android.util.Log
4 import android.view.KeyEvent
5 import android.view.View
6 import androidx.appcompat.app.AppCompatActivity
7 import jp.osdn.gokigen.gokigenassets.camera.interfaces.*
8 import jp.osdn.gokigen.gokigenassets.camera.preference.ICameraPreferenceProvider
9 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.operation.FocusControl
10 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.operation.MovieShotControl
11 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.operation.SingleShotControl
12 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.IPixproCamera
13 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.IPixproCameraInitializer
14 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.PixproCamera
15 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.IPixproCommandPublisher
16 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.IPixproCommunication
17 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.IPixproCommunicationNotify
18 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.PixproCommandCommunicator
19 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.connection.PixproCameraConnection
20 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.liveview.PixproLiveViewControl
21 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.status.PixproStatusChecker
22 import jp.osdn.gokigen.gokigenassets.constants.IApplicationConstantConvert
23 import jp.osdn.gokigen.gokigenassets.constants.ICameraConstantConvert.Companion.ID_STRING_COMMAND_LINE_DISCONNECTED
24 import jp.osdn.gokigen.gokigenassets.liveview.ICachePositionProvider
25 import jp.osdn.gokigen.gokigenassets.liveview.IIndicatorControl
26 import jp.osdn.gokigen.gokigenassets.liveview.ILiveView
27 import jp.osdn.gokigen.gokigenassets.liveview.ILiveViewRefresher
28 import jp.osdn.gokigen.gokigenassets.liveview.focusframe.IAutoFocusFrameDisplay
29 import jp.osdn.gokigen.gokigenassets.liveview.image.CameraLiveViewListenerImpl
30 import jp.osdn.gokigen.gokigenassets.liveview.storeimage.StoreImage
31 import jp.osdn.gokigen.gokigenassets.preference.PreferenceAccessWrapper
32 import jp.osdn.gokigen.gokigenassets.scene.IInformationReceiver
33 import jp.osdn.gokigen.gokigenassets.scene.IVibrator
35 class PixproCameraControl(private val context: AppCompatActivity, private val vibrator: IVibrator, private val informationNotify : IInformationReceiver, private val preference: ICameraPreferenceProvider, provider: ICameraStatusReceiver) : ICameraControl, View.OnClickListener, View.OnLongClickListener, ICameraShutter, IKeyDown, IPixproInternalInterfaces, IPixproCommunicationNotify, IDisplayInjector
37 private val statusChecker = PixproStatusChecker()
38 private val liveViewListener = CameraLiveViewListenerImpl(context, informationNotify)
39 private val cameraConnection = PixproCameraConnection(context, provider, this, statusChecker)
40 private val pixproCameraParameter = PixproCamera()
41 private val commandCommunicator = PixproCommandCommunicator(pixproCameraParameter, this, statusChecker)
42 private val storeImage = StoreImage(context, liveViewListener)
44 private lateinit var liveViewControl : PixproLiveViewControl
45 private lateinit var cachePositionProvider : ICachePositionProvider
46 private lateinit var focusControl: FocusControl
47 private lateinit var stillControl: SingleShotControl
48 private lateinit var movieControl: MovieShotControl
51 private var cameraPositionId = 0
55 private val TAG = PixproCameraControl::class.java.simpleName
58 override fun getConnectionMethod(): String
63 override fun initialize()
65 Log.v(TAG, " --- initialize() : SEQ : ${preference.getConnectionSequence()}")
66 statusChecker.setCommandPublisher(commandCommunicator)
69 override fun connectToCamera()
71 Log.v(TAG, " connectToCamera() : PIXPRO ")
74 cameraConnection.connect()
82 override fun startCamera(isPreviewView: Boolean, cameraSequence : Int)
86 if (cameraConnection.getConnectionStatus() != ICameraConnectionStatus.CameraConnectionStatus.CONNECTED)
88 cameraConnection.startWatchWifiStatus(context)
92 cameraConnection.connect()
101 override fun finishCamera()
105 if (::liveViewControl.isInitialized)
107 liveViewControl.stopLiveView()
109 statusChecker.stopStatusWatch()
110 cameraConnection.disconnect(false)
111 cameraConnection.stopWatchWifiStatus(context)
119 override fun changeCaptureMode(mode: String) { }
120 override fun needRotateImage(): Boolean { return (false) }
121 override fun setRefresher(id : Int, refresher: ILiveViewRefresher, imageView: ILiveView, cachePosition : ICachePositionProvider)
125 liveViewListener.setRefresher(refresher)
126 imageView.setImageProvider(liveViewListener)
127 cachePositionProvider = cachePosition
129 catch (e : Exception)
135 override fun captureButtonReceiver(id: Int): View.OnClickListener
137 cameraPositionId = id
141 override fun onLongClickReceiver(id: Int): View.OnLongClickListener
143 cameraPositionId = id
147 override fun keyDownReceiver(id: Int): IKeyDown
149 cameraPositionId = id
153 override fun getFocusingControl(id: Int): IFocusingControl
155 cameraPositionId = id
156 return (focusControl)
159 override fun getDisplayInjector(): IDisplayInjector
164 override fun injectDisplay(frameDisplayer: IAutoFocusFrameDisplay, indicator: IIndicatorControl, focusingModeNotify: IFocusingModeNotify)
166 Log.v(TAG, "injectDisplay()")
167 focusControl = FocusControl(commandCommunicator, frameDisplayer)
168 stillControl = SingleShotControl(commandCommunicator, frameDisplayer)
169 movieControl = MovieShotControl(commandCommunicator, frameDisplayer)
172 override fun setNeighborCameraControl(camera0: ICameraControl?, camera1: ICameraControl?, camera2: ICameraControl?, camera3: ICameraControl?) { }
173 override fun getCameraStatus(): ICameraStatus { return (statusChecker) }
175 override fun onClick(v: View?)
183 IApplicationConstantConvert.ID_BUTTON_SHUTTER -> { doShutter() }
188 override fun handleKeyDown(keyCode: Int, event: KeyEvent): Boolean
190 if ((event.action == KeyEvent.ACTION_DOWN)&&((keyCode == KeyEvent.KEYCODE_VOLUME_UP)||(keyCode == KeyEvent.KEYCODE_CAMERA)))
198 override fun onLongClick(v: View?): Boolean
203 override fun getIPixproCommunication(): IPixproCommunication { return (commandCommunicator) }
204 override fun getIPixproCommandPublisher(): IPixproCommandPublisher { return (commandCommunicator) }
205 override fun getInformationReceiver(): IInformationReceiver { return (informationNotify) }
206 override fun getIPixproCameraInitializer(): IPixproCameraInitializer { return (pixproCameraParameter) }
207 override fun getIPixproCamera(): IPixproCamera { return (pixproCameraParameter) }
208 override fun getIPixproCommunicationNotify(): IPixproCommunicationNotify { return (this) }
210 override fun readyToCommunicate()
212 Log.v(TAG, " ----- readyToCommunicate() ")
215 if (!::liveViewControl.isInitialized)
217 liveViewControl = PixproLiveViewControl(liveViewListener, pixproCameraParameter)
219 liveViewControl.startLiveView()
220 statusChecker.startStatusWatch(null, null)
228 override fun detectDisconnect()
230 Log.v(TAG, " ----- detectDisconnect() ")
231 cameraConnection.forceUpdateConnectionStatus(ICameraConnectionStatus.CameraConnectionStatus.DISCONNECTED)
232 cameraConnection.alertConnectingFailed(context.getString(ID_STRING_COMMAND_LINE_DISCONNECTED))
235 override fun doShutter()
239 Log.v(TAG, " doShutter()")
240 val isNotDriveShutter = captureImageLiveView()
241 if (isNotDriveShutter)
243 // シャッターを駆動させない(けど、バイブレーションで通知する)
244 vibrator.vibrate(IVibrator.VibratePattern.SIMPLE_SHORT)
247 when (statusChecker.getStatus(ICameraStatus.TAKE_MODE))
250 if (::movieControl.isInitialized)
252 movieControl.doCapture(0)
253 vibrator.vibrate(IVibrator.VibratePattern.SIMPLE_SHORT)
257 if (::stillControl.isInitialized)
259 stillControl.doCapture(0)
264 catch (e : Exception)
270 override fun doShutterOff()
274 Log.v(TAG, " doShutterOff()")
275 when (statusChecker.getStatus(ICameraStatus.TAKE_MODE))
278 if (::movieControl.isInitialized)
280 movieControl.doCapture(-1)
281 vibrator.vibrate(IVibrator.VibratePattern.SIMPLE_MIDDLE)
285 if (::stillControl.isInitialized)
287 stillControl.doCapture(-1)
292 catch (e : Exception)
298 private fun captureImageLiveView() : Boolean
302 // preferenceから設定を取得する
303 val captureBothCamera = PreferenceAccessWrapper(context).getBoolean(
304 IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW, IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW_DEFAULT_VALUE)
305 val notUseShutter = PreferenceAccessWrapper(context).getBoolean(
306 IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_ONLY_LIVEVIEW_IMAGE, IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_ONLY_LIVEVIEW_IMAGE_DEFAULT_VALUE)
307 if ((captureBothCamera)&&(liveViewListener.isImageReceived()))
309 // ライブビュー画像を保管する場合...
310 val thread = Thread { storeImage.doStore(cameraPositionId, false, cachePositionProvider.getCachePosition()) }
320 return (notUseShutter)
322 catch (e : Exception)