1 package jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.wrapper
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.preference.ICameraPreferenceProvider
8 import jp.osdn.gokigen.gokigenassets.camera.interfaces.*
9 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraChangeListener
10 import jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.IPanasonicCamera
11 import jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.IPanasonicCameraHolder
12 import jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.connection.PanasonicCameraConnection
13 import jp.osdn.gokigen.gokigenassets.camera.vendor.ICameraControlCoordinator
14 import jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.liveview.PanasonicLiveViewControl
15 import jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.operation.PanasonicCameraCaptureControl
16 import jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.operation.PanasonicCameraFocusControl
17 import jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.operation.PanasonicCameraZoomLensControl
18 import jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.status.CameraEventObserver
19 import jp.osdn.gokigen.gokigenassets.constants.IApplicationConstantConvert
20 import jp.osdn.gokigen.gokigenassets.liveview.ICachePositionProvider
21 import jp.osdn.gokigen.gokigenassets.liveview.IIndicatorControl
22 import jp.osdn.gokigen.gokigenassets.liveview.ILiveView
23 import jp.osdn.gokigen.gokigenassets.liveview.ILiveViewRefresher
24 import jp.osdn.gokigen.gokigenassets.liveview.focusframe.IAutoFocusFrameDisplay
25 import jp.osdn.gokigen.gokigenassets.liveview.image.CameraLiveViewListenerImpl
26 import jp.osdn.gokigen.gokigenassets.liveview.storeimage.StoreImage
27 import jp.osdn.gokigen.gokigenassets.preference.PreferenceAccessWrapper
28 import jp.osdn.gokigen.gokigenassets.scene.IInformationReceiver
29 import jp.osdn.gokigen.gokigenassets.scene.IVibrator
30 import jp.osdn.gokigen.gokigenassets.utils.communication.SimpleHttpClient
32 class PanasonicCameraControl(private val context: AppCompatActivity, private val vibrator : IVibrator, informationNotify: IInformationReceiver, private val preference: ICameraPreferenceProvider, provider: ICameraStatusReceiver, private val cameraCoordinator: ICameraControlCoordinator, private val number: Int) : IPanasonicCameraHolder, IDisplayInjector,ILiveViewController, ICameraControl, View.OnClickListener, View.OnLongClickListener, ICameraShutter, IKeyDown
34 private val cardSlotSelector = PanasonicCardSlotSelector()
35 private val liveViewListener = CameraLiveViewListenerImpl(context, informationNotify)
36 private val cameraConnection: PanasonicCameraConnection = PanasonicCameraConnection(context, provider, this, this, cardSlotSelector, cameraCoordinator, number)
37 private val storeImage = StoreImage(context, liveViewListener)
39 private lateinit var cachePositionProvider : ICachePositionProvider
40 private lateinit var panasonicCamera: IPanasonicCamera
41 private lateinit var statusChecker: CameraEventObserver
42 private var liveViewControl: PanasonicLiveViewControl? = null
43 private var focusControl: PanasonicCameraFocusControl? = null
44 private var captureControl: PanasonicCameraCaptureControl? = null
45 private val zoomControl = PanasonicCameraZoomLensControl()
46 private var isStatusWatch = false
47 private var cameraPositionId = 0
51 private val TAG = PanasonicCameraControl::class.java.simpleName
52 private const val TIMEOUT_MS = 3000
53 private const val CONNECT_DELAY_MS : Long = 150
56 override fun prepare()
58 if (::panasonicCamera.isInitialized)
60 Log.v(TAG, " prepare : " + panasonicCamera.getFriendlyName() + " " + panasonicCamera.getModelName())
63 if (!::statusChecker.isInitialized)
65 statusChecker = CameraEventObserver(context, panasonicCamera, cardSlotSelector)
67 if (liveViewControl == null)
69 liveViewControl = PanasonicLiveViewControl(liveViewListener, panasonicCamera, statusChecker.getCameraStatusEventObserver(), number)
71 focusControl?.setCamera(panasonicCamera)
72 captureControl?.setCamera(panasonicCamera)
73 zoomControl.setCamera(panasonicCamera)
82 Log.v(TAG, " panasonicCamera is not initialized...")
86 override fun startRecMode()
90 val http = SimpleHttpClient()
92 // 撮影モード(RecMode)に切り替え
93 var reply: String = http.httpGet(panasonicCamera.getCmdUrl() + "cam.cgi?mode=camcmd&value=recmode", TIMEOUT_MS)
94 if (!reply.contains("ok"))
96 Log.v(TAG, "CAMERA REPLIED ERROR : CHANGE RECMODE.")
99 // フォーカスに関しては、1点に切り替える(仮)
100 reply = http.httpGet(panasonicCamera.getCmdUrl() + "cam.cgi?mode=setsetting&type=afmode&value=1area", TIMEOUT_MS)
101 if (!reply.contains("ok"))
103 Log.v(TAG, "CAMERA REPLIED ERROR : CHANGE AF MODE 1area.")
106 // 測光モードに関しては、画面全体の測光に切り替える(仮)
107 reply = http.httpGet(panasonicCamera.getCmdUrl() + "cam.cgi?mode=setsetting&type=lightmetering&value=multi", TIMEOUT_MS)
108 if (!reply.contains("ok"))
110 Log.v(TAG, "CAMERA REPLIED ERROR : CHANGE AF MODE 1area.")
120 override fun startEventWatch(listener: ICameraChangeListener?)
124 if (::statusChecker.isInitialized)
126 if (listener != null)
128 statusChecker.setEventListener(listener)
130 statusChecker.startStatusWatch(null, null)
139 override fun detectedCamera(camera: IPanasonicCamera)
141 Log.v(TAG, "detectedCamera()")
142 panasonicCamera = camera
145 override fun getConnectionMethod(): String
150 override fun initialize()
152 // TODO("Not yet implemented")
155 override fun connectToCamera()
157 Log.v(TAG, " connectToCamera() : PANASONIC ")
160 while (!cameraCoordinator.startConnectToCamera(number))
164 Thread.sleep(CONNECT_DELAY_MS)
171 cameraConnection.connect()
173 catch (e : Exception)
179 override fun startCamera(isPreviewView: Boolean, cameraSequence: Int)
183 if (cameraConnection.getConnectionStatus() != ICameraConnectionStatus.CameraConnectionStatus.CONNECTED)
185 cameraConnection.startWatchWifiStatus(context)
189 cameraConnection.connect()
192 catch (e : Exception)
198 override fun finishCamera()
204 if (::statusChecker.isInitialized)
206 statusChecker.stopStatusWatch()
208 isStatusWatch = false
210 cameraConnection.disconnect(false)
211 cameraConnection.stopWatchWifiStatus(context)
214 catch (e : Exception)
220 override fun changeCaptureMode(mode: String)
222 // TODO("Not yet implemented")
225 override fun needRotateImage(): Boolean
230 override fun setRefresher(id: Int, refresher: ILiveViewRefresher, imageView: ILiveView, cachePosition : ICachePositionProvider)
234 liveViewListener.setRefresher(refresher)
235 imageView.setImageProvider(liveViewListener)
236 cachePositionProvider = cachePosition
238 catch (e : Exception)
244 override fun captureButtonReceiver(id: Int): View.OnClickListener
246 cameraPositionId = id
250 override fun onLongClickReceiver(id: Int): View.OnLongClickListener
252 cameraPositionId = id
256 override fun keyDownReceiver(id: Int): IKeyDown
258 cameraPositionId = id
262 override fun getFocusingControl(id: Int): IFocusingControl?
264 cameraPositionId = id
265 return (focusControl)
268 override fun getDisplayInjector(): IDisplayInjector
273 override fun injectDisplay(frameDisplayer: IAutoFocusFrameDisplay, indicator: IIndicatorControl, focusingModeNotify: IFocusingModeNotify)
275 Log.v(TAG, "injectDisplay()")
276 focusControl = PanasonicCameraFocusControl(frameDisplayer, indicator)
277 captureControl = PanasonicCameraCaptureControl(frameDisplayer, indicator)
280 override fun startLiveView(isCameraScreen: Boolean)
282 Log.v(TAG, " startLiveView($isCameraScreen) ")
287 if (::statusChecker.isInitialized)
289 statusChecker.startStatusWatch(null, null)
293 liveViewControl?.startLiveView()
295 catch (e : Exception)
301 override fun stopLiveView()
303 Log.v(TAG, " stopLiveView() ")
306 liveViewControl?.stopLiveView()
309 if (::statusChecker.isInitialized)
311 statusChecker.stopStatusWatch()
312 isStatusWatch = false
316 catch (e : Exception)
322 override fun onClick(v: View?)
330 IApplicationConstantConvert.ID_BUTTON_SHUTTER -> { doShutter() }
335 override fun doShutter()
339 Log.v(TAG, " doShutter()")
340 val isNotDriveShutter = captureImageLiveView()
341 if (isNotDriveShutter)
343 // シャッターを駆動させない(けど、バイブレーションで通知する)
344 vibrator.vibrate(IVibrator.VibratePattern.SIMPLE_SHORT)
347 if (captureControl == null)
349 Log.v(TAG, " captureControl is NULL.")
351 captureControl?.doCapture(0)
353 catch (e : Exception)
359 override fun doShutterOff()
363 Log.v(TAG, " doShutterOff()")
364 captureControl?.doCapture(0)
366 catch (e : Exception)
372 override fun handleKeyDown(keyCode: Int, event: KeyEvent): Boolean
374 if ((event.action == KeyEvent.ACTION_DOWN)&&((keyCode == KeyEvent.KEYCODE_VOLUME_UP)||(keyCode == KeyEvent.KEYCODE_CAMERA)))
382 private fun captureImageLiveView() : Boolean
386 // preferenceから設定を取得する
387 val captureBothCamera = PreferenceAccessWrapper(context).getBoolean(IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW, IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW_DEFAULT_VALUE)
388 val notUseShutter = PreferenceAccessWrapper(context).getBoolean(IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_ONLY_LIVEVIEW_IMAGE, IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_ONLY_LIVEVIEW_IMAGE_DEFAULT_VALUE)
389 if ((captureBothCamera)&&(liveViewListener.isImageReceived()))
391 // ライブビュー画像を保管する場合...
392 val thread = Thread { storeImage.doStore(cameraPositionId, false, cachePositionProvider.getCachePosition()) }
402 return (notUseShutter)
404 catch (e : Exception)
411 override fun onLongClick(v: View?): Boolean
416 override fun setNeighborCameraControl(index: Int, camera0: ICameraControl?, camera1: ICameraControl?, camera2: ICameraControl?, camera3: ICameraControl?) { }
417 override fun setNeighborCameraControlFinished() { }
419 override fun getCameraStatus(): ICameraStatus?
421 if (!::statusChecker.isInitialized)
425 return (statusChecker.getCameraStatusConvert())
428 override fun getCameraNumber(): Int