OSDN Git Service

PIXPRO WPZ2用制御コードのマージ。(状態表示は行っていないが、撮影できるところまで。)
authorMRSa <mrsa@myad.jp>
Sat, 28 Aug 2021 13:18:09 +0000 (22:18 +0900)
committerMRSa <mrsa@myad.jp>
Sat, 28 Aug 2021 13:18:09 +0000 (22:18 +0900)
26 files changed:
.idea/dictionaries/MRSa.xml
app/src/main/AndroidManifest.xml
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/IPixproInternalInterfaces.kt
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/FocusControl.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/IPixproCameraInitializer.kt [new file with mode: 0644]
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/PixproCamera.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/IPixproCommunicationNotify.kt [new file with mode: 0644]
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/PixproCommandCommunicator.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproExecuteFocus.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproCameraConnectSequence.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproCameraConnection.kt [moved from app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproConnection.kt with 95% similarity]
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproCameraDisconnectSequence.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproConnectionClient.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/liveview/PixproLiveViewControl.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/PixproStatusHolder.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/constants/ICameraConnectionMethods.kt
app/src/main/java/jp/osdn/gokigen/gokigenassets/constants/ICameraConstantConvert.kt
app/src/main/java/jp/osdn/gokigen/mangle/MainActivity.kt
app/src/main/java/jp/osdn/gokigen/mangle/preference/SelectCameraConnectionMethodDialog.kt [deleted file]
app/src/main/java/jp/osdn/gokigen/mangle/scene/CameraProvider.kt
app/src/main/res/values-ja/arrays.xml
app/src/main/res/values-ja/strings.xml
app/src/main/res/values/arrays.xml
app/src/main/res/values/strings.xml

index fa7658b..3db6b5e 100644 (file)
@@ -3,11 +3,13 @@
     <words>
       <w>acclock</w>
       <w>batt</w>
+      <w>displayer</w>
       <w>equirectangular</w>
       <w>liveview</w>
       <w>mpget</w>
       <w>mpset</w>
       <w>pixpro</w>
+      <w>recmode</w>
       <w>ricoh</w>
     </words>
   </dictionary>
index fe8d4ec..6eb2215 100644 (file)
@@ -10,6 +10,7 @@
     <uses-permission android:name="android.permission.INTERNET" />
     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
+    <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/>
 
     <application
         android:allowBackup="true"
index 7565b34..e99d506 100644 (file)
@@ -1,7 +1,10 @@
 package jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro
 
+import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.IPixproCamera
+import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.IPixproCameraInitializer
 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.IPixproCommandPublisher
 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.IPixproCommunication
+import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.IPixproCommunicationNotify
 import jp.osdn.gokigen.gokigenassets.scene.IInformationReceiver
 
 interface IPixproInternalInterfaces
@@ -9,5 +12,7 @@ interface IPixproInternalInterfaces
     fun getIPixproCommunication() : IPixproCommunication
     fun getIPixproCommandPublisher() : IPixproCommandPublisher
     fun getInformationReceiver() : IInformationReceiver
-
-}
\ No newline at end of file
+    fun getIPixproCameraInitializer() : IPixproCameraInitializer
+    fun getIPixproCamera() : IPixproCamera
+    fun getIPixproCommunicationNotify() : IPixproCommunicationNotify
+}
index dbbb227..de62e4a 100644 (file)
 package jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro
 
-import android.graphics.Color
+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.preference.ICameraPreferenceProvider
+import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.operation.FocusControl
+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
 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.PixproCamera
 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.IPixproCommandPublisher
 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.IPixproCommunication
+import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.IPixproCommunicationNotify
 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.PixproCommandCommunicator
+import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.connection.PixproCameraConnection
+import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.liveview.PixproLiveViewControl
+import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.status.PixproStatusChecker
+import jp.osdn.gokigen.gokigenassets.constants.IApplicationConstantConvert
+import jp.osdn.gokigen.gokigenassets.constants.ICameraConstantConvert.Companion.ID_STRING_COMMAND_LINE_DISCONNECTED
 import jp.osdn.gokigen.gokigenassets.liveview.ICachePositionProvider
+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.IInformationReceiver
 import jp.osdn.gokigen.gokigenassets.scene.IVibrator
 
