From: MRSa Date: Sat, 28 Aug 2021 13:18:09 +0000 (+0900) Subject: PIXPRO WPZ2用制御コードのマージ。(状態表示は行っていないが、撮影できるところまで。) X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=364b62bc4b31461bd72a398bc9a31c5fdabc8087;p=gokigen%2Fmangle.git PIXPRO WPZ2用制御コードのマージ。(状態表示は行っていないが、撮影できるところまで。) --- diff --git a/.idea/dictionaries/MRSa.xml b/.idea/dictionaries/MRSa.xml index fa7658b..3db6b5e 100644 --- a/.idea/dictionaries/MRSa.xml +++ b/.idea/dictionaries/MRSa.xml @@ -3,11 +3,13 @@ acclock batt + displayer equirectangular liveview mpget mpset pixpro + recmode ricoh diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index fe8d4ec..6eb2215 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,6 +10,7 @@ + { doShutter() } + else -> { } + } + } - override fun getStatusList(key: String): List { return (ArrayList()) } - 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) } } diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/operation/FocusControl.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/operation/FocusControl.kt index 07819bd..590e860 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/operation/FocusControl.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/operation/FocusControl.kt @@ -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 index 0000000..b643875 --- /dev/null +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/IPixproCameraInitializer.kt @@ -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) +} diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/PixproCamera.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/PixproCamera.kt index 6f538f1..2c88160 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/PixproCamera.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/PixproCamera.kt @@ -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 index 0000000..b4440d6 --- /dev/null +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/IPixproCommunicationNotify.kt @@ -0,0 +1,7 @@ +package jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command + +interface IPixproCommunicationNotify +{ + fun readyToCommunicate() + fun detectDisconnect() +} diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/PixproCommandCommunicator.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/PixproCommandCommunicator.kt index 80569f2..f23099a 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/PixproCommandCommunicator.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/PixproCommandCommunicator.kt @@ -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() - } } diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproExecuteFocus.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproExecuteFocus.kt index 29da4dc..26396c9 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproExecuteFocus.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/command/messages/specific/PixproExecuteFocus.kt @@ -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 diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproCameraConnectSequence.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproCameraConnectSequence.kt index a963ad3..0a7a571 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproCameraConnectSequence.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproCameraConnectSequence.kt @@ -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) + } } diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproConnection.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproCameraConnection.kt similarity index 95% rename from app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproConnection.kt rename to app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproCameraConnection.kt index d75c4b9..38f034e 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproConnection.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproCameraConnection.kt @@ -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 } } + } diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproCameraDisconnectSequence.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproCameraDisconnectSequence.kt index 38f72df..64affa9 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproCameraDisconnectSequence.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproCameraDisconnectSequence.kt @@ -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 diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproConnectionClient.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproConnectionClient.kt index 2a9fd2d..c09696e 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproConnectionClient.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/connection/PixproConnectionClient.kt @@ -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 = 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?) // エラーが発生して応答したとき } diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/liveview/PixproLiveViewControl.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/liveview/PixproLiveViewControl.kt index 5374593..c2c48d9 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/liveview/PixproLiveViewControl.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/liveview/PixproLiveViewControl.kt @@ -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 } } diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/status/PixproStatusChecker.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/status/PixproStatusChecker.kt index 84fa71d..785fd77 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/status/PixproStatusChecker.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/status/PixproStatusChecker.kt @@ -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 { - try { - return if (statusHolder == null) { - ArrayList() - } else statusHolder.getAvailableItemList(key) - } catch (e: Exception) { + override fun getStatusList(key: String): List + { + 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.") + } } diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/status/PixproStatusHolder.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/status/PixproStatusHolder.kt index fbcdf13..ef54a30 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/status/PixproStatusHolder.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/camera/vendor/pixpro/wrapper/status/PixproStatusHolder.kt @@ -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]") diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/constants/ICameraConnectionMethods.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/constants/ICameraConnectionMethods.kt index 313b570..eaca83e 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/constants/ICameraConnectionMethods.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/constants/ICameraConnectionMethods.kt @@ -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" } } diff --git a/app/src/main/java/jp/osdn/gokigen/gokigenassets/constants/ICameraConstantConvert.kt b/app/src/main/java/jp/osdn/gokigen/gokigenassets/constants/ICameraConstantConvert.kt index 8337b90..e23183c 100644 --- a/app/src/main/java/jp/osdn/gokigen/gokigenassets/constants/ICameraConstantConvert.kt +++ b/app/src/main/java/jp/osdn/gokigen/gokigenassets/constants/ICameraConstantConvert.kt @@ -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 diff --git a/app/src/main/java/jp/osdn/gokigen/mangle/MainActivity.kt b/app/src/main/java/jp/osdn/gokigen/mangle/MainActivity.kt index a5496eb..3d6b8a1 100644 --- a/app/src/main/java/jp/osdn/gokigen/mangle/MainActivity.kt +++ b/app/src/main/java/jp/osdn/gokigen/mangle/MainActivity.kt @@ -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 index 8327418..0000000 --- a/app/src/main/java/jp/osdn/gokigen/mangle/preference/SelectCameraConnectionMethodDialog.kt +++ /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 diff --git a/app/src/main/java/jp/osdn/gokigen/mangle/scene/CameraProvider.kt b/app/src/main/java/jp/osdn/gokigen/mangle/scene/CameraProvider.kt index af3dfff..3fa13b3 100644 --- a/app/src/main/java/jp/osdn/gokigen/mangle/scene/CameraProvider.kt +++ b/app/src/main/java/jp/osdn/gokigen/mangle/scene/CameraProvider.kt @@ -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)) diff --git a/app/src/main/res/values-ja/arrays.xml b/app/src/main/res/values-ja/arrays.xml index 45958ce..2ac3025 100644 --- a/app/src/main/res/values-ja/arrays.xml +++ b/app/src/main/res/values-ja/arrays.xml @@ -21,12 +21,12 @@ 内蔵カメラ Ricoh GR / PENTAX Ricoh Theta(OSC) - Panasonic (MFT) + Panasonic Sony + PIXPRO WPZ2