OSDN Git Service

WPZ2で動画撮影ができるようにする。
authorMRSa <mrsa@myad.jp>
Sat, 11 Sep 2021 14:50:40 +0000 (23:50 +0900)
committerMRSa <mrsa@myad.jp>
Sat, 11 Sep 2021 14:50:40 +0000 (23:50 +0900)
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/PixproCameraControl.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/operation/MovieShotControl.kt [new file with mode: 0644]
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/operation/SingleShotControl.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/base/IPixproMessages.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/base/PixproCommandReceiveOnly.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproChangeMode.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproChangeVideoMode.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproExecuteVideo.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/status/PixproStatusChecker.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/status/PixproStatusConvert.kt

index 06f56e0..8bcae66 100644 (file)
@@ -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 (file)
index 0000000..c48a785
--- /dev/null
@@ -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
+    }
+}
index 21bb4a0..46970d6 100644 (file)
@@ -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
         {
index 1d048c3..01dca6b 100644 (file)
@@ -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
index ce4c368..8006cb3 100644 (file)
@@ -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)
     }
 }
index 131e495..f0b366b 100644 (file)
@@ -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(),
index 83aa2a4..153052c 100644 (file)
@@ -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()
         )
     }
index eb6d6f4..9a95a11 100644 (file)
@@ -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(),
 
index 22eb21c..c17aba5 100644 (file)
@@ -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)
index f75318f..a9de8dd 100644 (file)
@@ -18,8 +18,8 @@ class PixproStatusConvert(private val statusHolder: PixproStatusHolder)
 
     fun getAvailableTakeMode(): List<String?>
     {
-        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<String?>