<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>
<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"
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
fun getIPixproCommunication() : IPixproCommunication
fun getIPixproCommandPublisher() : IPixproCommandPublisher
fun getInformationReceiver() : IInformationReceiver
-
-}
\ No newline at end of file
+ fun getIPixproCameraInitializer() : IPixproCameraInitializer
+ fun getIPixproCamera() : IPixproCamera
+ fun getIPixproCommunicationNotify() : IPixproCommunicationNotify
+}
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)
}
}
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
{
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) {
--- /dev/null
+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)
+}
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
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
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)
--- /dev/null
+package jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command
+
+interface IPixproCommunicationNotify
+{
+ fun readyToCommunicate()
+ fun detectDisconnect()
+}
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
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)
if (isDumpReceiveLog && body != null)
{
// ログに受信メッセージを出力する
- SimpleLogDumper.dumpBytes("RECV[" + body.size + "] ", body)
+ SimpleLogDumper.dumpBytes("RX[" + body.size + "] ", body)
}
if (checkReceiveStatusMessage(body))
{
}
return (readBytes)
}
-
- interface ICommunicationNotify
- {
- fun detectDisconnect()
- }
}
override fun getId() : Int
{
- return (IPixproMessages.SEQ_SHUTTER)
+ return (IPixproMessages.SEQ_FOCUS)
}
override fun commandBody(): ByteArray
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
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"
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接続
// 接続失敗...
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
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?: "")
}
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))
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))
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.")
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))
}
{
// 接続成功のメッセージを出す
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)
// 接続成功!のメッセージを出す
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)
val thread = Thread { // カメラとの接続確立を通知する
cameraStatusReceiver.onStatusNotify(context.getString(ICameraConstantConvert.ID_STRING_CONNECT_CONNECTED))
cameraStatusReceiver.onCameraConnected()
+ interfaceProvider.getIPixproCommunicationNotify().readyToCommunicate()
Log.v(TAG, " onConnectNotify()")
}
thread.start()
}
}
+ 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)
+ }
}
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)
}
}
+
}
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
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
/*
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)
{
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?) // エラーが発生して応答したとき
}
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
Log.v(TAG, " stopLiveView()")
}
-
private fun start(streamUrl: String)
{
if (whileFetching)
// mJpegQueue.remove();
//}
//mJpegQueue.add(payload.getJpegData());
- liveViewListener.onUpdateLiveView(payload.getJpegData() ?: ByteArray(0), null)
+ imageDataReceiver.onUpdateLiveView(payload.getJpegData() ?: ByteArray(0), null)
continuousNullDataReceived = 0
}
}
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
import jp.osdn.gokigen.gokigenassets.liveview.message.IMessageDrawer
import java.lang.Exception
-
class PixproStatusChecker : IPixproCommandCallback, ICameraStatusWatcher, ICameraStatus
{
private val statusHolder = PixproStatusHolder()
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.")
+ }
}
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
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]")
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"
}
}
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
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
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)
Manifest.permission.INTERNET,
Manifest.permission.ACCESS_NETWORK_STATE,
Manifest.permission.ACCESS_WIFI_STATE,
+ Manifest.permission.CHANGE_WIFI_MULTICAST_STATE,
)
}
}
+++ /dev/null
-package jp.osdn.gokigen.mangle.preference
-
-import androidx.fragment.app.DialogFragment
-
-class SelectCameraConnectionMethodDialog() : DialogFragment()
-{
-
-
-
-}
\ No newline at end of file
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
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
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()
})
}
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))
<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>
<string name="dialog_message_power_off">カメラの電源を切り、アプリケーションを終了します。</string>
<string name="dialog_message_exit">アプリケーションを終了します。</string>
+ <string name="command_line_disconnected">カメラ制御用の回線が切断されました。</string>
</resources>
<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>
<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