From: MRSa Date: Sat, 11 Sep 2021 14:50:40 +0000 (+0900) Subject: WPZ2で動画撮影ができるようにする。 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=1183cbfd3498753e3569108fe3b8ae01663370d4;p=gokigen%2Fmangle.git WPZ2で動画撮影ができるようにする。 --- diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/PixproCameraControl.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/PixproCameraControl.kt index 06f56e0..8bcae66 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/PixproCameraControl.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/PixproCameraControl.kt @@ -7,6 +7,7 @@ import androidx.appcompat.app.AppCompatActivity import jp.osdn.gokigen.gokigenassets.camera.interfaces.* import jp.osdn.gokigen.gokigenassets.camera.preference.ICameraPreferenceProvider import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.operation.FocusControl +import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.operation.MovieShotControl import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.operation.SingleShotControl import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.IPixproCamera import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.IPixproCameraInitializer @@ -43,7 +44,9 @@ class PixproCameraControl(private val context: AppCompatActivity, private val vi private lateinit var liveViewControl : PixproLiveViewControl private lateinit var cachePositionProvider : ICachePositionProvider private lateinit var focusControl: FocusControl - private lateinit var captureControl: SingleShotControl + private lateinit var stillControl: SingleShotControl + private lateinit var movieControl: MovieShotControl + private var cameraPositionId = 0 @@ -162,7 +165,8 @@ class PixproCameraControl(private val context: AppCompatActivity, private val vi { Log.v(TAG, "injectDisplay()") focusControl = FocusControl(commandCommunicator, frameDisplayer) - captureControl = SingleShotControl(commandCommunicator, frameDisplayer) + stillControl = SingleShotControl(commandCommunicator, frameDisplayer) + movieControl = MovieShotControl(commandCommunicator, frameDisplayer) } override fun setNeighborCameraControl(camera0: ICameraControl?, camera1: ICameraControl?, camera2: ICameraControl?, camera3: ICameraControl?) { } @@ -240,9 +244,21 @@ class PixproCameraControl(private val context: AppCompatActivity, private val vi vibrator.vibrate(IVibrator.VibratePattern.SIMPLE_SHORT) return } - if (::captureControl.isInitialized) + when (statusChecker.getStatus(ICameraStatus.TAKE_MODE)) { - captureControl.doCapture(0) + "Video" -> { + if (::movieControl.isInitialized) + { + movieControl.doCapture(0) + vibrator.vibrate(IVibrator.VibratePattern.SIMPLE_SHORT) + } + } + else -> { + if (::stillControl.isInitialized) + { + stillControl.doCapture(0) + } + } } } catch (e : Exception) @@ -256,9 +272,21 @@ class PixproCameraControl(private val context: AppCompatActivity, private val vi try { Log.v(TAG, " doShutterOff()") - if (::captureControl.isInitialized) + when (statusChecker.getStatus(ICameraStatus.TAKE_MODE)) { - captureControl.doCapture(0) + "Video" -> { + if (::movieControl.isInitialized) + { + movieControl.doCapture(-1) + vibrator.vibrate(IVibrator.VibratePattern.SIMPLE_MIDDLE) + } + } + else -> { + if (::stillControl.isInitialized) + { + stillControl.doCapture(-1) + } + } } } catch (e : Exception) diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/operation/MovieShotControl.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/operation/MovieShotControl.kt new file mode 100644 index 0000000..c48a785 --- /dev/null +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/operation/MovieShotControl.kt @@ -0,0 +1,73 @@ +package jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.operation + +import android.util.Log +import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICaptureControl +import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.IPixproCommandPublisher +import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.messages.IPixproCommandCallback +import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.messages.specific.PixproExecuteVideo +import jp.osdn.gokigen.gokigenassets.liveview.focusframe.IAutoFocusFrameDisplay + +class MovieShotControl(private val commandPublisher: IPixproCommandPublisher, frameDisplayer: IAutoFocusFrameDisplay?) : ICaptureControl, IPixproCommandCallback +{ + private var isMovieRecording = false + + override fun doCapture(kind: Int) + { + try + { + // シャッター + Log.v(TAG, " doCapture($kind) : $isMovieRecording ") + + isMovieRecording = if ((kind <= -1)||(isMovieRecording)) + { + // ビデオ録画終了 + Log.v(TAG, " FINISH VIDEO") + commandPublisher.enqueueCommand(PixproExecuteVideo(this, true)) + false + } + else + { + // ビデオ録画開始 + Log.v(TAG, " START VIDEO") + commandPublisher.enqueueCommand(PixproExecuteVideo(this, false)) + true + } + } + catch (e: Exception) + { + e.printStackTrace() + } + } + + override fun receivedMessage(id: Int, rx_body: ByteArray?) + { + Log.v(TAG, " MovieShotControl::receivedMessage() : ${rx_body?.size} bytes") +/* + try + { + if ((rx_body != null)&&(rx_body.size > 10)) + { + val highByte = rx_body[9] + val lowByte = rx_body[8] + if ((highByte == 0x20.toByte())&&(lowByte == 0x01.toByte())) + { + Log.v(TAG, String.format(" OK REPLY (ID : %d) ", id)) + } + else + { + Log.v(TAG, String.format(" RECEIVED NG REPLY ID : %d, RESPONSE CODE : 0x%02x%02x ", id, highByte, lowByte)) + } + } + } + catch (e: Exception) + { + e.printStackTrace() + } +*/ + } + + companion object + { + private val TAG = MovieShotControl::class.java.simpleName + } +} diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/operation/SingleShotControl.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/operation/SingleShotControl.kt index 21bb4a0..46970d6 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/operation/SingleShotControl.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/operation/SingleShotControl.kt @@ -14,7 +14,7 @@ class SingleShotControl(private val commandPublisher: IPixproCommandPublisher, f try { // シャッター - Log.v(TAG, " doCapture() ") + Log.v(TAG, " doCapture() : $kind") // シャッターを切る commandPublisher.enqueueCommand(PixproExecuteShutter(this)) @@ -27,7 +27,7 @@ class SingleShotControl(private val commandPublisher: IPixproCommandPublisher, f override fun receivedMessage(id: Int, rx_body: ByteArray?) { - Log.v(TAG, " KodakCaptureControl::receivedMessage() : ") + Log.v(TAG, " SingleShotControl::receivedMessage() : ") /* try { diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/base/IPixproMessages.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/base/IPixproMessages.kt index 1d048c3..01dca6b 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/base/IPixproMessages.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/base/IPixproMessages.kt @@ -12,6 +12,7 @@ interface IPixproMessages const val SEQ_SHUTTER = 10 const val SEQ_FOCUS = 11 const val SEQ_ZOOM = 12 + const val SEQ_VIDEO = 13 const val SEQ_FLASH_OFF = 20 const val SEQ_FLASH_ON = 21 diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/base/PixproCommandReceiveOnly.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/base/PixproCommandReceiveOnly.kt index ce4c368..8006cb3 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/base/PixproCommandReceiveOnly.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/base/PixproCommandReceiveOnly.kt @@ -3,7 +3,7 @@ package jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.messa import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.messages.IPixproCommandCallback -class PixproCommandReceiveOnly(private val id: Int, private val callback: IPixproCommandCallback) : PixproCommandBase() +class PixproCommandReceiveOnly(private val id: Int, private val callback: IPixproCommandCallback, private val isDumpLog:Boolean = false) : PixproCommandBase() { override fun responseCallback(): IPixproCommandCallback { @@ -17,6 +17,6 @@ class PixproCommandReceiveOnly(private val id: Int, private val callback: IPixpr override fun dumpLog(): Boolean { - return false + return (isDumpLog) } } diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproChangeMode.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproChangeMode.kt index 131e495..f0b366b 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproChangeMode.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproChangeMode.kt @@ -9,13 +9,13 @@ class PixproChangeMode(private val callback: IPixproCommandCallback, modeValue0: private val data0: Byte = modeValue0.toByte() private val data1: Byte = modeValue1.toByte() - override fun getId() : Int { return (IPixproMessages.SEQ_CHANGE_MODE) } - override fun commandBody(): ByteArray { + override fun commandBody(): ByteArray + { return byteArrayOf( 0x2e.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x20.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproChangeVideoMode.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproChangeVideoMode.kt index 83aa2a4..153052c 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproChangeVideoMode.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproChangeVideoMode.kt @@ -59,6 +59,15 @@ class PixproChangeVideoMode(private val callback: IPixproCommandCallback) : Pixp 0x03.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0xff.toByte(), 0xff.toByte(), 0xff.toByte(), 0xff.toByte(), + 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), + + + 0x2e.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0xf1.toByte(), 0x03.toByte(), 0x00.toByte(), 0x00.toByte(), 0x01.toByte(), 0x00.toByte(), 0x00.toByte(), 0x80.toByte(), + 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x01.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), + 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), + 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), + + 0xff.toByte(), 0xff.toByte(), 0xff.toByte(), 0xff.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte() ) } diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproExecuteVideo.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproExecuteVideo.kt index eb6d6f4..9a95a11 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproExecuteVideo.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproExecuteVideo.kt @@ -1,24 +1,30 @@ package jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.messages.specific -import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.messages.IPixproCommandCallback + import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.messages.IPixproCommandCallback import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.messages.base.IPixproMessages import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.messages.base.PixproCommandBase -class PixproExecuteVideo(private val callback: IPixproCommandCallback, isStop: Boolean = false) : PixproCommandBase() +class PixproExecuteVideo(private val callback: IPixproCommandCallback, isStop: Boolean = false, private val isDumpLog: Boolean = false) : PixproCommandBase() { private val data0: Byte = if (isStop) 0x03.toByte() else 0x02.toByte() - override fun getId() : Int { - return (IPixproMessages.SEQ_SHUTTER) + return (IPixproMessages.SEQ_VIDEO) + } + + override fun dumpLog(): Boolean + { + return (isDumpLog) } override fun commandBody(): ByteArray { - return byteArrayOf( // (byte) 0xf9, (byte) 0x03 + return byteArrayOf( + + // (byte) 0xf9, (byte) 0x03 0x2e.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), - 0x80.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), + 0x08.toByte(), 0x00.toByte(), 0x00.toByte(), 0x00.toByte(), 0xf0.toByte(), 0x03.toByte(), 0x00.toByte(), 0x00.toByte(), 0x01.toByte(), 0x00.toByte(), 0x00.toByte(), 0x80.toByte(), diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/status/PixproStatusChecker.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/status/PixproStatusChecker.kt index 22eb21c..c17aba5 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/status/PixproStatusChecker.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/status/PixproStatusChecker.kt @@ -22,7 +22,7 @@ class PixproStatusChecker : IPixproCommandCallback, ICameraStatusWatcher, ICamer companion object { private val TAG = PixproStatusChecker::class.java.simpleName - private const val EVENT_POLL_QUEUE_MS = 350 + private const val EVENT_POLL_QUEUE_MS = 550 // 550ms private const val isDumpLog = false } @@ -278,7 +278,7 @@ class PixproStatusChecker : IPixproCommandCallback, ICameraStatusWatcher, ICamer 0x2f.toByte() -> "20s" 0x30.toByte() -> "25s" 0x31.toByte() -> "30s" - + 0x00.toByte() -> "" else -> "($sv)" } statusHolder.updateValue(ICameraStatus.SHUTTER_SPEED, shutterSpeed) diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/status/PixproStatusConvert.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/status/PixproStatusConvert.kt index f75318f..a9de8dd 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/status/PixproStatusConvert.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/status/PixproStatusConvert.kt @@ -18,8 +18,8 @@ class PixproStatusConvert(private val statusHolder: PixproStatusHolder) fun getAvailableTakeMode(): List { - return (listOf("P", "M", "ASCN")) - //return (listOf("P", "M", "ASCN", "Video", "Cont. Shot")) + //return (listOf("P", "M", "ASCN")) + return (listOf("P", "M", "ASCN", "Video", "Cont. Shot")) } fun getAvailableShutterSpeed(): List