OSDN Git Service

Panasonicカメラで、フィルターとフォトスタイル状態を表示・設定できるようにする。
authorMRSa <mrsa@myad.jp>
Sat, 7 Aug 2021 14:48:52 +0000 (23:48 +0900)
committerMRSa <mrsa@myad.jp>
Sat, 7 Aug 2021 14:48:52 +0000 (23:48 +0900)
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/panasonic/status/CameraEventObserver.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/panasonic/status/CameraStatusConvert.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/panasonic/status/CameraStatusHolder.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/panasonic/status/CameraStatusListHolder.kt [new file with mode: 0644]

index 7b4261d..29028c1 100644 (file)
@@ -14,7 +14,7 @@ import jp.osdn.gokigen.gokigenassets.utils.communication.SimpleHttpClient
 class CameraEventObserver(context: Context, private val remote: IPanasonicCamera, cardSlotSelector: ICardSlotSelector, private val sleepMs : Long = 500) : ICameraStatusWatcher
 {
     private val statusHolder = CameraStatusHolder(context, remote, cardSlotSelector)
-    private val statusConvert = CameraStatusConvert(statusHolder)
+    private val statusConvert = CameraStatusConvert(statusHolder, remote)
     private var isEventMonitoring = false
     private var isActive = false
 
index bdf8178..0cb33b3 100644 (file)
@@ -3,12 +3,15 @@ package jp.osdn.gokigen.gokigenassets.camera.panasonic.status
 import android.graphics.Color
 import android.util.Log
 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraStatus
+import jp.osdn.gokigen.gokigenassets.camera.panasonic.IPanasonicCamera
+import jp.osdn.gokigen.gokigenassets.utils.communication.SimpleLogDumper
 import java.util.ArrayList
 import kotlin.math.pow
 
-class CameraStatusConvert(private val statusHolder: CameraStatusHolder) : ICameraStatus, ICameraEventObserver
+class CameraStatusConvert(private val statusHolder: CameraStatusHolder, remote: IPanasonicCamera) : ICameraStatus, ICameraEventObserver
 {
     //  現物合わせのクラス...
+    private val statusListHolder = CameraStatusListHolder(remote)
     private var eventData: ByteArray? = null
     private var currentBattery : Int = 0
 
@@ -16,8 +19,7 @@ class CameraStatusConvert(private val statusHolder: CameraStatusHolder) : ICamer
     {
         try
         {
-            val listKey = key + "List"
-            return statusHolder.getAvailableItemList(listKey)
+            return statusListHolder.getAvailableItemList(key)
         }
         catch (e: Exception)
         {
@@ -30,7 +32,7 @@ class CameraStatusConvert(private val statusHolder: CameraStatusHolder) : ICamer
     {
         try
         {
-            Log.v(TAG, " setStatus(key:$key, value:$value)")
+            statusListHolder.setStatus(key, value)
         }
         catch (e : Exception)
         {
@@ -330,8 +332,7 @@ class CameraStatusConvert(private val statusHolder: CameraStatusHolder) : ICamer
     {
         try
         {
-            val value3 = if (value2 < 0) { value2 * (-1) } else { value2 }
-
+            // val value3 = if (value2 < 0) { value2 * (-1) } else { value2 }
         }
         catch (e : Exception)
         {
@@ -371,7 +372,35 @@ class CameraStatusConvert(private val statusHolder: CameraStatusHolder) : ICamer
 
     private fun getCaptureMode() : String
     {
-        return ("")
+        // フォトスタイル設定
+        var photoStyle = ""
+        try
+        {
+            val index = 16 * 7 - 1
+            if ((eventData != null)&&((eventData?.size ?: 0) > (index)))
+            {
+                val value = (eventData?.get(index) ?: 0).toInt()
+                if (value != 0)
+                {
+                    photoStyle = when (value) {
+                        1 -> "STANDARD"
+                        2 -> "VIVID"
+                        3 -> "NATURAL"
+                        4 -> "MONO"
+                        5 -> "SCENERY"
+                        6 -> "PORTRAIT"
+                        7 -> "CUSTOM"
+                        12 -> "L.MONO"
+                        else -> "($value)"
+                    }
+                }
+            }
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+        return (photoStyle)
     }
 
     private fun getIsoSensitivity() : String
@@ -470,7 +499,49 @@ class CameraStatusConvert(private val statusHolder: CameraStatusHolder) : ICamer
 
     private fun getPictureEffect() : String
     {
-        return ("")
+        // フィルター設定
+        var pictureEffect = ""
+        try
+        {
+            val index = 16 * 10 + 10
+            if ((eventData != null)&&((eventData?.size ?: 0) > (index)))
+            {
+                val value = (eventData?.get(index) ?: 0).toInt()
+                if (value != 0)
+                {
+                    pictureEffect = when (value) {
+                        1 -> "POP"
+                        2 -> "RETR"
+                        15 -> "OLD"
+                        3 -> "HKEY"
+                        4 -> "LKEY"
+                        5 -> "SEPI"
+                        22 -> "MONO"
+                        10 -> "D.MONO"
+                        21 -> "R.MONO"
+                        20 -> "S.MONO"
+                        11 -> "IART"
+                        6 -> "HDYN"
+                        12 -> "XPRO"
+                        8 -> "TOY"
+                        18 -> "TOYP"
+                        17 -> "BLEA"
+                        7 -> "DIOR"
+                        9 -> "SOFT"
+                        19 -> "FAN"
+                        14 -> "STAR"
+                        13 -> "1CLR"
+                        16 -> "SUN"
+                        else -> "($value)"
+                    }
+                }
+            }
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+        return (pictureEffect)
     }
 
     private fun getTorchMode() : String
@@ -518,9 +589,12 @@ class CameraStatusConvert(private val statusHolder: CameraStatusHolder) : ICamer
         try
         {
             this.eventData = eventData
-            //val size = this.eventData?.size ?: 0
-            //Log.v(TAG, "  ----- RECEIVED STATUS $size bytes. ----- ")
-            //SimpleLogDumper.dumpBytes("LV DATA [$size]", this.eventData?.copyOfRange(0, size))
+            if (isDumpData)
+            {
+                val size = this.eventData?.size ?: 0
+                Log.v(TAG, "  ----- RECEIVED STATUS $size bytes. ----- ")
+                SimpleLogDumper.dumpBytes("LV DATA [$size]", this.eventData?.copyOfRange(0, size))
+            }
         }
         catch (e: Exception)
         {
@@ -531,5 +605,6 @@ class CameraStatusConvert(private val statusHolder: CameraStatusHolder) : ICamer
     companion object
     {
         private val TAG = CameraStatusConvert::class.java.simpleName
+        private const val isDumpData = false
     }
 }
index dbdadf9..ad40961 100644 (file)
@@ -8,7 +8,6 @@ import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICardSlotSelector
 import jp.osdn.gokigen.gokigenassets.camera.panasonic.ICameraChangeListener
 import jp.osdn.gokigen.gokigenassets.camera.panasonic.IPanasonicCamera
 import jp.osdn.gokigen.gokigenassets.utils.communication.SimpleHttpClient
-import java.util.ArrayList
 
 class CameraStatusHolder(private val context: Context, private val remote: IPanasonicCamera, private val cardSlotSelector: ICardSlotSelector) : ICardSlotSelectionReceiver, ICameraStatusHolder
 {
@@ -85,11 +84,13 @@ class CameraStatusHolder(private val context: Context, private val remote: IPana
         listener = null
     }
 
-    override fun getCameraStatus(): String? {
+    override fun getCameraStatus(): String?
+    {
         return null
     }
 
-    override fun getLiveviewStatus(): Boolean {
+    override fun getLiveviewStatus(): Boolean
+    {
         return false
     }
 
@@ -98,15 +99,18 @@ class CameraStatusHolder(private val context: Context, private val remote: IPana
         return null
     }
 
-    override fun getAvailableShootModes(): List<String?>? {
+    override fun getAvailableShootModes(): List<String?>?
+    {
         return null
     }
 
-    override fun getZoomPosition(): Int {
+    override fun getZoomPosition(): Int
+    {
         return 0
     }
 
-    override fun getStorageId(): String {
+    override fun getStorageId(): String
+    {
         return currentSd
     }
 
@@ -119,48 +123,6 @@ class CameraStatusHolder(private val context: Context, private val remote: IPana
             requestToChangeSlot(slotId)
         }
     }
-    /**
-     *
-     *
-     */
-    fun getAvailableItemList(key: String): List<String>
-    {
-        val itemList: MutableList<String> = ArrayList()
-        try
-        {
-/*
-            val array = latestResultObject!!.getJSONArray(key) ?: return itemList
-            val nofItems = array.length()
-            for (index in 0 until nofItems) {
-                try {
-                    itemList.add(array.getString(index))
-                } catch (e: Exception) {
-                    e.printStackTrace()
-                }
-            }
-*/
-        }
-        catch (e: Exception)
-        {
-            e.printStackTrace()
-        }
-        return itemList
-    }
-
-    fun getItemStatus(key: String): String
-    {
-/*
-        try
-        {
-            return latestResultObject!!.getString(key)
-        }
-        catch (e: Exception)
-        {
-            e.printStackTrace()
-        }
-*/
-        return ""
-    }
 
     private fun requestToChangeSlot(slotId: String)
     {
@@ -236,7 +198,8 @@ class CameraStatusHolder(private val context: Context, private val remote: IPana
 
     fun getCurrentStatus(key: String) : String
     {
-        return (when (key) {
+        return (when (key)
+        {
             ICameraStatus.BATTERY -> "$remainBattery"
             else -> ""
         })
diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/panasonic/status/CameraStatusListHolder.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/panasonic/status/CameraStatusListHolder.kt
new file mode 100644 (file)
index 0000000..e9418e7
--- /dev/null
@@ -0,0 +1,325 @@
+package jp.osdn.gokigen.gokigenassets.camera.panasonic.status
+
+import android.util.Log
+import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraStatus
+import jp.osdn.gokigen.gokigenassets.camera.panasonic.IPanasonicCamera
+import jp.osdn.gokigen.gokigenassets.utils.communication.SimpleHttpClient
+import java.util.ArrayList
+
+class CameraStatusListHolder(private val remote: IPanasonicCamera)
+{
+    val http = SimpleHttpClient()
+    companion object
+    {
+        private val TAG = CameraStatusListHolder::class.java.simpleName
+        private const val TIMEOUT_MS = 3000
+        private const val MAX_RETRY_COUNT = 2
+    }
+
+    /**
+     *
+     *
+     */
+    fun getAvailableItemList(key: String): List<String>
+    {
+        try
+        {
+            return (when (key) {
+                ICameraStatus.TAKE_MODE -> getAvailableTakeMode()
+                ICameraStatus.SHUTTER_SPEED -> getAvailableShutterSpeed()
+                ICameraStatus.APERTURE -> getAvailableAperture()
+                ICameraStatus.EXPREV -> getAvailableExpRev()
+                ICameraStatus.CAPTURE_MODE -> getAvailableCaptureMode()
+                ICameraStatus.ISO_SENSITIVITY -> getAvailableIsoSensitivity()
+                ICameraStatus.WHITE_BALANCE -> getAvailableWhiteBalance()
+                ICameraStatus.AE -> getAvailableMeteringMode()
+                ICameraStatus.EFFECT -> getAvailablePictureEffect()
+                ICameraStatus.TORCH_MODE -> getAvailableTorchMode()
+                //ICameraStatus.BATTERY -> getAvailableRemainBattery()
+                else -> ArrayList()
+            })
+            //Log.v(TAG, " ----- getAvailableItemList($key) ")
+            //sendCamGetSettingCmd("colormode")
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+        return (ArrayList())
+    }
+
+    private fun getAvailableTakeMode() : List<String>
+    {
+        return (ArrayList())
+    }
+
+    private fun getAvailableTorchMode() : List<String>
+    {
+        return (ArrayList())
+    }
+
+    private fun getAvailableShutterSpeed() : List<String>
+    {
+        return (ArrayList())
+    }
+
+    private fun getAvailableAperture() : List<String>
+    {
+        return (ArrayList())
+    }
+
+    private fun getAvailableExpRev() : List<String>
+    {
+        return (ArrayList())
+    }
+
+    private fun getAvailablePictureEffect() : List<String>
+    {
+        return (listOf("OFF",
+            "POP",
+            "RETR",
+            "OLD",
+            "HKEY",
+            "LKEY",
+            "SEPI",
+            "MONO",
+            "D.MONO",
+            "R.MONO",
+            "S.MONO",
+            "IART",
+            "HDYN",
+            "XPRO",
+            "TOY",
+            "TOYP",
+            "BLEA",
+            "DIOR",
+            "SOFT",
+            "FAN",
+            "STAR",
+            "1CLR",
+            "SUN"))
+    }
+
+    private fun getAvailableIsoSensitivity() : List<String>
+    {
+        return (ArrayList())
+    }
+
+    private fun getAvailableWhiteBalance() : List<String>
+    {
+        return (ArrayList())
+    }
+
+    private fun getAvailableMeteringMode() : List<String>
+    {
+        return (ArrayList())
+    }
+
+    private fun getAvailableCaptureMode() : List<String>
+    {
+        return (listOf("STD", "VIVID", "NATURAL", "MONO", "L.MONO", "SCENERY", "PORTRAIT", "CUSTOM"))
+    }
+
+    fun setStatus(key: String, value: String)
+    {
+        Log.v(TAG, " setStatus(key:$key, value:$value)")
+        try
+        {
+            when (key) {
+                ICameraStatus.TAKE_MODE -> setTakeMode(value)
+                ICameraStatus.SHUTTER_SPEED -> setShutterSpeed(value)
+                ICameraStatus.APERTURE -> setAperture(value)
+                ICameraStatus.EXPREV -> setExpRev(value)
+                ICameraStatus.CAPTURE_MODE -> setCaptureMode(value)
+                ICameraStatus.ISO_SENSITIVITY -> setIsoSensitivity(value)
+                ICameraStatus.WHITE_BALANCE -> setWhiteBalance(value)
+                ICameraStatus.AE -> setMeteringMode(value)
+                ICameraStatus.EFFECT -> setPictureEffect(value)
+                ICameraStatus.TORCH_MODE -> setTorchMode(value)
+                //ICameraStatus.BATTERY -> setRemainBattery(value)
+                else -> return
+            }
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    private fun setTakeMode(value: String)
+    {
+
+    }
+
+    private fun setTorchMode(value: String)
+    {
+
+    }
+
+    private fun setShutterSpeed(value: String)
+    {
+
+    }
+
+    private fun setAperture(value: String)
+    {
+
+    }
+
+    private fun setExpRev(value: String)
+    {
+
+    }
+
+    private fun setCaptureMode(value: String)
+    {
+        //Log.v(TAG, " ===== setCaptureMode($value) =====")
+        val setValue = when (value) {
+            "STD" -> "standard"
+            "VIVID" -> "vivid"
+            "NATURAL" -> "natural"
+            "MONO" -> "bw"
+            "L.MONO" -> "l_bw"
+            "SCENERY" -> "scenery"
+            "PORTRAIT" -> "portrait"
+            "CUSTOM" -> "custom"
+            else -> return
+        }
+        sendCamSetSettingCmd("colormode", setValue, null)
+    }
+
+    private fun setIsoSensitivity(value: String)
+    {
+
+    }
+
+    private fun setWhiteBalance(value: String)
+    {
+
+    }
+
+    private fun setMeteringMode(value: String)
+    {
+
+    }
+
+    private fun setPictureEffect(value: String)
+    {
+        val setValue = when (value) {
+            "POP" -> "pop"
+            "RETR" -> "retro"
+            "OLD" -> "old_days"
+            "HKEY" -> "high_key"
+            "LKEY" -> "low_key"
+            "SEPI" -> "sepia"
+            "MONO" -> "monochro"
+            "D.MONO" -> "dynamic_monochro"
+            "R.MONO" -> "rough_monochro"
+            "S.MONO" -> "silky_monochro"
+            "IART" -> "impressive_art"
+            "HDYN" -> "high_dynamic"
+            "XPRO" -> "cross_proc"
+            "TOY" -> "toy_photo"
+            "TOYP" -> "toy_pop"
+            "BLEA" -> "bleach_bypass"
+            "DIOR" -> "diorama"
+            "SOFT" -> "soft_focus"
+            "FAN" -> "fantasy"
+            "STAR" -> "cross_filter"
+            "1CLR" -> "one_point_color"
+            "SUN" -> "sunshine"
+            else -> "noeffect"
+        }
+        sendCamSetSettingCmd("filter_setting", setValue, null)
+    }
+
+    private fun sendCamGetSettingCmd(type: String)
+    {
+        try
+        {
+            val urlToSend = remote.getCmdUrl() + "cam.cgi?mode=getsetting&type=$type"
+            val thread = Thread {
+                try
+                {
+                    var retryCount = 0
+                    var loop = true
+                    while (loop)
+                    {
+                        val reply: String = http.httpGet(urlToSend, TIMEOUT_MS)
+                        if (reply.indexOf("<result>ok</result>") > 0)
+                        {
+                            loop = false
+                            Log.v(TAG, " ===== $urlToSend (OK) : $reply")
+                        }
+                        else
+                        {
+                            // エラー発生時は何回か(MAX_RETRY_COUNT分)再送する
+                            Log.v(TAG, " $urlToSend (NG) : $reply ")
+                            Thread.sleep(1000) // 1秒待つ
+                            retryCount++
+                            if(retryCount >= MAX_RETRY_COUNT)
+                            {
+                                loop = false
+                            }
+                        }
+                    }
+                }
+                catch (e: Exception)
+                {
+                    e.printStackTrace()
+                }
+            }
+            thread.start()
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    private fun sendCamSetSettingCmd(msgType: String, msgValue: String, value2: String?)
+    {
+        try
+        {
+            //Log.v(TAG, "  ------- sendCamSetSettingCmd($msgType, $msgValue, $value2)")
+            val sendMessage = if (value2 != null) { "cam.cgi?mode=setsetting&type=$msgType&value=$msgValue&value2=$value2" } else { "cam.cgi?mode=setsetting&type=$msgType&value=$msgValue" }
+            val thread = Thread {
+                try
+                {
+                    var retryCount = 0
+                    var loop = true
+                    while (loop)
+                    {
+                        val urlToSend = remote.getCmdUrl() + sendMessage
+                        val reply: String = http.httpGet(urlToSend, TIMEOUT_MS)
+                        if (reply.indexOf("<result>ok</result>") > 0)
+                        {
+                            loop = false
+                            // Log.v(TAG, " --- SET SETTING ($msgType,$msgValue): $reply")
+                        }
+                        else
+                        {
+                            // エラー発生時は何回か(MAX_RETRY_COUNT分)再送する
+                            Log.v(TAG, " $urlToSend (NG) : $reply ")
+                            Thread.sleep(1000) // 1秒待つ
+                            retryCount++
+                            if(retryCount >= MAX_RETRY_COUNT)
+                            {
+                                loop = false
+                            }
+                        }
+                    }
+                }
+                catch (e: Exception)
+                {
+                    e.printStackTrace()
+                }
+            }
+            thread.start()
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+}
\ No newline at end of file