OSDN Git Service

SSDP部分のデバッグ中...
authorMRSa <mrsa@myad.jp>
Sun, 27 Jun 2021 13:11:35 +0000 (22:11 +0900)
committerMRSa <mrsa@myad.jp>
Sun, 27 Jun 2021 13:11:35 +0000 (22:11 +0900)
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/panasonic/connection/PanasonicSsdpClient.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/panasonic/liveview/PanasonicLiveViewControl.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/panasonic/status/CameraEventObserver.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/panasonic/status/CameraStatusHolder.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/panasonic/wrapper/PanasonicCameraControl.kt [new file with mode: 0644]
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/panasonic/wrapper/PanasonicCameraWrapper.kt [deleted file]
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/panasonic/wrapper/PanasonicCardSlotSelector.kt [new file with mode: 0644]
app/src/main/java/jp/osdn/gokigen/gokigenassets/constants/ICameraConnectionMethods.kt
app/src/main/java/jp/osdn/gokigen/mangle/scene/CameraProvider.kt
app/src/main/res/values-ja/strings.xml
app/src/main/res/values/arrays.xml

index 5d3f1b3..828dee0 100644 (file)
@@ -27,9 +27,9 @@ class PanasonicSsdpClient(private val context: Context, private val callback: IS
     {
         private val TAG = PanasonicSsdpClient::class.java.simpleName
         private const val SEND_TIMES_DEFAULT = 3
-        private const val SEND_WAIT_DURATION_MS = 100
+        private const val SEND_WAIT_DURATION_MS = 300
         private const val SSDP_RECEIVE_TIMEOUT = 4 * 1000 // msec
-        private const val PACKET_BUFFER_SIZE = 2048
+        private const val PACKET_BUFFER_SIZE = 4096
         private const val SSDP_PORT = 1900
         private const val SSDP_MX = 2
         private const val SSDP_ADDR = "239.255.255.250"
@@ -39,7 +39,7 @@ class PanasonicSsdpClient(private val context: Context, private val callback: IS
 
     init
     {
-        this.sendRepeatCount = if (sendRepeatCount >= 0) sendRepeatCount else SEND_TIMES_DEFAULT
+        this.sendRepeatCount = if (sendRepeatCount > 0) sendRepeatCount else SEND_TIMES_DEFAULT
         ssdpRequest = """
              M-SEARCH * HTTP/1.1
              ${java.lang.String.format(Locale.US, "HOST: %s:%d\r\n", SSDP_ADDR, SSDP_PORT)}MAN: "ssdp:discover"
@@ -70,6 +70,7 @@ class PanasonicSsdpClient(private val context: Context, private val callback: IS
                 socket.send(packet)
                 Thread.sleep(SEND_WAIT_DURATION_MS.toLong())
             }
+            Log.v(TAG, " SSDP : SEND")
         }
         catch (e: Exception)
         {
@@ -89,7 +90,7 @@ class PanasonicSsdpClient(private val context: Context, private val callback: IS
         var currentTime = System.currentTimeMillis()
         val foundDevices: MutableList<String?> = ArrayList()
         val array = ByteArray(PACKET_BUFFER_SIZE)
-        val http = SimpleHttpClient()
+
         try
         {
             cameraStatusReceiver.onStatusNotify(context.getString(ID_STRING_CONNECT_WAIT_REPLY_CAMERA))
@@ -112,6 +113,7 @@ class PanasonicSsdpClient(private val context: Context, private val callback: IS
                         //// Fetch Device Description XML and parse it.
                         if (ddLocation != null)
                         {
+                            val http = SimpleHttpClient()
                             cameraStatusReceiver.onStatusNotify("LOCATION : $ddLocation")
                             val device: IPanasonicCamera? = searchPanasonicCameraDevice(ddLocation)
                             if (device != null)
index cdf6acc..78d42c2 100644 (file)
@@ -1,7 +1,6 @@
 package jp.osdn.gokigen.gokigenassets.camera.panasonic.liveview
 
 import android.util.Log
-import androidx.appcompat.app.AppCompatActivity
 import jp.osdn.gokigen.gokigenassets.camera.panasonic.IPanasonicCamera
 import jp.osdn.gokigen.gokigenassets.liveview.image.CameraLiveViewListenerImpl
 import jp.osdn.gokigen.gokigenassets.utils.communication.SimpleHttpClient
@@ -10,9 +9,8 @@ import java.net.DatagramSocket
 import java.util.*
 
 
-class PanasonicLiveViewControl(private val activity : AppCompatActivity, private val camera: IPanasonicCamera)
+class PanasonicLiveViewControl(private val liveViewListener : CameraLiveViewListenerImpl, private val camera: IPanasonicCamera)
 {
-    private val liveViewListener = CameraLiveViewListenerImpl(activity)
     private var receiverSocket: DatagramSocket? = null
     private var whileStreamReceive = false
     private var errorOccur = 0
@@ -198,7 +196,7 @@ class PanasonicLiveViewControl(private val activity : AppCompatActivity, private
             }
         }
         val offset = startPosition - startmarker.size
-        liveViewListener.onUpdateLiveView(Arrays.copyOfRange(receivedData, offset, dataLength), null)
+        liveViewListener.onUpdateLiveView(receivedData.copyOfRange(offset, dataLength), null)
     }
 
     private fun receiverThread()
@@ -251,13 +249,6 @@ class PanasonicLiveViewControl(private val activity : AppCompatActivity, private
         System.gc()
     }
 
-/*
-    fun getLiveViewListener(): ILiveViewListener
-    {
-        return liveViewListener
-    }
-*/
-
     private fun closeReceiveSocket()
     {
         Log.v(TAG, "closeReceiveSocket()")
index 29fc75b..1e231dd 100644 (file)
@@ -2,31 +2,65 @@ package jp.osdn.gokigen.gokigenassets.camera.panasonic.status
 
 import android.content.Context
 import android.util.Log
+import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraStatus
+import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraStatusUpdateNotify
+import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraStatusWatcher
 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.liveview.message.IMessageDrawer
 import jp.osdn.gokigen.gokigenassets.utils.communication.SimpleHttpClient
+import java.util.ArrayList
 
-
-class CameraEventObserver(context: Context, private val remote: IPanasonicCamera, cardSlotSelector: ICardSlotSelector): ICameraEventObserver
+class CameraEventObserver(context: Context, private val remote: IPanasonicCamera, cardSlotSelector: ICardSlotSelector) : ICameraStatusWatcher, ICameraStatus
 {
     private val statusHolder = CameraStatusHolder(context, remote, cardSlotSelector)
     private var isEventMonitoring = false
     private var isActive = false
 
-    override fun start(): Boolean
+
+    override fun startStatusWatch(indicator : IMessageDrawer?, notifier: ICameraStatusUpdateNotify?)
+    {
+        try
+        {
+            isActive = true
+            start()
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    override fun stopStatusWatch()
+    {
+        try
+        {
+            isEventMonitoring = false
+            isActive = false
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+
+    private fun start(): Boolean
     {
         if (!isActive)
         {
             Log.w(TAG, "start() observer is not active.")
             return false
         }
-        if (isEventMonitoring) {
+        if (isEventMonitoring)
+        {
             Log.w(TAG, "start() already starting.")
             return false
         }
         isEventMonitoring = true
-        try {
+        try
+        {
             val http = SimpleHttpClient()
             val thread: Thread = object : Thread() {
                 override fun run() {
@@ -59,16 +93,7 @@ class CameraEventObserver(context: Context, private val remote: IPanasonicCamera
         return true
     }
 
-    override fun stop() {
-        isEventMonitoring = false
-    }
-
-    override fun release() {
-        isEventMonitoring = false
-        isActive = false
-    }
-
-    override fun setEventListener(listener: ICameraChangeListener)
+    fun setEventListener(listener: ICameraChangeListener)
     {
         try
         {
@@ -80,27 +105,70 @@ class CameraEventObserver(context: Context, private val remote: IPanasonicCamera
         }
     }
 
-    override fun clearEventListener() {
-        try {
+    private fun clearEventListener()
+    {
+        try
+        {
             statusHolder.clearEventChangeListener()
-        } catch (e: Exception) {
+        }
+        catch (e: Exception)
+        {
             e.printStackTrace()
         }
     }
 
-    override fun getCameraStatusHolder(): ICameraStatusHolder {
+    private fun getCameraStatusHolder(): ICameraStatusHolder
+    {
         return statusHolder
     }
 
-    override fun activate()
+    private fun activate()
     {
         isActive = true
     }
 
+    override fun getStatusList(key: String): List<String>
+    {
+        try
+        {
+            val listKey = key + "List"
+            return statusHolder.getAvailableItemList(listKey)
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+        return ArrayList()
+    }
+
+    override fun getStatus(key: String): String
+    {
+        try
+        {
+            return statusHolder.getItemStatus(key)
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+        return ""
+    }
+
+    override fun setStatus(key: String, value: String)
+    {
+        try
+        {
+            Log.v(TAG, " setStatus(key:$key, value:$value)")
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
     companion object
     {
         private val TAG = CameraEventObserver::class.java.simpleName
         private const val TIMEOUT_MS = 3000
     }
-
-}
\ No newline at end of file
+}
index eb584f5..7a4abe0 100644 (file)
@@ -7,6 +7,7 @@ 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
@@ -16,8 +17,10 @@ class CameraStatusHolder(private val context: Context, private val remote: IPana
     private var isInitialized = false
     private var isDualSlot = false
 
-    fun parse(reply: String) {
-        try {
+    fun parse(reply: String)
+    {
+        try
+        {
             // Log.v(TAG, " getState : " + reply);
             var isEnableDualSlot = false
             if (reply.contains("<sd_memory>set</sd_memory>") && reply.contains("<sd2_memory>set</sd2_memory>")) {
@@ -37,33 +40,43 @@ class CameraStatusHolder(private val context: Context, private val remote: IPana
                 isDualSlot = isEnableDualSlot
             }
             checkCurrentSlot(reply)
-        } catch (e: Exception) {
+        }
+        catch (e: Exception)
+        {
             e.printStackTrace()
         }
     }
 
-    private fun checkCurrentSlot(reply: String) {
-        try {
+    private fun checkCurrentSlot(reply: String)
+    {
+        try
+        {
             val header = "<current_sd>"
             val indexStart = reply.indexOf(header)
             val indexEnd = reply.indexOf("</current_sd>")
-            if (indexStart > 0 && indexEnd > 0 && indexStart < indexEnd) {
+            if (indexStart > 0 && indexEnd > 0 && indexStart < indexEnd)
+            {
                 val currentSlot = reply.substring(indexStart + header.length, indexEnd)
-                if (current_sd != currentSlot) {
+                if (current_sd != currentSlot)
+                {
                     current_sd = currentSlot
                     cardSlotSelector.changedCardSlot(current_sd)
                 }
             }
-        } catch (e: Exception) {
+        }
+        catch (e: Exception)
+        {
             e.printStackTrace()
         }
     }
 
-    fun setEventChangeListener(listener: ICameraChangeListener) {
+    fun setEventChangeListener(listener: ICameraChangeListener)
+    {
         this.listener = listener
     }
 
-    fun clearEventChangeListener() {
+    fun clearEventChangeListener()
+    {
         listener = null
     }
 
@@ -75,7 +88,8 @@ class CameraStatusHolder(private val context: Context, private val remote: IPana
         return false
     }
 
-    override fun getShootMode(): String? {
+    override fun getShootMode(): String?
+    {
         return null
     }
 
@@ -91,38 +105,90 @@ class CameraStatusHolder(private val context: Context, private val remote: IPana
         return current_sd
     }
 
-    override fun slotSelected(slotId: String) {
+    override fun slotSelected(slotId: String)
+    {
         Log.v(TAG, " slotSelected : $slotId")
-        if (current_sd != slotId) {
+        if (current_sd != slotId)
+        {
             // スロットを変更したい!
             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
+    }
 
-    private fun requestToChangeSlot(slotId: String) {
-        try {
+    fun getItemStatus(key: String): String
+    {
+/*
+        try
+        {
+            return latestResultObject!!.getString(key)
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+*/
+        return ""
+    }
+
+    private fun requestToChangeSlot(slotId: String)
+    {
+        try
+        {
             val thread = Thread {
-                try {
+                try
+                {
                     var loop = true
                     val http = SimpleHttpClient()
-                    while (loop) {
-                        val reply: String = http.httpGet(
-                            remote.getCmdUrl() + "cam.cgi?mode=setsetting&type=current_sd&value=" + slotId,
-                            TIMEOUT_MS
-                        )
-                        if (reply.indexOf("<result>ok</result>") > 0) {
+                    while (loop)
+                    {
+                        val reply: String = http.httpGet(remote.getCmdUrl() + "cam.cgi?mode=setsetting&type=current_sd&value=" + slotId, TIMEOUT_MS)
+                        if (reply.indexOf("<result>ok</result>") > 0)
+                        {
                             loop = false
                             cardSlotSelector.selectSlot(slotId)
-                        } else {
+                        }
+                        else
+                        {
                             Thread.sleep(1000) // 1秒待つ
                         }
                     }
-                } catch (e: Exception) {
+                }
+                catch (e: Exception)
+                {
                     e.printStackTrace()
                 }
             }
             thread.start()
-        } catch (e: Exception) {
+        }
+        catch (e: Exception)
+        {
             e.printStackTrace()
         }
     }
diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/panasonic/wrapper/PanasonicCameraControl.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/panasonic/wrapper/PanasonicCameraControl.kt
new file mode 100644 (file)
index 0000000..e75390d
--- /dev/null
@@ -0,0 +1,403 @@
+package jp.osdn.gokigen.gokigenassets.camera.panasonic.wrapper
+
+import android.util.Log
+import android.view.KeyEvent
+import android.view.View
+import androidx.appcompat.app.AppCompatActivity
+import jp.osdn.gokigen.gokigenassets.camera.ICameraPreferenceProvider
+import jp.osdn.gokigen.gokigenassets.camera.interfaces.*
+import jp.osdn.gokigen.gokigenassets.camera.panasonic.ICameraChangeListener
+import jp.osdn.gokigen.gokigenassets.camera.panasonic.IPanasonicCamera
+import jp.osdn.gokigen.gokigenassets.camera.panasonic.IPanasonicCameraHolder
+import jp.osdn.gokigen.gokigenassets.camera.panasonic.connection.PanasonicCameraConnection
+import jp.osdn.gokigen.gokigenassets.camera.panasonic.liveview.PanasonicLiveViewControl
+import jp.osdn.gokigen.gokigenassets.camera.panasonic.operation.PanasonicCameraCaptureControl
+import jp.osdn.gokigen.gokigenassets.camera.panasonic.operation.PanasonicCameraFocusControl
+import jp.osdn.gokigen.gokigenassets.camera.panasonic.operation.PanasonicCameraZoomLensControl
+import jp.osdn.gokigen.gokigenassets.camera.panasonic.status.CameraEventObserver
+import jp.osdn.gokigen.gokigenassets.camera.theta.status.ICaptureModeReceiver
+import jp.osdn.gokigen.gokigenassets.constants.IApplicationConstantConvert
+import jp.osdn.gokigen.gokigenassets.liveview.IIndicatorControl
+import jp.osdn.gokigen.gokigenassets.liveview.ILiveView
+import jp.osdn.gokigen.gokigenassets.liveview.ILiveViewRefresher
+import jp.osdn.gokigen.gokigenassets.liveview.focusframe.IAutoFocusFrameDisplay
+import jp.osdn.gokigen.gokigenassets.liveview.image.CameraLiveViewListenerImpl
+import jp.osdn.gokigen.gokigenassets.liveview.storeimage.StoreImage
+import jp.osdn.gokigen.gokigenassets.preference.PreferenceAccessWrapper
+import jp.osdn.gokigen.gokigenassets.scene.IVibrator
+import jp.osdn.gokigen.gokigenassets.utils.communication.SimpleHttpClient
+
+class PanasonicCameraControl(private val context: AppCompatActivity, private val vibrator : IVibrator, private val preference: ICameraPreferenceProvider,  private val provider: ICameraStatusReceiver) : IPanasonicCameraHolder, IDisplayInjector,ILiveViewController, ICameraControl, View.OnClickListener, ICaptureModeReceiver, ICameraShutter, IKeyDown
+{
+    private val cardSlotSelector = PanasonicCardSlotSelector()
+    private val liveViewListener = CameraLiveViewListenerImpl(context)
+    private val cameraConnection: PanasonicCameraConnection = PanasonicCameraConnection(context, provider, this, this, cardSlotSelector)
+    private val storeImage = StoreImage(context, liveViewListener)
+
+    private lateinit var panasonicCamera: IPanasonicCamera
+    private var statusChecker: CameraEventObserver? = null
+    private var liveViewControl: PanasonicLiveViewControl? = null
+    private var focusControl: PanasonicCameraFocusControl? = null
+    private var captureControl: PanasonicCameraCaptureControl? = null
+    private val zoomControl = PanasonicCameraZoomLensControl()
+    private var isStatusWatch = false
+    private var cameraPositionId = 0
+
+    companion object
+    {
+        private val TAG = PanasonicCameraControl::class.java.simpleName
+        private const val TIMEOUT_MS = 3000
+    }
+
+    override fun prepare()
+    {
+        if (::panasonicCamera.isInitialized)
+        {
+            Log.v(TAG, " prepare : " + panasonicCamera.getFriendlyName() + " " + panasonicCamera.getModelName())
+            try
+            {
+                if (statusChecker == null)
+                {
+                    statusChecker = CameraEventObserver(context, panasonicCamera, cardSlotSelector)
+                }
+                if (liveViewControl == null)
+                {
+                    liveViewControl = PanasonicLiveViewControl(liveViewListener, panasonicCamera)
+                }
+                focusControl?.setCamera(panasonicCamera)
+                captureControl?.setCamera(panasonicCamera)
+                zoomControl.setCamera(panasonicCamera)
+            }
+            catch (e: Exception)
+            {
+                e.printStackTrace()
+            }
+        }
+        else
+        {
+            Log.v(TAG, " panasonicCamera is not initialized...")
+        }
+    }
+
+    override fun startRecMode()
+    {
+        try
+        {
+            val http = SimpleHttpClient()
+
+            // 撮影モード(RecMode)に切り替え
+            var reply: String = http.httpGet(panasonicCamera.getCmdUrl() + "cam.cgi?mode=camcmd&value=recmode", TIMEOUT_MS)
+            if (!reply.contains("ok"))
+            {
+                Log.v(TAG, "CAMERA REPLIED ERROR : CHANGE RECMODE.")
+            }
+
+            //  フォーカスに関しては、1点に切り替える(仮)
+            reply = http.httpGet(panasonicCamera.getCmdUrl() + "cam.cgi?mode=setsetting&type=afmode&value=1area", TIMEOUT_MS)
+            if (!reply.contains("ok"))
+            {
+                Log.v(TAG, "CAMERA REPLIED ERROR : CHANGE AF MODE 1area.")
+            }
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    override fun startEventWatch(listener: ICameraChangeListener?)
+    {
+        try
+        {
+            if (statusChecker != null)
+            {
+                if (listener != null)
+                {
+                    statusChecker?.setEventListener(listener)
+                }
+                statusChecker?.startStatusWatch(null, null)
+            }
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    override fun detectedCamera(camera: IPanasonicCamera)
+    {
+        Log.v(TAG, "detectedCamera()")
+        panasonicCamera = camera
+    }
+
+/*
+    fun getPanasonicCameraConnection(): ICameraConnection
+    {
+        return (cameraConnection)
+    }
+
+    fun getFocusingControl(): IFocusingControl?
+    {
+        return focusControl
+    }
+
+    fun getCameraInformation(): ICameraInformation?
+    {
+        return null
+    }
+
+    fun getZoomLensControl(): IZoomLensControl?
+    {
+        return zoomControl
+    }
+
+    fun getCaptureControl(): ICaptureControl?
+    {
+        return captureControl
+    }
+*/
+    override fun getConnectionMethod(): String
+    {
+        return ("PANASONIC")
+    }
+
+    override fun initialize()
+    {
+        // TODO("Not yet implemented")
+    }
+
+    override fun connectToCamera()
+    {
+        Log.v(TAG, " connectToCamera() : PANASONIC ")
+        try
+        {
+            cameraConnection.connect()
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    override fun startCamera(isPreviewView: Boolean, cameraSequence: Int)
+    {
+        try
+        {
+            if (cameraConnection.getConnectionStatus() != ICameraConnectionStatus.CameraConnectionStatus.CONNECTED)
+            {
+                cameraConnection.startWatchWifiStatus(context)
+            }
+            else
+            {
+                cameraConnection.connect()
+            }
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    override fun finishCamera()
+    {
+        try
+        {
+            if (isStatusWatch)
+            {
+                statusChecker?.stopStatusWatch()
+                isStatusWatch = false
+            }
+            cameraConnection.disconnect(false)
+            cameraConnection.stopWatchWifiStatus(context)
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    override fun changeCaptureMode(mode: String)
+    {
+        // TODO("Not yet implemented")
+    }
+
+    override fun changedCaptureMode(captureMode: String)
+    {
+        //TODO("Not yet implemented")
+    }
+
+    override fun needRotateImage(): Boolean
+    {
+        return (false)
+    }
+
+    override fun setRefresher(refresher: ILiveViewRefresher, imageView: ILiveView)
+    {
+        try
+        {
+            liveViewListener.setRefresher(refresher)
+            imageView.setImageProvider(liveViewListener)
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    override fun captureButtonReceiver(id: Int): View.OnClickListener
+    {
+        cameraPositionId = id
+        return (this)
+    }
+
+    override fun keyDownReceiver(id: Int): IKeyDown
+    {
+        cameraPositionId = id
+        return (this)
+    }
+
+    override fun getFocusingControl(id: Int): IFocusingControl?
+    {
+        cameraPositionId = id
+        return (focusControl)
+    }
+
+    override fun getDisplayInjector(): IDisplayInjector
+    {
+        return (this)
+    }
+
+    override fun injectDisplay(frameDisplayer: IAutoFocusFrameDisplay, indicator: IIndicatorControl, focusingModeNotify: IFocusingModeNotify)
+    {
+        Log.v(TAG, "injectDisplay()")
+        focusControl = PanasonicCameraFocusControl(frameDisplayer, indicator)
+        captureControl = PanasonicCameraCaptureControl(frameDisplayer, indicator)
+    }
+
+    override fun startLiveView()
+    {
+        Log.v(TAG, " startLiveView() ")
+        try
+        {
+            if (!isStatusWatch)
+            {
+                statusChecker?.startStatusWatch(null, null)
+                isStatusWatch = true
+            }
+            liveViewControl?.startLiveView()
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    override fun stopLiveView()
+    {
+        Log.v(TAG, " stopLiveView() ")
+        try
+        {
+            liveViewControl?.stopLiveView()
+            if (isStatusWatch)
+            {
+                statusChecker?.stopStatusWatch()
+                isStatusWatch = false
+            }
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    override fun onClick(v: View?)
+    {
+        if (v == null)
+        {
+            return
+        }
+        when (v.id)
+        {
+            IApplicationConstantConvert.ID_BUTTON_SHUTTER -> { doShutter() }
+            else -> { }
+        }
+    }
+
+
+    override fun doShutter()
+    {
+        try
+        {
+            Log.v(TAG, " doShutter()")
+            val isNotDriveShutter = captureImageLiveView()
+            if (isNotDriveShutter)
+            {
+                //  シャッターを駆動させない(けど、バイブレーションで通知する)
+                vibrator.vibrate(IVibrator.VibratePattern.SIMPLE_SHORT)
+                return
+            }
+            if (captureControl == null)
+            {
+                Log.v(TAG, " captureControl is NULL.")
+            }
+            captureControl?.doCapture(0)
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    override fun doShutterOff()
+    {
+        try
+        {
+            Log.v(TAG, " doShutterOff()")
+            captureControl?.doCapture(0)
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    override fun handleKeyDown(keyCode: Int, event: KeyEvent): Boolean
+    {
+        if ((event.action == KeyEvent.ACTION_DOWN)&&((keyCode == KeyEvent.KEYCODE_VOLUME_UP)||(keyCode == KeyEvent.KEYCODE_CAMERA)))
+        {
+            doShutter()
+            return (true)
+        }
+        return (false)
+    }
+
+    private fun captureImageLiveView() : Boolean
+    {
+        try
+        {
+            //  preferenceから設定を取得する
+            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)
+            val notUseShutter = PreferenceAccessWrapper(context).getBoolean(IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_ONLY_LIVEVIEW_IMAGE, IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_ONLY_LIVEVIEW_IMAGE_DEFAULT_VALUE)
+            if ((captureBothCamera)&&(liveViewListener.isImageReceived()))
+            {
+                // ライブビュー画像を保管する場合...
+                val thread = Thread { storeImage.doStore(cameraPositionId, false) }
+                try
+                {
+                    thread.start()
+                }
+                catch (e: Exception)
+                {
+                    e.printStackTrace()
+                }
+            }
+            return (notUseShutter)
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+        return (false)
+    }
+
+}
diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/panasonic/wrapper/PanasonicCameraWrapper.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/panasonic/wrapper/PanasonicCameraWrapper.kt
deleted file mode 100644 (file)
index 37a2075..0000000
+++ /dev/null
@@ -1,240 +0,0 @@
-package jp.osdn.gokigen.gokigenassets.camera.panasonic.wrapper
-
-import android.util.Log
-import android.view.KeyEvent
-import android.view.View
-import androidx.appcompat.app.AppCompatActivity
-import jp.osdn.gokigen.gokigenassets.camera.interfaces.*
-import jp.osdn.gokigen.gokigenassets.camera.panasonic.ICameraChangeListener
-import jp.osdn.gokigen.gokigenassets.camera.panasonic.IPanasonicCamera
-import jp.osdn.gokigen.gokigenassets.camera.panasonic.IPanasonicCameraHolder
-import jp.osdn.gokigen.gokigenassets.camera.panasonic.connection.PanasonicCameraConnection
-import jp.osdn.gokigen.gokigenassets.camera.panasonic.liveview.PanasonicLiveViewControl
-import jp.osdn.gokigen.gokigenassets.camera.panasonic.operation.PanasonicCameraCaptureControl
-import jp.osdn.gokigen.gokigenassets.camera.panasonic.operation.PanasonicCameraFocusControl
-import jp.osdn.gokigen.gokigenassets.camera.panasonic.operation.PanasonicCameraZoomLensControl
-import jp.osdn.gokigen.gokigenassets.camera.panasonic.status.CameraEventObserver
-import jp.osdn.gokigen.gokigenassets.camera.panasonic.status.ICameraEventObserver
-import jp.osdn.gokigen.gokigenassets.camera.theta.status.ICaptureModeReceiver
-import jp.osdn.gokigen.gokigenassets.liveview.IIndicatorControl
-import jp.osdn.gokigen.gokigenassets.liveview.ILiveView
-import jp.osdn.gokigen.gokigenassets.liveview.ILiveViewRefresher
-import jp.osdn.gokigen.gokigenassets.liveview.focusframe.IAutoFocusFrameDisplay
-import jp.osdn.gokigen.gokigenassets.utils.communication.SimpleHttpClient
-
-class PanasonicCameraWrapper(private val context: AppCompatActivity, private val provider: ICameraStatusReceiver, private val listener: ICameraChangeListener, private val cardSlotSelector: ICardSlotSelector) : IPanasonicCameraHolder, IDisplayInjector,ILiveViewController, ICameraControl, View.OnClickListener, ICaptureModeReceiver, ICameraShutter, IKeyDown
-{
-    private lateinit var panasonicCamera: IPanasonicCamera
-
-    private var eventObserver: ICameraEventObserver? = null
-    private var liveViewControl: PanasonicLiveViewControl? = null
-    private var focusControl: PanasonicCameraFocusControl? = null
-    private var captureControl: PanasonicCameraCaptureControl? = null
-    private var zoomControl: PanasonicCameraZoomLensControl? = null
-    private var cameraConnection: PanasonicCameraConnection? = null
-
-    companion object
-    {
-        private val TAG = PanasonicCameraWrapper::class.java.simpleName
-        private const val TIMEOUT_MS = 3000
-    }
-
-    override fun prepare()
-    {
-        Log.v(TAG, " prepare : " + panasonicCamera.getFriendlyName() + " " + panasonicCamera.getModelName())
-        try {
-            //this.panasonicCameraApi = PanasonicCameraApi.newInstance(panasonicCamera);
-            if (eventObserver == null)
-            {
-                eventObserver = CameraEventObserver(context, panasonicCamera, cardSlotSelector)
-            }
-            if (liveViewControl == null)
-            {
-                liveViewControl = PanasonicLiveViewControl(context, panasonicCamera)
-            }
-            focusControl?.setCamera(panasonicCamera)
-            captureControl?.setCamera(panasonicCamera)
-            zoomControl?.setCamera(panasonicCamera)
-        } catch (e: Exception) {
-            e.printStackTrace()
-        }
-    }
-
-    override fun startRecMode()
-    {
-        try
-        {
-            val http = SimpleHttpClient()
-
-            // 撮影モード(RecMode)に切り替え
-            var reply: String = http.httpGet(panasonicCamera.getCmdUrl() + "cam.cgi?mode=camcmd&value=recmode", TIMEOUT_MS)
-            if (!reply.contains("ok"))
-            {
-                Log.v(TAG, "CAMERA REPLIED ERROR : CHANGE RECMODE.")
-            }
-
-            //  フォーカスに関しては、1点に切り替える(仮)
-            reply = http.httpGet(panasonicCamera.getCmdUrl() + "cam.cgi?mode=setsetting&type=afmode&value=1area", TIMEOUT_MS)
-            if (!reply.contains("ok"))
-            {
-                Log.v(TAG, "CAMERA REPLIED ERROR : CHANGE AF MODE 1area.")
-            }
-        }
-        catch (e: Exception)
-        {
-            e.printStackTrace()
-        }
-    }
-
-    override fun startEventWatch(listener: ICameraChangeListener?)
-    {
-        try
-        {
-            if (eventObserver != null)
-            {
-                if (listener != null)
-                {
-                    eventObserver?.setEventListener(listener)
-                }
-                eventObserver?.activate()
-                eventObserver?.start()
-                val holder = eventObserver?.getCameraStatusHolder()
-                holder?.getLiveviewStatus()
-            }
-        }
-        catch (e: Exception)
-        {
-            e.printStackTrace()
-        }
-    }
-
-    override fun detectedCamera(camera: IPanasonicCamera)
-    {
-        Log.v(TAG, "detectedCamera()")
-        panasonicCamera = camera
-    }
-
-    fun getPanasonicCameraConnection(): ICameraConnection? {
-        // PanasonicCameraConnectionは複数生成しない。
-        if (cameraConnection == null) {
-            cameraConnection = PanasonicCameraConnection(context, provider, this, this, listener)
-        }
-        return cameraConnection
-    }
-/*
-    fun getPanasonicCamera(): IPanasonicCamera
-    {
-        return panasonicCamera
-    }
-
-    fun getPanasonicLiveViewControl(): ILiveViewControl? {
-        return liveViewControl
-    }
-
-
-    fun getLiveViewListener(): ILiveViewListener? {
-        return liveViewControl?.getLiveViewListener()
-    }
-*/
-
-    fun getFocusingControl(): IFocusingControl? {
-        return focusControl
-    }
-
-    fun getCameraInformation(): ICameraInformation? {
-        return null
-    }
-
-    fun getZoomLensControl(): IZoomLensControl? {
-        return zoomControl
-    }
-
-    fun getCaptureControl(): ICaptureControl? {
-        return captureControl
-    }
-
-    override fun getConnectionMethod(): String {
-        TODO("Not yet implemented")
-    }
-
-    override fun initialize() {
-        TODO("Not yet implemented")
-    }
-
-    override fun connectToCamera() {
-        TODO("Not yet implemented")
-    }
-
-    override fun startCamera(isPreviewView: Boolean, cameraSequence: Int) {
-        TODO("Not yet implemented")
-    }
-
-    override fun finishCamera() {
-        TODO("Not yet implemented")
-    }
-
-    override fun changeCaptureMode(mode: String) {
-        TODO("Not yet implemented")
-    }
-
-    override fun needRotateImage(): Boolean {
-        TODO("Not yet implemented")
-    }
-
-    override fun setRefresher(refresher: ILiveViewRefresher, imageView: ILiveView) {
-        TODO("Not yet implemented")
-    }
-
-    override fun captureButtonReceiver(id: Int): View.OnClickListener {
-        TODO("Not yet implemented")
-    }
-
-    override fun keyDownReceiver(id: Int): IKeyDown {
-        TODO("Not yet implemented")
-    }
-
-    override fun getFocusingControl(id: Int): IFocusingControl? {
-        TODO("Not yet implemented")
-    }
-
-    override fun getDisplayInjector(): IDisplayInjector
-    {
-        return this
-    }
-
-    override fun injectDisplay(frameDisplayer: IAutoFocusFrameDisplay, indicator: IIndicatorControl, focusingModeNotify: IFocusingModeNotify)
-    {
-        Log.v(TAG, "injectDisplay()")
-        focusControl = PanasonicCameraFocusControl(frameDisplayer, indicator)
-        captureControl = PanasonicCameraCaptureControl(frameDisplayer, indicator)
-        zoomControl = PanasonicCameraZoomLensControl()
-    }
-
-    override fun startLiveView() {
-        TODO("Not yet implemented")
-    }
-
-    override fun stopLiveView() {
-        TODO("Not yet implemented")
-    }
-
-    override fun onClick(v: View?) {
-        TODO("Not yet implemented")
-    }
-
-    override fun changedCaptureMode(captureMode: String) {
-        TODO("Not yet implemented")
-    }
-
-    override fun doShutter() {
-        TODO("Not yet implemented")
-    }
-
-    override fun doShutterOff() {
-        TODO("Not yet implemented")
-    }
-
-    override fun handleKeyDown(keyCode: Int, event: KeyEvent): Boolean {
-        TODO("Not yet implemented")
-    }
-}
diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/panasonic/wrapper/PanasonicCardSlotSelector.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/panasonic/wrapper/PanasonicCardSlotSelector.kt
new file mode 100644 (file)
index 0000000..1e0a1a5
--- /dev/null
@@ -0,0 +1,63 @@
+package jp.osdn.gokigen.gokigenassets.camera.panasonic.wrapper
+
+import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICardSlotSelectionReceiver
+import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICardSlotSelector
+import jp.osdn.gokigen.gokigenassets.camera.panasonic.ICameraChangeListener
+
+class PanasonicCardSlotSelector() : ICardSlotSelector, ICameraChangeListener
+{
+    override fun setupSlotSelector(isEnable: Boolean, slotSelectionReceiver: ICardSlotSelectionReceiver?)
+    {
+        // TODO("Not yet implemented")
+    }
+
+    override fun selectSlot(slotId: String)
+    {
+        // TODO("Not yet implemented")
+    }
+
+    override fun changedCardSlot(slotId: String)
+    {
+        // TODO("Not yet implemented")
+    }
+
+    override fun onApiListModified(apis: List<String?>?)
+    {
+        // TODO("Not yet implemented")
+    }
+
+    override fun onCameraStatusChanged(status: String?)
+    {
+        // TODO("Not yet implemented")
+    }
+
+    override fun onLiveviewStatusChanged(status: Boolean)
+    {
+        // TODO("Not yet implemented")
+    }
+
+    override fun onShootModeChanged(shootMode: String?)
+    {
+        // TODO("Not yet implemented")
+    }
+
+    override fun onZoomPositionChanged(zoomPosition: Int)
+    {
+        // TODO("Not yet implemented")
+    }
+
+    override fun onStorageIdChanged(storageId: String?)
+    {
+        // TODO("Not yet implemented")
+    }
+
+    override fun onFocusStatusChanged(focusStatus: String?)
+    {
+        // TODO("Not yet implemented")
+    }
+
+    override fun onResponseError()
+    {
+        // TODO("Not yet implemented")
+    }
+}
\ No newline at end of file
index 0bd96c4..9127264 100644 (file)
@@ -9,5 +9,6 @@ interface ICameraConnectionMethods
         const val PREFERENCE_CAMERA_METHOD_CAMERAX = "camerax"
         const val PREFERENCE_CAMERA_METHOD_THETA = "THETA"
         const val PREFERENCE_CAMERA_METHOD_PENTAX = "RICOH"
+        const val PREFERENCE_CAMERA_METHOD_PANASONIC = "PANASONIC"
     }
 }
index d5ca1d1..6bc0666 100644 (file)
@@ -5,12 +5,13 @@ import jp.osdn.gokigen.gokigenassets.camera.CameraPreference
 import jp.osdn.gokigen.gokigenassets.camera.DummyCameraControl
 import jp.osdn.gokigen.gokigenassets.camera.ICameraPreferenceProvider
 import jp.osdn.gokigen.gokigenassets.camera.camerax.operation.CameraControl
-import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraControl
-import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraStatusReceiver
+import jp.osdn.gokigen.gokigenassets.camera.interfaces.*
+import jp.osdn.gokigen.gokigenassets.camera.panasonic.wrapper.PanasonicCameraControl
 import jp.osdn.gokigen.gokigenassets.camera.ricohpentax.RicohPentaxCameraControl
 import jp.osdn.gokigen.gokigenassets.camera.theta.ThetaCameraControl
 import jp.osdn.gokigen.gokigenassets.constants.ICameraConnectionMethods.Companion.PREFERENCE_CAMERA_METHOD_CAMERAX
 import jp.osdn.gokigen.gokigenassets.constants.ICameraConnectionMethods.Companion.PREFERENCE_CAMERA_METHOD_NONE
+import jp.osdn.gokigen.gokigenassets.constants.ICameraConnectionMethods.Companion.PREFERENCE_CAMERA_METHOD_PANASONIC
 import jp.osdn.gokigen.gokigenassets.constants.ICameraConnectionMethods.Companion.PREFERENCE_CAMERA_METHOD_PENTAX
 import jp.osdn.gokigen.gokigenassets.constants.ICameraConnectionMethods.Companion.PREFERENCE_CAMERA_METHOD_THETA
 import jp.osdn.gokigen.gokigenassets.preference.PreferenceAccessWrapper
@@ -95,6 +96,7 @@ class CameraProvider(private val activity: AppCompatActivity, private val inform
                 PREFERENCE_CAMERA_METHOD_CAMERAX -> prepareCameraXControl(cameraPreference)
                 PREFERENCE_CAMERA_METHOD_THETA -> prepareThetaCameraControl(cameraPreference)
                 PREFERENCE_CAMERA_METHOD_PENTAX -> preparePentaxCameraControl(cameraPreference)
+                PREFERENCE_CAMERA_METHOD_PANASONIC -> preparePanasonicCameraControl(cameraPreference)
                 else -> DummyCameraControl()
             })
         }
@@ -200,6 +202,11 @@ class CameraProvider(private val activity: AppCompatActivity, private val inform
         return (RicohPentaxCameraControl(activity, vibrator, cameraPreference, statusReceiver))
     }
 
+    private fun preparePanasonicCameraControl(cameraPreference : ICameraPreferenceProvider) : ICameraControl
+    {
+        return (PanasonicCameraControl(activity, vibrator, cameraPreference, statusReceiver))
+    }
+
     private fun prepareCameraXControl(cameraPreference : ICameraPreferenceProvider): ICameraControl
     {
         if ((cameraXisCreated)&&(::cameraXControl.isInitialized))
index cff6e63..cf72603 100644 (file)
     <string name="connect_camera_received_reply">カメラ応答受信</string>
     <string name="connect_camera_rejected">カメラ接続拒否</string>
 
-    <string name="camera_not_found">Not Found&#8230;</string>
+    <string name="camera_not_found">カメラが見つかりませんでした&#8230;</string>
     <string name="camera_connect_response_ng">カメラに接続できませんでした。</string>
 
     <string name="dialog_title_connect_failed">接続失敗</string>
index 1d4e922..bfff4dd 100644 (file)
         <item>Internal Camera</item>
         <item>Ricoh GR / PENTAX</item>
         <item>Ricoh Theta(OSC)</item>
+        <item>Panasonic (MFT)</item>
         <item>OPC(Olympus Air)</item>
         <item>Olympus(OM-D/PEN)</item>
         <item>KODAK PIXPRO</item>
         <item>Fuji X Series</item>
-        <item>Panasonic</item>
         <item>Sony</item>
         <item>Canon</item>
         <item>Nikon</item>
         <item>camerax</item>
         <item>RICOH</item>
         <item>THETA</item>
+        <item>PANASONIC</item>
         <item>OPC</item>
         <item>OLYMPUS</item>
         <item>PIXPRO</item>
         <item>FUJI_X</item>
-        <item>PANASONIC</item>
         <item>SONY</item>
         <item>CANON</item>
         <item>NIKON</item>