-
-class PixproCameraControl(private val context: AppCompatActivity, private val vibrator: IVibrator, private val informationNotify : IInformationReceiver, private val preference: ICameraPreferenceProvider, provider: ICameraStatusReceiver) : ICameraControl, View.OnClickListener, View.OnLongClickListener, IKeyDown, ICameraStatus, IPixproInternalInterfaces, PixproCommandCommunicator.ICommunicationNotify
+class PixproCameraControl(private val context: AppCompatActivity, private val vibrator: IVibrator, private val informationNotify : IInformationReceiver, private val preference: ICameraPreferenceProvider, provider: ICameraStatusReceiver) : ICameraControl, View.OnClickListener, View.OnLongClickListener, ICameraShutter, IKeyDown, IPixproInternalInterfaces, IPixproCommunicationNotify, IDisplayInjector
 {
+    private val statusChecker = PixproStatusChecker()
+    private val liveViewListener = CameraLiveViewListenerImpl(context, informationNotify)
+    private val cameraConnection = PixproCameraConnection(context, provider, this, statusChecker)
     private val pixproCameraParameter = PixproCamera()
     private val commandCommunicator = PixproCommandCommunicator(pixproCameraParameter, this)
+    private val storeImage = StoreImage(context, liveViewListener)
+
+    private lateinit var liveViewControl : PixproLiveViewControl
+    private lateinit var cachePositionProvider : ICachePositionProvider
+    private lateinit var focusControl: FocusControl
+    private lateinit var captureControl: SingleShotControl
+
+    private var cameraPositionId = 0
 
     companion object
     {
         private val TAG = PixproCameraControl::class.java.simpleName
     }
 
-    override fun getConnectionMethod(): String { return ("PIXPRO") }
-    override fun initialize() { }
-    override fun connectToCamera() { }
-    override fun startCamera(isPreviewView: Boolean, cameraSequence : Int) { }
-    override fun finishCamera() { }
+    override fun getConnectionMethod(): String
+    {
+        return ("PIXPRO")
+    }
+
+    override fun initialize()
+    {
+        Log.v(TAG, " --- initialize() : SEQ : ${preference.getConnectionSequence()}")
+    }
+
+    override fun connectToCamera()
+    {
+        Log.v(TAG, " connectToCamera() : PIXPRO ")
+        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 (::liveViewControl.isInitialized)
+            {
+                liveViewControl.stopLiveView()
+            }
+            statusChecker.stopStatusWatch()
+            cameraConnection.disconnect(false)
+            cameraConnection.stopWatchWifiStatus(context)
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
     override fun changeCaptureMode(mode: String) { }
     override fun needRotateImage(): Boolean { return (false) }
-    override fun setRefresher(id : Int, refresher: ILiveViewRefresher, imageView: ILiveView, cachePosition : ICachePositionProvider) { }
-    override fun captureButtonReceiver(id: Int): View.OnClickListener { return (this) }
-    override fun onLongClickReceiver(id: Int): View.OnLongClickListener { return (this) }
-    override fun keyDownReceiver(id: Int): IKeyDown { return (this) }
-    override fun getFocusingControl(id: Int): IFocusingControl? { return (null) }
-    override fun getDisplayInjector(): IDisplayInjector? { return (null) }
+    override fun setRefresher(id : Int, refresher: ILiveViewRefresher, imageView: ILiveView, cachePosition : ICachePositionProvider)
+    {
+        try
+        {
+            liveViewListener.setRefresher(refresher)
+            imageView.setImageProvider(liveViewListener)
+            cachePositionProvider = cachePosition
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    override fun captureButtonReceiver(id: Int): View.OnClickListener
+    {
+        cameraPositionId = id
+        return (this)
+    }
+
+    override fun onLongClickReceiver(id: Int): View.OnLongClickListener
+    {
+        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 = FocusControl(commandCommunicator, frameDisplayer)
+        captureControl = SingleShotControl(commandCommunicator, frameDisplayer)
+    }
+
     override fun setNeighborCameraControl(camera0: ICameraControl?, camera1: ICameraControl?, camera2: ICameraControl?, camera3: ICameraControl?) { }
-    override fun getCameraStatus(): ICameraStatus { return (this) }
+    override fun getCameraStatus(): ICameraStatus { return (statusChecker) }
 
-    override fun onClick(v: View?) { }
-    override fun handleKeyDown(keyCode: Int, event: KeyEvent): Boolean { return (false) }
-    override fun onLongClick(v: View?): Boolean { return (false) }
+    override fun onClick(v: View?)
+    {
+        if (v == null)
+        {
+            return
+        }
+        when (v.id)
+        {
+            IApplicationConstantConvert.ID_BUTTON_SHUTTER -> { doShutter() }
+            else -> { }
+        }
+    }
 
-    override fun getStatusList(key: String): List<String?> { return (ArrayList<String>()) }
-    override fun getStatus(key: String): String { return ("") }
-    override fun getStatusColor(key: String): Int { return (Color.WHITE) }
-    override fun setStatus(key: String, value: String) { }
+    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)
+    }
 
+    override fun onLongClick(v: View?): Boolean
+    {
+        return (false)
+    }
 
     override fun getIPixproCommunication(): IPixproCommunication { return (commandCommunicator) }
     override fun getIPixproCommandPublisher(): IPixproCommandPublisher { return (commandCommunicator) }
     override fun getInformationReceiver(): IInformationReceiver { return (informationNotify) }
+    override fun getIPixproCameraInitializer(): IPixproCameraInitializer { return (pixproCameraParameter) }
+    override fun getIPixproCamera(): IPixproCamera { return (pixproCameraParameter) }
+    override fun getIPixproCommunicationNotify(): IPixproCommunicationNotify { return (this) }
+
+    override fun readyToCommunicate()
+    {
+        Log.v(TAG, " ----- readyToCommunicate() ")
+        try
+        {
+            if (!::liveViewControl.isInitialized)
+            {
+                liveViewControl = PixproLiveViewControl(liveViewListener, pixproCameraParameter)
+            }
+            liveViewControl.startLiveView()
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+    }
 
     override fun detectDisconnect()
     {
+        Log.v(TAG, " ----- detectDisconnect() ")
+        cameraConnection.forceUpdateConnectionStatus(ICameraConnectionStatus.CameraConnectionStatus.DISCONNECTED)
+        cameraConnection.alertConnectingFailed(context.getString(ID_STRING_COMMAND_LINE_DISCONNECTED))
+    }
+
+    override fun doShutter()
+    {
+        try
+        {
+            Log.v(TAG, " doShutter()")
+            val isNotDriveShutter = captureImageLiveView()
+            if (isNotDriveShutter)
+            {
+                //  シャッターを駆動させない(けど、バイブレーションで通知する)
+                vibrator.vibrate(IVibrator.VibratePattern.SIMPLE_SHORT)
+                return
+            }
+            if (::captureControl.isInitialized)
+            {
+                captureControl.doCapture(0)
+            }
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+    }
 
-/*
-    private fun detectDisconnect()
+    override fun doShutterOff()
     {
-        val connection: ICameraConnection = interfaceProvider.getCameraConnection()
-        if (connection != null)
+        try
         {
-            // 回線状態を「切断」にしてダイアログを表示する
-            connection.forceUpdateConnectionStatus(ICameraConnection.CameraConnectionStatus.DISCONNECTED)
-            connection.alertConnectingFailed(interfaceProvider.getStringFromResource(R.string.kodak_command_line_disconnected))
+            Log.v(TAG, " doShutterOff()")
+            if (::captureControl.isInitialized)
+            {
+                captureControl.doCapture(0)
+            }
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
         }
     }
- */
-        //TODO("Not yet implemented")
+
+    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, cachePositionProvider.getCachePosition()) }
+                try
+                {
+                    thread.start()
+                }
+                catch (e: Exception)
+                {
+                    e.printStackTrace()
+                }
+            }
+            return (notUseShutter)
+        }
+        catch (e : Exception)
+        {
+            e.printStackTrace()
+        }
+        return (false)
     }
 }
index 07819bd..590e860 100644 (file)
@@ -9,6 +9,7 @@ import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.IPixpr
 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.messages.IPixproCommandCallback
 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.messages.specific.PixproExecuteFocus
 import java.lang.Exception
