1 package jp.osdn.gokigen.gokigenassets.camera.camerax.operation
3 import android.annotation.SuppressLint
4 import android.graphics.PointF
5 import android.graphics.RectF
6 import android.util.Log
7 import android.view.MotionEvent
8 import androidx.camera.camera2.interop.Camera2CameraControl
9 import androidx.camera.camera2.interop.Camera2CameraInfo
10 import androidx.camera.core.ExposureState
11 import androidx.camera.core.FocusMeteringAction
12 import androidx.camera.core.SurfaceOrientedMeteringPointFactory
13 import jp.osdn.gokigen.gokigenassets.camera.interfaces.IDisplayInjector
14 import jp.osdn.gokigen.gokigenassets.camera.interfaces.IFocusingControl
15 import jp.osdn.gokigen.gokigenassets.camera.interfaces.IFocusingModeNotify
16 import jp.osdn.gokigen.gokigenassets.liveview.IIndicatorControl
17 import jp.osdn.gokigen.gokigenassets.liveview.focusframe.IAutoFocusFrameDisplay
18 import kotlin.math.exp
20 class CameraXCameraControl : IFocusingControl, IDisplayInjector
22 private var isCameraControlPrepared: Boolean = false
23 private var isFrameDisplayPrepared: Boolean = false
24 private lateinit var cameraXCameraControl: androidx.camera.core.CameraControl
25 private lateinit var cameraXCameraInfo: androidx.camera.core.CameraInfo
26 private lateinit var frameDisplay: IAutoFocusFrameDisplay
27 private lateinit var indicatorControl: IIndicatorControl
28 private lateinit var focusModeNotify: IFocusingModeNotify
32 private val TAG = CameraXCameraControl::class.java.simpleName
35 fun setCameraControl(camera: androidx.camera.core.Camera)
37 cameraXCameraControl = camera.cameraControl
38 cameraXCameraInfo = camera.cameraInfo
39 isCameraControlPrepared = true
43 override fun injectDisplay(frameDisplayer: IAutoFocusFrameDisplay, indicator: IIndicatorControl, focusingModeNotify: IFocusingModeNotify)
45 Log.v(TAG, " injectDisplay()")
46 frameDisplay = frameDisplayer
47 indicatorControl = indicator
48 focusModeNotify = focusingModeNotify
49 isFrameDisplayPrepared = true
53 override fun driveAutoFocus(motionEvent: MotionEvent?): Boolean
55 //Log.v(TAG, "driveAutoFocus()")
56 if ((!isCameraControlPrepared) || (!isFrameDisplayPrepared) || (motionEvent == null) || (motionEvent.action != MotionEvent.ACTION_DOWN))
62 val point: PointF? = frameDisplay.getPointWithEvent(motionEvent)
63 if ((point != null) && (frameDisplay.isContainsPoint(point)))
76 override fun unlockAutoFocus()
78 if (!isCameraControlPrepared)
80 cameraXCameraControl.cancelFocusAndMetering()
85 override fun halfPressShutter(isPressed: Boolean)
90 if ((isCameraControlPrepared) && (isFrameDisplayPrepared)) {
94 SurfaceOrientedMeteringPointFactory(1.0f, 1.0f).createPoint(.5f, .5f)
96 FocusMeteringAction.Builder(autoFocusPoint, FocusMeteringAction.FLAG_AF)
97 //.addPoint(autoFocusPoint, FocusMeteringAction.FLAG_AE)
98 .apply { disableAutoCancel() }.build()
99 cameraXCameraControl.startFocusAndMetering(action)
101 cameraXCameraControl.cancelFocusAndMetering()
103 } catch (e: Exception) {
110 catch (e : Exception)
116 private fun lockAutoFocus(point : PointF)
120 Log.v(TAG, "lockAutoFocus() : [$point]")
121 val thread = Thread {
124 //val autoFocusPoint = SurfaceOrientedMeteringPointFactory(1.0f, 1.0f).createPoint(point.x, point.y)
125 val autoFocusPoint = SurfaceOrientedMeteringPointFactory(1.0f, 1.0f).createPoint(point.y, point.x)
126 val action = FocusMeteringAction.Builder(autoFocusPoint, FocusMeteringAction.FLAG_AF)
127 //FocusMeteringAction.Builder(autoFocusPoint)
128 // .addPoint(autoFocusPoint, FocusMeteringAction.FLAG_AE)
129 .apply { disableAutoCancel() }.build()
130 cameraXCameraControl.startFocusAndMetering(action)
133 getPreFocusFrameRect(point),
134 IAutoFocusFrameDisplay.FocusFrameStatus.Running,
138 catch (e : Exception)
145 catch (e : Exception)
151 private fun getPreFocusFrameRect(point: PointF): RectF
153 val focusWidth = 0.075f // 0.075 is rough estimate.
154 val focusHeight = 0.075f
155 return RectF(point.x - focusWidth / 2.0f, point.y - focusHeight / 2.0f, point.x + focusWidth / 2.0f, point.y + focusHeight / 2.0f)
158 private fun showFocusFrame(rect: RectF, status: IAutoFocusFrameDisplay.FocusFrameStatus, duration: Float)
160 frameDisplay.showFocusFrame(rect, status, duration)
161 indicatorControl.onAfLockUpdate(IAutoFocusFrameDisplay.FocusFrameStatus.Focused === status)
164 fun getExposureState() : ExposureState?
168 if (::cameraXCameraInfo.isInitialized)
170 return (cameraXCameraInfo.exposureState)
173 catch (e : Exception)
180 fun setExposureCompensation(indexValue : Int)
184 if (::cameraXCameraControl.isInitialized)
186 cameraXCameraControl.setExposureCompensationIndex(indexValue)
189 catch (e : Exception)
197 @SuppressLint("UnsafeOptInUsageError")
198 fun getCamera2CameraInfo() : Camera2CameraInfo?
202 if (::cameraXCameraInfo.isInitialized)
204 return (Camera2CameraInfo.from(cameraXCameraInfo))
207 catch (e : Exception)
215 @SuppressLint("UnsafeOptInUsageError")
216 fun getCamera2CameraControl() : Camera2CameraControl?
220 if (::cameraXCameraControl.isInitialized)
222 return (Camera2CameraControl.from(cameraXCameraControl))
225 catch (e : Exception)