+import kotlin.math.roundToInt
 
 class FocusControl(private val commandPublisher: IPixproCommandPublisher, private val frameDisplayer: IAutoFocusFrameDisplay?) : IFocusingControl, IPixproCommandCallback
 {
@@ -78,8 +79,8 @@ class FocusControl(private val commandPublisher: IPixproCommandPublisher, privat
         val maxPointLimitWidth = 1000000.0f
         val maxPointLimitHeight = 1000000.0f
         try {
-            val x = 0x00ffffff and Math.round(point.x * maxPointLimitWidth) + 1
-            val y = 0x00ffffff and Math.round(point.y * maxPointLimitHeight) + 1
+            val x = 0x00ffffff and (point.x * maxPointLimitWidth).roundToInt() + 1
+            val y = 0x00ffffff and (point.y * maxPointLimitHeight).roundToInt() + 1
             Log.v(TAG, "Lock AF: [$x,$y]")
             commandPublisher.enqueueCommand(PixproExecuteFocus(this, x, y))
         } catch (e: Exception) {
diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/IPixproCameraInitializer.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/IPixproCameraInitializer.kt
new file mode 100644 (file)
index 0000000..b643875
--- /dev/null
@@ -0,0 +1,7 @@
+package jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper
+
+interface IPixproCameraInitializer
+{
+    fun setCommunicationParameter(ip: String, port: Int, lvPort: Int, tcpDelay: Boolean)
+    fun parseCommunicationParameter(data: ByteArray)
+}
index 6f538f1..2c88160 100644 (file)
@@ -1,8 +1,9 @@
 package jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper
 
 import android.util.Log
+import jp.osdn.gokigen.gokigenassets.utils.communication.SimpleLogDumper
 
-class PixproCamera : IPixproCamera
+class PixproCamera : IPixproCamera, IPixproCameraInitializer
 {
     private lateinit var ipAddress: String
     private var portNumber = -1
@@ -15,7 +16,7 @@ class PixproCamera : IPixproCamera
         private val TAG = PixproCamera::class.java.simpleName
     }
 
-    fun setCommunicationParameter(ip: String, port: Int, lvPort: Int, tcpDelay: Boolean)
+    override fun setCommunicationParameter(ip: String, port: Int, lvPort: Int, tcpDelay: Boolean)
     {
         Log.v(TAG, "setCommunicationParameter($ip, $port, $lvPort, $tcpDelay)")
         this.ipAddress = ip
@@ -25,11 +26,13 @@ class PixproCamera : IPixproCamera
         isAvailable = true
     }
 
-    fun parseCommunicationParameter(data: ByteArray)
+    override fun parseCommunicationParameter(data: ByteArray)
     {
         //  AOFREPLY:DC163,1,PIXPRO WPZ2,172.16.0.254,255.255.255.0,(mac address),9176,9175,0,(WIFI SSID),0
         try
         {
+            val dumpSize = if (data.size > 127 ) { 127 } else { data.size }
+            SimpleLogDumper.dumpBytes("[QUERY:${data.size}]", data.copyOfRange(0, dumpSize))
             isAvailable = true
         }
         catch (e: Exception)
diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/IPixproCommunicationNotify.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/IPixproCommunicationNotify.kt
new file mode 100644 (file)
index 0000000..b4440d6
--- /dev/null
@@ -0,0 +1,7 @@
+package jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command
+
+interface IPixproCommunicationNotify
+{
+    fun readyToCommunicate()
+    fun detectDisconnect()
+}
index 80569f2..f23099a 100644 (file)
@@ -17,7 +17,7 @@ import java.net.Socket
 import java.net.SocketException
 import java.util.*
 
-class PixproCommandCommunicator(private val pixproCamera: IPixproCamera, private val notifier: ICommunicationNotify) : IPixproCommandPublisher, IPixproCommunication
+class PixproCommandCommunicator(private val pixproCamera: IPixproCamera, private val notifier: IPixproCommunicationNotify) : IPixproCommandPublisher, IPixproCommunication
 {
     private var isStart = false
     private var isConnected = false
@@ -55,11 +55,11 @@ class PixproCommandCommunicator(private val pixproCamera: IPixproCamera, private
             socket = Socket()
             if (pixproCamera.getTcpNoDelay())
             {
-                socket?.setKeepAlive(false)
+                socket?.keepAlive = false
                 socket?.setPerformancePreferences(0, 2, 0)
-                socket?.setOOBInline(true)
-                socket?.setReuseAddress(false)
-                socket?.setTrafficClass(0x80)
+                socket?.oobInline = true
+                socket?.reuseAddress = false
+                socket?.trafficClass = 0x80
             }
             socket?.tcpNoDelay = pixproCamera.getTcpNoDelay()
             socket?.connect(InetSocketAddress(pixproCamera.getIpAddress(), pixproCamera.getPortNumber()), 0)
@@ -368,7 +368,7 @@ class PixproCommandCommunicator(private val pixproCamera: IPixproCamera, private
         if (isDumpReceiveLog && body != null)
         {
             // ログに受信メッセージを出力する
-            SimpleLogDumper.dumpBytes("RECV[" + body.size + "] ", body)
+            SimpleLogDumper.dumpBytes("RX[" + body.size + "] ", body)
         }
         if (checkReceiveStatusMessage(body))
         {
@@ -759,9 +759,4 @@ class PixproCommandCommunicator(private val pixproCamera: IPixproCamera, private
         }
         return (readBytes)
     }
-
-    interface ICommunicationNotify
-    {
-        fun detectDisconnect()
-    }
 }
index 29da4dc..26396c9 100644 (file)
@@ -18,7 +18,7 @@ class PixproExecuteFocus(private val callback: IPixproCommandCallback, posX: Int
 
     override fun getId() : Int
     {
-        return (IPixproMessages.SEQ_SHUTTER)
+        return (IPixproMessages.SEQ_FOCUS)
     }
 
     override fun commandBody(): ByteArray
index a963ad3..0a7a571 100644 (file)
@@ -6,6 +6,7 @@ import androidx.appcompat.app.AppCompatActivity
 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraConnection
 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraStatusReceiver
 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.IPixproInternalInterfaces
+import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.IPixproCamera
 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.base.IPixproMessages
@@ -30,9 +31,10 @@ import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.messag
 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.status.PixproStatusChecker
 import jp.osdn.gokigen.gokigenassets.constants.ICameraConstantConvert
 
-
-class PixproCameraConnectSequence(private val context: AppCompatActivity, private val cameraStatusReceiver: ICameraStatusReceiver, private val cameraConnection : ICameraConnection, private val interfaceProvider : IPixproInternalInterfaces, private val statusChecker: PixproStatusChecker) : Runnable, IPixproCommandCallback, IPixproMessages
+class PixproCameraConnectSequence(private val context: AppCompatActivity, private val cameraStatusReceiver: ICameraStatusReceiver, private val cameraConnection : ICameraConnection, private val interfaceProvider : IPixproInternalInterfaces, private val statusChecker: PixproStatusChecker) : Runnable, IPixproCommandCallback, IPixproMessages, PixproConnectionClient.ISearchResultCallback
 {
+    private var client = PixproConnectionClient(context, interfaceProvider, this, cameraStatusReceiver, 1)
+
     private val commandIssuer: IPixproCommandPublisher
     private var flashMode: String = "OFF"
 
@@ -50,6 +52,20 @@ class PixproCameraConnectSequence(private val context: AppCompatActivity, privat
 
     override fun run()
     {
+        Log.v(TAG, "search()")
+        try
+        {
+            cameraStatusReceiver.onStatusNotify(context.getString(ICameraConstantConvert.ID_STRING_CONNECT_START))
+            client.search()
+        }
+        catch (e: java.lang.Exception)
+        {
+            e.printStackTrace()
+        }
+    }
+
+    private fun startConnect()
+    {
         try
         {
             // カメラとTCP接続
@@ -61,9 +77,9 @@ class PixproCameraConnectSequence(private val context: AppCompatActivity, privat
                     // 接続失敗...
                     interfaceProvider.getInformationReceiver().updateMessage(
                         context.getString(ICameraConstantConvert.ID_STRING_DIALOG_TITLE_CONNECT_FAILED),
-                        false,
-                        true,
-                        Color.RED
+                        isBold = false,
+                        isColor = true,
+                        color = Color.RED
                     )
                     onConnectError(context.getString(ICameraConstantConvert.ID_STRING_DIALOG_TITLE_CONNECT_FAILED))
                     return
@@ -84,9 +100,9 @@ class PixproCameraConnectSequence(private val context: AppCompatActivity, privat
             e.printStackTrace()
             interfaceProvider.getInformationReceiver().updateMessage(
                 context.getString(ICameraConstantConvert.ID_STRING_DIALOG_TITLE_CONNECT_FAILED),
-                false,
-                true,
-                Color.RED
+                isBold = false,
+                isColor = true,
+                color = Color.RED
             )
             onConnectError(e.message?: "")
         }
@@ -97,41 +113,42 @@ class PixproCameraConnectSequence(private val context: AppCompatActivity, privat
         cameraConnection.alertConnectingFailed(reason)
     }
 
-    override fun receivedMessage(id: Int, rx_body: ByteArray?) {
+    override fun receivedMessage(id: Int, rx_body: ByteArray?)
+    {
         when (id) {
             SEQ_CONNECT_01 -> {
                 interfaceProvider.getInformationReceiver().updateMessage(
                     context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CONNECTING) + "1",
-                    false,
-                    false,
-                    0
+                    isBold = false,
+                    isColor = false,
+                    color = 0
                 )
                 commandIssuer.enqueueCommand(PixproConnectSequence02(this))
             }
             SEQ_CONNECT_02 -> {
                 interfaceProvider.getInformationReceiver().updateMessage(
                     context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CONNECTING) + "2",
-                    false,
-                    false,
-                    0
+                    isBold = false,
+                    isColor = false,
+                    color = 0
                 )
                 commandIssuer.enqueueCommand(PixproConnectSequence03(this))
             }
             SEQ_CONNECT_03 -> {
                 interfaceProvider.getInformationReceiver().updateMessage(
                     context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CONNECTING) + "3",
-                    false,
-                    false,
-                    0
+                    isBold = false,
+                    isColor = false,
+                    color = 0
                 )
                 commandIssuer.enqueueCommand(PixproConnectSequence04(this))
             }
             SEQ_CONNECT_04 -> {
                 interfaceProvider.getInformationReceiver().updateMessage(
                     context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CONNECTING) + "4",
-                    false,
-                    false,
-                    0
+                    isBold = false,
+                    isColor = false,
+                    color = 0
                 )
                 // ここで、パスワードの Base64情報を切り出す(FC 03 の応答、 0x0058 ~ 64バイトの文字列を切り出して、Base64エンコードする)
                 commandIssuer.enqueueCommand(PixproConnectSequence05(this))
@@ -139,9 +156,9 @@ class PixproCameraConnectSequence(private val context: AppCompatActivity, privat
             SEQ_CONNECT_05 -> {
                 interfaceProvider.getInformationReceiver().updateMessage(
                     context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CONNECTING) + "5",
-                    false,
-                    false,
-                    0
+                    isBold = false,
+                    isColor = false,
+                    color = 0
                 )
                 // ここで、パスワードの情報を切り出す (FE 03 の応答、 0x0078 ~ 文字列を切り出す。)
                 commandIssuer.enqueueCommand(PixproConnectSequence06(this))
@@ -149,69 +166,73 @@ class PixproCameraConnectSequence(private val context: AppCompatActivity, privat
             SEQ_CONNECT_06 -> {
                 interfaceProvider.getInformationReceiver().updateMessage(
                     context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CONNECTING) + "6",
-                    false,
-                    false,
-                    0
+                    isBold = false,
+                    isColor = false,
+                    color = 0
                 )
                 commandIssuer.enqueueCommand(PixproConnectSequence07(this))
             }
             SEQ_CONNECT_07 -> {
                 interfaceProvider.getInformationReceiver().updateMessage(
                     context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CONNECTING) + "7",
-                    false,
-                    false,
-                    0
+                    isBold = false,
+                    isColor = false,
+                    color = 0
                 )
                 commandIssuer.enqueueCommand(PixproConnectSequence08(this))
             }
             SEQ_CONNECT_08 -> {
                 interfaceProvider.getInformationReceiver().updateMessage(
                     context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CONNECTING) + "8",
-                    false,
-                    false,
-                    0
+                    isBold = false,
+                    isColor = false,
+                    color = 0
                 )
                 commandIssuer.enqueueCommand(PixproConnectSequence09(this))
             }
             SEQ_CONNECT_09 -> {
                 interfaceProvider.getInformationReceiver().updateMessage(
                     context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CONNECTING) + "9",
-                    false,
-                    false,
-                    0
+                    isBold = false,
+                    isColor = false,
+                    color = 0
                 )
                 commandIssuer.enqueueCommand(PixproConnectSequence10(this))
             }
             SEQ_CONNECT_10 -> {
                 interfaceProvider.getInformationReceiver().updateMessage(
                     context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CONNECTING) + "10",
-                    false,
-                    false,
-                    0
+                    isBold = false,
+                    isColor = false,
+                    color = 0
                 )
                 commandIssuer.enqueueCommand(PixproConnectSequence11(this))
             }
             SEQ_CONNECT_11 -> {
                 interfaceProvider.getInformationReceiver().updateMessage(
                     context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CONNECTING) + "11",
-                    false,
-                    false,
-                    0
+                    isBold = false,
+                    isColor = false,
+                    color = 0
                 )
-                if (flashMode.contains("AUTO")) {
-                    commandIssuer.enqueueCommand(PixproFlashAuto(this))
-                } else if (flashMode.contains("ON")) {
-                    commandIssuer.enqueueCommand(PixproFlashOn(this))
-                } else {
-                    commandIssuer.enqueueCommand(PixproFlashOff(this))
+                when {
+                    flashMode.contains("AUTO") -> {
+                        commandIssuer.enqueueCommand(PixproFlashAuto(this))
+                    }
+                    flashMode.contains("ON") -> {
+                        commandIssuer.enqueueCommand(PixproFlashOn(this))
+                    }
+                    else -> {
+                        commandIssuer.enqueueCommand(PixproFlashOff(this))
+                    }
                 }
             }
             SEQ_FLASH_AUTO, SEQ_FLASH_OFF, SEQ_FLASH_ON -> {
                 interfaceProvider.getInformationReceiver().updateMessage(
                     context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CONNECT_FINISHED),
-                    false,
-                    false,
-                    0
+                    isBold = false,
+                    isColor = false,
+                    color = 0
                 )
                 connectFinished()
                 Log.v(TAG, "  CONNECT TO CAMERA : DONE.")
@@ -225,8 +246,11 @@ class PixproCameraConnectSequence(private val context: AppCompatActivity, privat
 
     private fun startConnectSequence()
     {
-        interfaceProvider.getInformationReceiver()
-            .updateMessage(context.getString(ICameraConstantConvert.ID_STRING_CONNECT_START), false, false, 0)
+        interfaceProvider.getInformationReceiver().updateMessage(context.getString(ICameraConstantConvert.ID_STRING_CONNECT_START),
+            isBold = false,
+            isColor = false,
+            color = 0
+        )
         cameraStatusReceiver.onStatusNotify(context.getString(ICameraConstantConvert.ID_STRING_CONNECT_START))
         commandIssuer.enqueueCommand(PixproConnectSequence01(this))
     }
@@ -237,7 +261,11 @@ class PixproCameraConnectSequence(private val context: AppCompatActivity, privat
         {
             // 接続成功のメッセージを出す
             interfaceProvider.getInformationReceiver()
-                .updateMessage(context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CONNECTED), false, false, 0)
+                .updateMessage(context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CONNECTED),
+                    isBold = false,
+                    isColor = false,
+                    color = 0
+                )
 
             // ちょっと待つ
             Thread.sleep(1000)
@@ -247,7 +275,11 @@ class PixproCameraConnectSequence(private val context: AppCompatActivity, privat
 
             // 接続成功!のメッセージを出す
             interfaceProvider.getInformationReceiver()
-                .updateMessage(context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CONNECTED), false, false, 0)
+                .updateMessage(context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CONNECTED),
+                    isBold = false,
+                    isColor = false,
+                    color = 0
+                )
             onConnectNotify()
         }
         catch (e: Exception)
@@ -263,6 +295,7 @@ class PixproCameraConnectSequence(private val context: AppCompatActivity, privat
             val thread = Thread { // カメラとの接続確立を通知する
                 cameraStatusReceiver.onStatusNotify(context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CONNECTED))
                 cameraStatusReceiver.onCameraConnected()
+                interfaceProvider.getIPixproCommunicationNotify().readyToCommunicate()
                 Log.v(TAG, " onConnectNotify()")
             }
             thread.start()
@@ -273,4 +306,20 @@ class PixproCameraConnectSequence(private val context: AppCompatActivity, privat
         }
     }
 
+    override fun onDeviceFound(cameraDevice: IPixproCamera)
+    {
+        Log.v(TAG, " onDeviceFound()")
+        startConnect()
+    }
+
+    override fun onFinished()
+    {
+        Log.v(TAG, " ------ onFinished()")
+    }
+
+    override fun onErrorFinished(reason: String?)
+    {
+        Log.v(TAG, " onErrorFinished() : $reason")
+        cameraConnection.alertConnectingFailed(reason)
+    }
 }
@@ -17,11 +17,11 @@ import java.lang.Exception
 import java.util.concurrent.Executor
 import java.util.concurrent.Executors
 
-class PixproConnection(private val context: AppCompatActivity, private val statusReceiver: ICameraStatusReceiver, private val interfaceProvider : IPixproInternalInterfaces, private val statusChecker: PixproStatusChecker) : ICameraConnection
+class PixproCameraConnection(private val context: AppCompatActivity, private val statusReceiver: ICameraStatusReceiver, private val interfaceProvider : IPixproInternalInterfaces, private val statusChecker: PixproStatusChecker) : ICameraConnection
 {
     companion object
     {
-        private val TAG = PixproConnection::class.java.simpleName
+        private val TAG = PixproCameraConnection::class.java.simpleName
     }
     private val connectionReceiver: BroadcastReceiver
     private val cameraExecutor: Executor = Executors.newFixedThreadPool(1)
@@ -194,4 +194,5 @@ class PixproConnection(private val context: AppCompatActivity, private val statu
         }
     }
 
+
 }
index 38f72df..64affa9 100644 (file)
@@ -2,7 +2,6 @@ package jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.connection
 
 import androidx.appcompat.app.AppCompatActivity
 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.IPixproInternalInterfaces
-import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.IPixproCommunication
 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.status.PixproStatusChecker
 import java.lang.Exception
 
index 2a9fd2d..c09696e 100644 (file)
@@ -1,37 +1,29 @@
 package jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.connection
 
 import android.content.Context
+import android.net.wifi.WifiManager
 import android.util.Log
 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraStatusReceiver
-import jp.osdn.gokigen.gokigenassets.camera.vendor.sony.wrapper.ISonyCamera
-import jp.osdn.gokigen.gokigenassets.camera.vendor.sony.wrapper.SonyCameraDeviceProvider
 import jp.osdn.gokigen.gokigenassets.constants.ICameraConstantConvert
-import jp.osdn.gokigen.gokigenassets.utils.communication.SimpleHttpClient
-import jp.osdn.gokigen.gokigenassets.utils.communication.XmlElement
 import java.net.DatagramPacket
 import java.net.DatagramSocket
 import java.net.InetSocketAddress
-import java.nio.charset.Charset
-import android.net.DhcpInfo
-import androidx.core.content.ContextCompat.getSystemService
-import android.net.wifi.WifiManager
-import androidx.core.content.ContextCompat
-import jp.osdn.gokigen.gokigenassets.camera.vendor.sony.wrapper.connection.SonySsdpClient
+import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.IPixproInternalInterfaces
+import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.IPixproCamera
 import java.net.InetAddress
 
-
-class PixproConnectionClient(private val context: Context, private val callback: ISearchResultCallback, private val cameraStatusReceiver: ICameraStatusReceiver, private var sendRepeatCount: Int = 0)
+class PixproConnectionClient(private val context: Context, private val interfaceProvider: IPixproInternalInterfaces, private val callback: ISearchResultCallback, private val cameraStatusReceiver: ICameraStatusReceiver, private var sendRepeatCount: Int = 0)
 {
     companion object
     {
         private val TAG = PixproConnectionClient::class.java.simpleName
-        private const val SEND_TIMES_DEFAULT = 1
+        private const val SEND_TIMES_DEFAULT = 3
         private const val SEND_WAIT_DURATION_MS = 300
-        private const val SSDP_RECEIVE_TIMEOUT = 4 * 1000 // msec
+        private const val REPLY_RECEIVE_TIMEOUT = 4 * 1000 // msec
         private const val PACKET_BUFFER_SIZE = 4096
-
-        private const val QUERY_STRING = "AOFQUERY:GOKIGEN01Family,1"
+        private const val QUERY_STRING = "AOFQUERY:GOKIGEN a01Series,1"
         private const val TARGET_UDP_PORT = 5175
+        private const val RECEIVE_UDP_PORT = 5176
     }
 
     init
@@ -44,13 +36,17 @@ class PixproConnectionClient(private val context: Context, private val callback:
 /*
         try
         {
-            val wifi = context.getSystemService(Context.WIFI_SERVICE) as WifiManager?
-            val dhcp = wifi!!.dhcpInfo
-            // handle null somehow
-            val broadcast = dhcp.ipAddress and dhcp.netmask or dhcp.netmask.inv()
-            val quads = ByteArray(4)
-            for (k in 0..3) quads[k] = (broadcast shr k * 8).toByte()
-            return InetAddress.getByAddress(quads)
+            val wifi = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager?
+            val dhcp = wifi?.dhcpInfo
+            if (dhcp != null)
+            {
+                //val dhcpServer = dhcp.serverAddress
+                val broadcast = dhcp.ipAddress and dhcp.netmask or dhcp.netmask.inv()
+                val quads = ByteArray(4)
+                for (k in 0..3) quads[k] = (broadcast shr k * 8).toByte()
+                Log.v(TAG, " DHCP : $dhcp")
+                return (InetAddress.getByAddress(quads))
+            }
         }
         catch (e : Exception)
         {
@@ -62,251 +58,109 @@ class PixproConnectionClient(private val context: Context, private val callback:
 
     fun search()
     {
-        val sendData = QUERY_STRING.toByteArray()
-        val detailString = ""
-        var socket: DatagramSocket? = null
-        var receivePacket: DatagramPacket
-        val packet: DatagramPacket
-
-        //  要求の送信
+        val sendReceiveSocket = DatagramSocket(RECEIVE_UDP_PORT)
         try
         {
-            socket = DatagramSocket()
-            socket.reuseAddress = true
-            val iAddress = InetSocketAddress(getBroadcastAddress(), TARGET_UDP_PORT)
-            packet = DatagramPacket(sendData, sendData.size, iAddress)
+            //  要求の送信
+            sendReceiveSocket.reuseAddress = true
+            val broadcastAddress = getBroadcastAddress()
+            val iAddress = InetSocketAddress(broadcastAddress, TARGET_UDP_PORT)
+            val sendData = QUERY_STRING.toByteArray()
+            val packet = DatagramPacket(sendData, sendData.size, iAddress)
 
             // 要求を繰り返し送信する
             for (loop in 1..sendRepeatCount)
             {
                 cameraStatusReceiver.onStatusNotify(context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CAMERA_SEARCH_REQUEST) + " " + loop)
-                socket.send(packet)
+                sendReceiveSocket.send(packet)
                 Thread.sleep(SEND_WAIT_DURATION_MS.toLong())
             }
-            Log.v(TAG, " UDP QUERY : SEND $QUERY_STRING")
+            Log.v(TAG, " UDP QUERY : SEND $QUERY_STRING (${broadcastAddress.hostAddress})")
         }
         catch (e: Exception)
         {
-            if (socket != null && !socket.isClosed)
-            {
-                socket.close()
-            }
-            e.printStackTrace()
+            sendReceiveSocket.close()
 
             // エラー応答する
-            callback.onErrorFinished(detailString + " : " + e.localizedMessage)
+            callback.onErrorFinished(" : " + e.localizedMessage)
             return
         }
 
-        // 応答の受信
-        val startTime = System.currentTimeMillis()
-        var currentTime = System.currentTimeMillis()
-        val foundDevices: MutableList<String?> = ArrayList()
-        val array = ByteArray(PACKET_BUFFER_SIZE)
-
         try
         {
+            val wifi = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager?
+            val mLock = wifi?.createMulticastLock("lock")
+
+            val cameraInitializer = interfaceProvider.getIPixproCameraInitializer()
+            val pixproCamera = interfaceProvider.getIPixproCamera()
+
+            // 応答の受信
+            val startTime = System.currentTimeMillis()
+            var currentTime = System.currentTimeMillis()
+            val array = ByteArray(PACKET_BUFFER_SIZE)
             cameraStatusReceiver.onStatusNotify(context.getString(ICameraConstantConvert.ID_STRING_CONNECT_WAIT_REPLY_CAMERA))
-            while (currentTime - startTime < SSDP_RECEIVE_TIMEOUT)
+            while (currentTime - startTime < REPLY_RECEIVE_TIMEOUT)
             {
-                receivePacket = DatagramPacket(array, array.size)
-                socket.soTimeout = SSDP_RECEIVE_TIMEOUT
-                socket.receive(receivePacket)
-                val ssdpReplyMessage = String(receivePacket.getData(), 0, receivePacket.length, Charset.forName("UTF-8"))
-                var ddUsn: String?
-                if (ssdpReplyMessage.contains("HTTP/1.1 200"))
+                val receivePacket = DatagramPacket(array, array.size)
+                sendReceiveSocket.soTimeout = REPLY_RECEIVE_TIMEOUT
+
+                try
+                {
+                    mLock?.acquire()
+                    sendReceiveSocket.receive(receivePacket)
+                    mLock?.release()
+                }
+                catch (ee: java.net.SocketTimeoutException)
+                {
+                    sendReceiveSocket.close()
+
+                    // 受信タイムアウト: エラー応答する
+                    callback.onErrorFinished(" : " + ee.localizedMessage)
+                    return
+                }
+                catch (e: Exception)
                 {
-                    ddUsn = findParameterValue(ssdpReplyMessage, "USN")
-                    cameraStatusReceiver.onStatusNotify(context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CAMERA_RECEIVED_REPLY))
-                    if (!foundDevices.contains(ddUsn))
-                    {
-                        val ddLocation = findParameterValue(ssdpReplyMessage, "LOCATION")
-                        foundDevices.add(ddUsn)
+                    // そうなじゃなければ例外出す
+                    e.printStackTrace()
+                }
 
-                        //// Fetch Device Description XML and parse it.
-                        if (ddLocation != null)
-                        {
-                            cameraStatusReceiver.onStatusNotify("LOCATION : $ddLocation")
-                            val device: ISonyCamera? = searchSonyCameraDevice(ddLocation)
-                            if ((device != null)&&(device.hasApiService("camera")))
-                            {
-                                cameraStatusReceiver.onStatusNotify(context.getString(
-                                    ICameraConstantConvert.ID_STRING_CONNECT_CAMERA_FOUND) + " " + device.getFriendlyName())
-                                callback.onDeviceFound(device)
-                                // カメラが見つかった場合は breakする
-                                break
-                            }
-                            else
-                            {
-                                // カメラが見つからない...
-                                cameraStatusReceiver.onStatusNotify(context.getString(
-                                    ICameraConstantConvert.ID_STRING_CAMERA_NOT_FOUND))
-                            }
-                        }
-                    }
-                    else
-                    {
-                        Log.v(TAG, "Already received. : $ddUsn")
-                    }
+                cameraInitializer.parseCommunicationParameter(receivePacket.data)
+                if (pixproCamera.isAvailable())
+                {
+                    callback.onDeviceFound(pixproCamera)
+                    break
                 }
                 else
                 {
-                    Log.v(TAG, " SSDP REPLY MESSAGE (ignored) : $ssdpReplyMessage")
+                    // カメラが見つからない...
+                    cameraStatusReceiver.onStatusNotify(context.getString(ICameraConstantConvert.ID_STRING_CAMERA_NOT_FOUND))
                 }
                 currentTime = System.currentTimeMillis()
             }
         }
         catch (e: Exception)
         {
+            sendReceiveSocket.close()
             e.printStackTrace()
 
             // エラー応答する
-            callback.onErrorFinished(detailString + " : " + e.localizedMessage)
+            callback.onErrorFinished(" : " + e.localizedMessage)
             return
         }
-        finally
-        {
-            try
-            {
-                if (!socket.isClosed())
-                {
-                    socket.close()
-                }
-            }
-            catch (ee: Exception)
-            {
-                ee.printStackTrace()
-            }
-        }
-        callback.onFinished()
-    }
-
-    private fun findParameterValue(ssdpMessage: String, paramName: String): String?
-    {
-        var name = paramName
-        if (!name.endsWith(":"))
-        {
-            name = "$name:"
-        }
-        var start = ssdpMessage.indexOf(name)
-        val end = ssdpMessage.indexOf("\r\n", start)
-        if (start != -1 && end != -1)
-        {
-            start += name.length
-            try
-            {
-                return ssdpMessage.substring(start, end).trim { it <= ' ' }
-            }
-            catch (e: Exception)
-            {
-                e.printStackTrace()
-            }
-        }
-        return null
-    }
-
-    private fun searchSonyCameraDevice(ddUrl: String): ISonyCamera?
-    {
-        val httpClient = SimpleHttpClient()
-        var device: SonyCameraDeviceProvider? = null
-        val ddXml: String
         try
         {
-            ddXml = httpClient.httpGet(ddUrl, -1)
-            Log.d(TAG, "fetch () httpGet done. : " + ddXml.length)
-            if (ddXml.length < 2)
-            {
-                // 内容がないときは...終了する
-                Log.v(TAG, "NO BODY")
-                return (null)
-            }
+            sendReceiveSocket.close()
         }
-        catch (e: java.lang.Exception)
+        catch (e: Exception)
         {
             e.printStackTrace()
-            return (null)
         }
-        try
-        {
-            //Log.v(TAG, "ddXml : " + ddXml);
-            val rootElement = XmlElement.parse(ddXml)
-
-            // "root"
-            if ("root" == rootElement.tagName)
-            {
-                // "device"
-                val deviceElement = rootElement.findChild("device")
-                val friendlyName = deviceElement.findChild("friendlyName").value
-                val modelName = deviceElement.findChild("modelName").value
-                val udn = deviceElement.findChild("UDN").value
-
-                // "iconList"
-                var iconUrl = ""
-                val iconListElement = deviceElement.findChild("iconList")
-                val iconElements = iconListElement.findChildren("icon")
-                for (iconElement in iconElements) {
-                    // Choose png icon to show Android UI.
-                    if ("image/png" == iconElement.findChild("mimetype").value) {
-                        val uri = iconElement.findChild("url").value
-                        val hostUrl = toSchemeAndHost(ddUrl)
-                        iconUrl = hostUrl + uri
-                    }
-                }
-                device = SonyCameraDeviceProvider(ddUrl, friendlyName, modelName, udn, iconUrl)
-
-                // "av:X_ScalarWebAPI_DeviceInfo"
-                val wApiElement = deviceElement.findChild("X_ScalarWebAPI_DeviceInfo")
-                val wApiServiceListElement = wApiElement.findChild("X_ScalarWebAPI_ServiceList")
-                val wApiServiceElements =
-                    wApiServiceListElement.findChildren("X_ScalarWebAPI_Service")
-                for (wApiServiceElement in wApiServiceElements) {
-                    val serviceName =
-                        wApiServiceElement.findChild("X_ScalarWebAPI_ServiceType").value
-                    val actionUrl =
-                        wApiServiceElement.findChild("X_ScalarWebAPI_ActionList_URL").value
-                    device.addApiService(serviceName, actionUrl)
-                }
-            }
-        } catch (e: java.lang.Exception) {
-            e.printStackTrace()
-        }
-        Log.d(TAG, "fetch () parsing XML done.")
-        if (device == null) {
-            Log.v(TAG, "device is null.")
-        }
-        return device
-    }
-
-    private fun toSchemeAndHost(url: String): String {
-        val i = url.indexOf("://") // http:// or https://
-        if (i == -1) {
-            return ""
-        }
-        val j = url.indexOf("/", i + 3)
-        return if (j == -1) {
-            ""
-        } else url.substring(0, j)
-    }
-
-    private fun toHost(url: String): String
-    {
-        val i = url.indexOf("://") // http:// or https://
-        if (i == -1) {
-            return ""
-        }
-        val j = url.indexOf(":", i + 3)
-        return if (j == -1) {
-            ""
-        } else url.substring(i + 3, j)
+        callback.onFinished()
     }
 
-    /**
-     * 検索結果のコールバック
-     *
-     */
     interface ISearchResultCallback
     {
-        fun onDeviceFound(cameraDevice: ISonyCamera) // デバイスが見つかった!
+        fun onDeviceFound(cameraDevice: IPixproCamera) // デバイスが見つかった!
         fun onFinished() // 通常の終了をしたとき
         fun onErrorFinished(reason: String?) // エラーが発生して応答したとき
     }
index 5374593..c2c48d9 100644 (file)
@@ -1,18 +1,15 @@
 package jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.liveview
 
-import android.content.Context
 import android.util.Log
 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ILiveViewController
+import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.IPixproCamera
 import java.lang.Exception
-import jp.osdn.gokigen.gokigenassets.liveview.image.CameraLiveViewListenerImpl
-import jp.osdn.gokigen.gokigenassets.scene.IInformationReceiver
+import jp.osdn.gokigen.gokigenassets.liveview.image.IImageDataReceiver
 import jp.osdn.gokigen.gokigenassets.utils.communication.SimpleLiveViewSlicer
 
-
-class PixproLiveViewControl(context: Context, private val informationReceiver: IInformationReceiver, camera_ip : String, liveview_port : Int) : ILiveViewController
+class PixproLiveViewControl(private val imageDataReceiver: IImageDataReceiver, pixproCamera: IPixproCamera) : ILiveViewController
 {
-    private val liveViewListener = CameraLiveViewListenerImpl(context, informationReceiver)
-    private val liveViewUrl: String = "http://$camera_ip:$liveview_port/"; // "http://172.16.0.254:9176";
+    private val liveViewUrl: String = "http://${pixproCamera.getIpAddress()}:${pixproCamera.getLiveViewPortNumber()}/" // "http://172.16.0.254:9176";
     private var whileFetching = false
 
     companion object
@@ -49,7 +46,6 @@ class PixproLiveViewControl(context: Context, private val informationReceiver: I
         Log.v(TAG, " stopLiveView()")
     }
 
-
     private fun start(streamUrl: String)
     {
         if (whileFetching)
@@ -90,7 +86,7 @@ class PixproLiveViewControl(context: Context, private val informationReceiver: I
                         //    mJpegQueue.remove();
                         //}
                         //mJpegQueue.add(payload.getJpegData());
-                        liveViewListener.onUpdateLiveView(payload.getJpegData() ?: ByteArray(0), null)
+                        imageDataReceiver.onUpdateLiveView(payload.getJpegData() ?: ByteArray(0), null)
                         continuousNullDataReceived = 0
                     }
                 }
index 84fa71d..785fd77 100644 (file)
@@ -1,5 +1,6 @@
 package jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.status
 
+import android.graphics.Color
 import android.util.Log
 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraStatusUpdateNotify
 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraStatus
@@ -8,7 +9,6 @@ import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.messag
 import jp.osdn.gokigen.gokigenassets.liveview.message.IMessageDrawer
 import java.lang.Exception
 
-
 class PixproStatusChecker : IPixproCommandCallback, ICameraStatusWatcher, ICameraStatus
 {
     private val statusHolder = PixproStatusHolder()
@@ -20,63 +20,81 @@ class PixproStatusChecker : IPixproCommandCallback, ICameraStatusWatcher, ICamer
         private val TAG = PixproStatusChecker::class.java.simpleName
     }
 
-    override fun getStatusList(key: String): List<String?> {
-        try {
-            return if (statusHolder == null) {
-                ArrayList()
-            } else statusHolder.getAvailableItemList(key)
-        } catch (e: Exception) {
+    override fun getStatusList(key: String): List<String?>
+    {
+        try
+        {
+            return (statusHolder.getAvailableItemList(key))
+        }
+        catch (e: Exception)
+        {
             e.printStackTrace()
         }
         return ArrayList()
     }
 
-    override fun getStatus(key: String): String {
-        try {
-            return if (statusHolder == null) {
-                ""
-            } else statusHolder.getItemStatus(key)
-        } catch (e: Exception) {
+    override fun getStatus(key: String): String
+    {
+        try
+        {
+            return (statusHolder.getItemStatus(key))
+        }
+        catch (e: Exception)
+        {
             e.printStackTrace()
         }
-        return ""
+        return ("")
     }
 
-    override fun getStatusColor(key: String): Int {
-        TODO("Not yet implemented")
+    override fun getStatusColor(key: String): Int
+    {
+        try
+        {
+            return (statusHolder.getItemStatusColor(key))
+        }
+        catch (e: Exception)
+        {
+            e.printStackTrace()
+        }
+        return (Color.WHITE)
     }
 
-    override fun setStatus(key: String, value: String) {
+    override fun setStatus(key: String, value: String)
+    {
         Log.v(TAG, "setStatus($key, $value)")
     }
 
-    fun startStatusWatch(notifier: ICameraStatusUpdateNotify) {
-        if (whileFetching) {
+    override fun startStatusWatch(
+        indicator: IMessageDrawer?,
+        notifier: ICameraStatusUpdateNotify?
+    )
+    {
+        if (whileFetching)
+        {
             Log.v(TAG, "startStatusWatch() already starting.")
             return
         }
-        try {
+        try
+        {
             this.notifier = notifier
             whileFetching = true
-        } catch (e: Exception) {
+        }
+        catch (e: Exception)
+        {
             e.printStackTrace()
         }
     }
 
-    override fun startStatusWatch(
-        indicator: IMessageDrawer?,
-        notifier: ICameraStatusUpdateNotify?
-    ) {
-        TODO("Not yet implemented")
-    }
-
-    override fun stopStatusWatch() {
+    override fun stopStatusWatch()
+    {
         Log.v(TAG, "stoptStatusWatch()")
         whileFetching = false
         notifier = null
     }
 
-    override fun receivedMessage(id: Int, rx_body: ByteArray?) {}
-
+    override fun receivedMessage(id: Int, rx_body: ByteArray?)
+    {
+        Log.v(TAG, " receivedMessage($id) : ${rx_body?.size} bytes.")
 
+    }
 }
index fbcdf13..ef54a30 100644 (file)
@@ -1,5 +1,6 @@
 package jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.status
 
+import android.graphics.Color
 import android.util.Log
 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraStatusUpdateNotify
 import androidx.collection.SparseArrayCompat
@@ -163,8 +164,13 @@ class PixproStatusHolder
         return selection
     }
 
-    fun getItemStatus(key: String): String {
-        var key = key
+    fun getItemStatusColor(key: String): Int
+    {
+        return (Color.WHITE)
+    }
+
+    fun getItemStatus(orgKey: String): String {
+        var key = orgKey
         try {
             val strIndex = key.indexOf("x")
             Log.v(TAG, "getItemStatus() : $key [$strIndex]")
index 313b570..eaca83e 100644 (file)
@@ -13,5 +13,6 @@ interface ICameraConnectionMethods
         const val PREFERENCE_CAMERA_METHOD_PENTAX = "RICOH"
         const val PREFERENCE_CAMERA_METHOD_PANASONIC = "PANASONIC"
         const val PREFERENCE_CAMERA_METHOD_SONY = "SONY"
+        const val PREFERENCE_CAMERA_METHOD_PIXPRO = "PIXPRO"
     }
 }
index 8337b90..e23183c 100644 (file)
@@ -30,6 +30,7 @@ interface ICameraConstantConvert
         const val ID_STRING_CONNECT_CAMERA_REJECTED = R.string.connect_camera_rejected
         const val ID_STRING_CONNECT_UNKNOWN_MESSAGE = R.string.connect_receive_unknown_message
 
+        const val ID_STRING_COMMAND_LINE_DISCONNECTED = R.string.command_line_disconnected
 
         const val ID_PREFERENCE_THETA_LIVEVIEW_RESOLUTION = IPreferencePropertyAccessor.THETA_LIVEVIEW_RESOLUTION
         const val ID_PREFERENCE_THETA_LIVEVIEW_RESOLUTION_DEFAULT_VALUE = IPreferencePropertyAccessor.THETA_LIVEVIEW_RESOLUTION_DEFAULT_VALUE
index a5496eb..3d6b8a1 100644 (file)
@@ -9,7 +9,6 @@ import android.os.VibrationEffect
 import android.os.Vibrator
 import android.util.Log
 import android.view.KeyEvent
-import android.view.Surface
 import android.view.WindowManager
 import android.widget.ImageButton
 import android.widget.Toast
@@ -25,7 +24,6 @@ import jp.osdn.gokigen.mangle.preference.PreferenceValueInitializer
 import jp.osdn.gokigen.mangle.scene.MainButtonHandler
 import jp.osdn.gokigen.mangle.scene.SceneChanger
 
-
 class MainActivity : AppCompatActivity(), IVibrator, ICameraStatusReceiver
 {
     private lateinit var mainButtonHandler : MainButtonHandler// = MainButtonHandler(this)
@@ -286,6 +284,7 @@ class MainActivity : AppCompatActivity(), IVibrator, ICameraStatusReceiver
             Manifest.permission.INTERNET,
             Manifest.permission.ACCESS_NETWORK_STATE,
             Manifest.permission.ACCESS_WIFI_STATE,
+            Manifest.permission.CHANGE_WIFI_MULTICAST_STATE,
         )
     }
 }
diff --git a/app/src/main/java/jp/osdn/gokigen/mangle/preference/SelectCameraConnectionMethodDialog.kt b/app/src/main/java/jp/osdn/gokigen/mangle/preference/SelectCameraConnectionMethodDialog.kt
deleted file mode 100644 (file)
index 8327418..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-package jp.osdn.gokigen.mangle.preference
-
-import androidx.fragment.app.DialogFragment
-
-class SelectCameraConnectionMethodDialog() : DialogFragment()
-{
-
-
-
-}
\ No newline at end of file
index af3dfff..3fa13b3 100644 (file)
@@ -10,6 +10,7 @@ import jp.osdn.gokigen.gokigenassets.camera.console.ConsolePanelControl
 import jp.osdn.gokigen.gokigenassets.camera.example.ExamplePictureControl
 import jp.osdn.gokigen.gokigenassets.camera.interfaces.*
 import jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.wrapper.PanasonicCameraControl
+import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.PixproCameraControl
 import jp.osdn.gokigen.gokigenassets.camera.vendor.ricohpentax.RicohPentaxCameraControl
 import jp.osdn.gokigen.gokigenassets.camera.vendor.sony.SonyCameraControl
 import jp.osdn.gokigen.gokigenassets.camera.vendor.theta.ThetaCameraControl
@@ -19,6 +20,7 @@ import jp.osdn.gokigen.gokigenassets.constants.ICameraConnectionMethods.Companio
 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_PIXPRO
 import jp.osdn.gokigen.gokigenassets.constants.ICameraConnectionMethods.Companion.PREFERENCE_CAMERA_METHOD_SONY
 import jp.osdn.gokigen.gokigenassets.constants.ICameraConnectionMethods.Companion.PREFERENCE_CAMERA_METHOD_THETA
 import jp.osdn.gokigen.gokigenassets.preference.PreferenceAccessWrapper
@@ -115,6 +117,7 @@ class CameraProvider(private val activity: AppCompatActivity, private val inform
                 PREFERENCE_CAMERA_METHOD_PENTAX -> preparePentaxCameraControl(cameraPreference)
                 PREFERENCE_CAMERA_METHOD_PANASONIC -> preparePanasonicCameraControl(cameraPreference)
                 PREFERENCE_CAMERA_METHOD_SONY -> prepareSonyCameraControl(cameraPreference)
+                PREFERENCE_CAMERA_METHOD_PIXPRO -> preparePixproCameraControl(cameraPreference)
                 else -> DummyCameraControl()
             })
         }
@@ -230,6 +233,11 @@ class CameraProvider(private val activity: AppCompatActivity, private val inform
         return (SonyCameraControl(activity, vibrator, informationNotify, cameraPreference, statusReceiver))
     }
 
+    private fun preparePixproCameraControl(cameraPreference : ICameraPreferenceProvider) : ICameraControl
+    {
+        return (PixproCameraControl(activity, vibrator, informationNotify, cameraPreference, statusReceiver))
+    }
+
     private fun prepareConsolePanelControl(cameraPreference : ICameraPreferenceProvider) : ICameraControl
     {
         return (ConsolePanelControl(activity, vibrator, informationNotify, cameraPreference))
index 45958ce..2ac3025 100644 (file)
         <item>内蔵カメラ</item>
         <item>Ricoh GR / PENTAX</item>
         <item>Ricoh Theta(OSC)</item>
-        <item>Panasonic (MFT)</item>
+        <item>Panasonic</item>
         <item>Sony</item>
+        <item>PIXPRO WPZ2</item>
 <!--
         <item>OPC(Olympus Air)</item>
         <item>Olympus(OM-D/PEN)</item>
-        <item>KODAK PIXPRO</item>
         <item>Fuji X Series</item>
         <item>Canon</item>
         <item>Nikon</item>
         <item>THETA</item>
         <item>PANASONIC</item>
         <item>SONY</item>
+        <item>PIXPRO</item>
 <!--
         <item>OPC</item>
         <item>OLYMPUS</item>
-        <item>PIXPRO</item>
         <item>FUJI_X</item>
         <item>CANON</item>
         <item>NIKON</item>
index 5b3c40a..bf0d383 100644 (file)
     <string name="dialog_message_power_off">カメラの電源を切り、アプリケーションを終了します。</string>
     <string name="dialog_message_exit">アプリケーションを終了します。</string>
 
+    <string name="command_line_disconnected">カメラ制御用の回線が切断されました。</string>
 </resources>
index ed3a8c9..8fbf83c 100644 (file)
         <item>Internal Camera</item>
         <item>Ricoh GR / PENTAX</item>
         <item>Ricoh Theta(OSC)</item>
-        <item>Panasonic (MFT)</item>
+        <item>Panasonic</item>
         <item>Sony</item>
-
+        <item>PIXPRO WPZ2</item>
         <!--
                 <item>OPC(Olympus Air)</item>
                 <item>Olympus(OM-D/PEN)</item>
-                <item>KODAK PIXPRO</item>
                 <item>Fuji X Series</item>
                 <item>Canon</item>
                 <item>Nikon</item>
         <item>THETA</item>
         <item>PANASONIC</item>
         <item>SONY</item>
-
+        <item>PIXPRO</item>
         <!--
                 <item>OPC</item>
                 <item>OLYMPUS</item>
-                <item>PIXPRO</item>
                 <item>FUJI_X</item>
                 <item>CANON</item>
                 <item>NIKON</item>
index 1530834..2181462 100644 (file)
     <string name="dialog_title_confirmation">Confirmation</string>
     <string name="dialog_message_power_off">Power Off</string>
     <string name="dialog_message_exit">Exit Application</string>
+
+    <string name="command_line_disconnected">Camera control line is disconnected.</string>
 </resources>
\ No newline at end of file