OSDN Git Service

接続シーケンスでちょっと省略系の接続もできるようにした。
authorMRSa <mrsa@myad.jp>
Sat, 15 Jun 2019 14:35:00 +0000 (23:35 +0900)
committerMRSa <mrsa@myad.jp>
Sat, 15 Jun 2019 14:35:00 +0000 (23:35 +0900)
app/build.gradle
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/messages/StartMessage2ndRead.java [new file with mode: 0644]
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/connection/FujiXCameraConnectSequence.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/connection/FujiXCameraConnectSequenceForRead.java [new file with mode: 0644]
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/connection/FujiXConnection.java
app/src/main/java/net/osdn/gokigen/a01d/preference/IPreferencePropertyAccessor.java
app/src/main/java/net/osdn/gokigen/a01d/preference/fujix/FujiXPreferenceFragment.java
app/src/main/res/values-ja/strings.xml
app/src/main/res/values/strings.xml
app/src/main/res/xml/preferences_fuji_x.xml

index 6646d02..141c95e 100644 (file)
@@ -7,8 +7,8 @@ android {
         applicationId "net.osdn.gokigen.a01d"
         minSdkVersion 14
         targetSdkVersion 28
-        versionCode 10302
-        versionName "1.3.2"
+        versionCode 10303
+        versionName "1.3.3"
     }
     buildTypes {
         release {
diff --git a/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/messages/StartMessage2ndRead.java b/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/messages/StartMessage2ndRead.java
new file mode 100644 (file)
index 0000000..a6085d1
--- /dev/null
@@ -0,0 +1,47 @@
+package net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages;
+
+import androidx.annotation.NonNull;
+
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.IFujiXCommandCallback;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.connection.FujiXCameraConnectSequence;
+
+public class StartMessage2ndRead extends FujiXCommandBase
+{
+    private final IFujiXCommandCallback callback;
+
+    public StartMessage2ndRead(@NonNull IFujiXCommandCallback callback)
+    {
+        this.callback = callback;
+    }
+
+    @Override
+    public IFujiXCommandCallback responseCallback()
+    {
+        return (callback);
+    }
+
+    @Override
+    public int getId()
+    {
+        return (FujiXCameraConnectSequence.SEQ_START_2ND_READ);
+    }
+
+    @Override
+    public byte[] commandBody()
+    {
+        return (new byte[] {
+
+                // message_header.index : uint16 (0: terminate, 2: two_part_message, 1: other)
+                (byte)0x01, (byte)0x00,
+
+                // message_header.type : single_part (0x1015) : 0xd212 (status_request)
+                (byte)0x15, (byte)0x10,
+
+                // sequence number
+                (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+
+                // data ...
+                (byte)0x12, (byte)0xd2, (byte)0x00, (byte)0x00,
+        });
+    }
+}
index 1d8447f..6a2d387 100644 (file)
@@ -32,6 +32,7 @@ public class FujiXCameraConnectSequence implements Runnable, IFujiXCommandCallba
     public static final int SEQ_REGISTRATION = 1;
     public static final int SEQ_START = 2;
     public static final int SEQ_START_2ND = 3;
+    public static final int SEQ_START_2ND_READ = 10;
     public static final int SEQ_START_2ND_RECEIVE = 4;
     public static final int SEQ_START_3RD = 5;
     public static final int SEQ_START_4TH = 6;
diff --git a/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/connection/FujiXCameraConnectSequenceForRead.java b/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/connection/FujiXCameraConnectSequenceForRead.java
new file mode 100644 (file)
index 0000000..59f4cbb
--- /dev/null
@@ -0,0 +1,242 @@
+package net.osdn.gokigen.a01d.camera.fujix.wrapper.connection;
+
+import android.app.Activity;
+import android.content.SharedPreferences;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.preference.PreferenceManager;
+
+import net.osdn.gokigen.a01d.R;
+import net.osdn.gokigen.a01d.camera.ICameraConnection;
+import net.osdn.gokigen.a01d.camera.ICameraStatusReceiver;
+import net.osdn.gokigen.a01d.camera.fujix.IFujiXInterfaceProvider;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.IFujiXCommandCallback;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.IFujiXCommandPublisher;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.CameraRemoteMessage;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.QueryCameraCapabilities;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.RegistrationMessage;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.StartMessage;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.StartMessage2nd;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.StartMessage2ndRead;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.StartMessage3rd;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.StartMessage4th;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.StartMessage5th;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.StatusRequestMessage;
+import net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor;
+
+import static net.osdn.gokigen.a01d.camera.fujix.wrapper.connection.FujiXCameraConnectSequence.SEQ_CAMERA_REMOTE;
+import static net.osdn.gokigen.a01d.camera.fujix.wrapper.connection.FujiXCameraConnectSequence.SEQ_QUERY_CAMERA_CAPABILITIES;
+import static net.osdn.gokigen.a01d.camera.fujix.wrapper.connection.FujiXCameraConnectSequence.SEQ_REGISTRATION;
+import static net.osdn.gokigen.a01d.camera.fujix.wrapper.connection.FujiXCameraConnectSequence.SEQ_START;
+import static net.osdn.gokigen.a01d.camera.fujix.wrapper.connection.FujiXCameraConnectSequence.SEQ_START_2ND;
+import static net.osdn.gokigen.a01d.camera.fujix.wrapper.connection.FujiXCameraConnectSequence.SEQ_START_2ND_READ;
+import static net.osdn.gokigen.a01d.camera.fujix.wrapper.connection.FujiXCameraConnectSequence.SEQ_START_2ND_RECEIVE;
+import static net.osdn.gokigen.a01d.camera.fujix.wrapper.connection.FujiXCameraConnectSequence.SEQ_START_3RD;
+import static net.osdn.gokigen.a01d.camera.fujix.wrapper.connection.FujiXCameraConnectSequence.SEQ_START_4TH;
+import static net.osdn.gokigen.a01d.camera.fujix.wrapper.connection.FujiXCameraConnectSequence.SEQ_START_5TH;
+import static net.osdn.gokigen.a01d.camera.fujix.wrapper.connection.FujiXCameraConnectSequence.SEQ_STATUS_REQUEST;
+
+public class FujiXCameraConnectSequenceForRead implements Runnable, IFujiXCommandCallback
+{
+    private final String TAG = this.toString();
+
+    private final Activity context;
+    private final ICameraConnection cameraConnection;
+    private final ICameraStatusReceiver cameraStatusReceiver;
+    private final IFujiXInterfaceProvider interfaceProvider;
+    private final IFujiXCommandPublisher commandIssuer;
+    private boolean isBothLiveView = false;
+
+    FujiXCameraConnectSequenceForRead(@NonNull Activity context, @NonNull ICameraStatusReceiver statusReceiver, @NonNull final ICameraConnection cameraConnection, @NonNull IFujiXInterfaceProvider interfaceProvider)
+    {
+        Log.v(TAG, " FujiXCameraConnectSequenceForRead");
+        this.context = context;
+        this.cameraConnection = cameraConnection;
+        this.cameraStatusReceiver = statusReceiver;
+        this.interfaceProvider = interfaceProvider;
+        this.commandIssuer = interfaceProvider.getCommandPublisher();
+    }
+
+    @Override
+    public void run()
+    {
+        try
+        {
+            try
+            {
+                SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
+                isBothLiveView = preferences.getBoolean(IPreferencePropertyAccessor.FUJIX_DISPLAY_CAMERA_VIEW, false);
+            }
+            catch (Exception e)
+            {
+                //isBothLiveView = false;
+                e.printStackTrace();
+            }
+
+            // カメラとTCP接続
+            IFujiXCommandPublisher issuer = interfaceProvider.getCommandPublisher();
+            if (!issuer.isConnected())
+            {
+                if (!interfaceProvider.getCommandCommunication().connect())
+                {
+                    // 接続失敗...
+                    onConnectError(context.getString(R.string.dialog_title_connect_failed));
+                    return;
+                }
+            }
+            // コマンドタスクの実行開始
+            issuer.start();
+
+            // 接続シーケンスの開始
+            sendRegistrationMessage();
+
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+            onConnectError(e.getLocalizedMessage());
+        }
+    }
+
+    private void onConnectError(String reason)
+    {
+        cameraConnection.alertConnectingFailed(reason);
+    }
+
+    @Override
+    public void receivedMessage(int id, byte[] rx_body)
+    {
+        //Log.v(TAG, "receivedMessage : " + id + "[" + rx_body.length + " bytes]");
+        //int bodyLength = 0;
+        switch (id)
+        {
+            case SEQ_REGISTRATION:
+                if (checkRegistrationMessage(rx_body))
+                {
+                    commandIssuer.enqueueCommand(new StartMessage(this));
+                }
+                break;
+
+            case SEQ_START:
+                commandIssuer.enqueueCommand(new StartMessage2ndRead(this));
+                break;
+
+            case SEQ_START_2ND_READ:
+                cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting));
+                if (rx_body.length == (int)rx_body[0])
+                {
+                    // なぜかもうちょっとデータが飛んでくるので待つ
+                    //commandIssuer.enqueueCommand(new ReceiveOnly(this));
+
+                    commandIssuer.enqueueCommand(new StartMessage3rd(this));
+                }
+                else
+                {
+                    commandIssuer.enqueueCommand(new StartMessage3rd(this));
+                }
+                break;
+
+            case SEQ_START_2ND_RECEIVE:
+                commandIssuer.enqueueCommand(new StartMessage3rd(this));
+                break;
+
+            case SEQ_START_3RD:
+                commandIssuer.enqueueCommand(new StartMessage4th(this));
+                break;
+
+            case SEQ_START_4TH:
+                if (isBothLiveView)
+                {
+                    // カメラのLCDと遠隔のライブビューを同時に表示する場合...
+                    commandIssuer.enqueueCommand(new CameraRemoteMessage(this));
+                }
+                else
+                {
+                    commandIssuer.enqueueCommand(new StartMessage5th(this));
+                }
+                break;
+            case SEQ_START_5TH:
+                commandIssuer.enqueueCommand(new StatusRequestMessage(this));
+                break;
+
+            case SEQ_STATUS_REQUEST:
+                commandIssuer.enqueueCommand(new QueryCameraCapabilities(this));
+                break;
+
+            case SEQ_QUERY_CAMERA_CAPABILITIES:
+                commandIssuer.enqueueCommand(new CameraRemoteMessage(this));
+                break;
+
+            case SEQ_CAMERA_REMOTE:
+                connectFinished();
+                break;
+
+            default:
+                Log.v(TAG, "RECEIVED UNKNOWN ID : " + id);
+                onConnectError(context.getString(R.string.connect_receive_unknown_message));
+                break;
+        }
+    }
+
+    private void sendRegistrationMessage()
+    {
+        cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_start));
+        commandIssuer.enqueueCommand(new RegistrationMessage(this));
+    }
+
+    private boolean checkRegistrationMessage(byte[] receiveData)
+    {
+        // 応答エラーかどうかをチェックする
+        if (receiveData.length == 8)
+        {
+            if ((receiveData[0] == 0x05) && (receiveData[1] == 0x00) && (receiveData[2] == 0x00) && (receiveData[3] == 0x00) &&
+                    (receiveData[4] == 0x19) && (receiveData[5] == 0x20) && (receiveData[6] == 0x00) && (receiveData[7] == 0x00)) {
+                // 応答エラー...
+                return (false);
+            }
+            return (false);
+        }
+        return (true);
+    }
+
+
+    private void connectFinished()
+    {
+        try
+        {
+            // ちょっと待つ
+            Thread.sleep(1000);
+            interfaceProvider.getAsyncEventCommunication().connect();
+            //interfaceProvider.getStatusWatcher().startStatusWatch(interfaceProvider.getStatusListener());  ステータスの定期確認は実施しない
+            onConnectNotify();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    private void onConnectNotify()
+    {
+        try
+        {
+            final Thread thread = new Thread(new Runnable()
+            {
+                @Override
+                public void run()
+                {
+                    // カメラとの接続確立を通知する
+                    cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connected));
+                    cameraStatusReceiver.onCameraConnected();
+                    Log.v(TAG, "onConnectNotify()");
+                }
+            });
+            thread.start();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+}
index d3c7e4c..0805107 100644 (file)
@@ -6,6 +6,7 @@ import android.content.Context;
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.content.SharedPreferences;
 import android.net.ConnectivityManager;
 import android.net.wifi.WifiInfo;
 import android.net.wifi.WifiManager;
@@ -14,11 +15,13 @@ import android.util.Log;
 
 import androidx.annotation.NonNull;
 import androidx.appcompat.app.AlertDialog;
+import androidx.preference.PreferenceManager;
 
 import net.osdn.gokigen.a01d.R;
 import net.osdn.gokigen.a01d.camera.ICameraConnection;
 import net.osdn.gokigen.a01d.camera.ICameraStatusReceiver;
 import net.osdn.gokigen.a01d.camera.fujix.IFujiXInterfaceProvider;
+import net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor;
 
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
@@ -217,8 +220,18 @@ public class FujiXConnection implements ICameraConnection
         connectionStatus = CameraConnectionStatus.CONNECTING;
         try
         {
+            boolean isReadOnly = false;
             interfaceProvider.getCommandPublisher();
-            cameraExecutor.execute(new FujiXCameraConnectSequence(context, statusReceiver, this, interfaceProvider));
+            try
+            {
+                SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
+                isReadOnly = preferences.getBoolean(IPreferencePropertyAccessor.FUJIX_CONNECTION_FOR_READ, false);
+            }
+            catch (Exception e)
+            {
+                e.printStackTrace();
+            }
+            cameraExecutor.execute((!isReadOnly)? new FujiXCameraConnectSequence(context, statusReceiver, this, interfaceProvider) : new FujiXCameraConnectSequenceForRead(context, statusReceiver, this, interfaceProvider));
         }
         catch (Exception e)
         {
index 1598035..204924b 100644 (file)
@@ -61,6 +61,8 @@ public interface IPreferencePropertyAccessor
     String FUJIX_COMMAND_POLLING_WAIT = "fujix_command_polling_wait";
     String FUJIX_COMMAND_POLLING_WAIT_DEFAULT_VALUE = "500";
 
+    String FUJIX_CONNECTION_FOR_READ = "fujix_connection_for_read";
+
     /*
     int CHOICE_SPLASH_SCREEN = 10;
 
index 45b44b7..e67a6ee 100644 (file)
@@ -129,6 +129,9 @@ public class FujiXPreferenceFragment  extends PreferenceFragmentCompat implement
             if (!items.containsKey(IPreferencePropertyAccessor.CONNECTION_METHOD)) {
                 editor.putString(IPreferencePropertyAccessor.CONNECTION_METHOD, IPreferencePropertyAccessor.CONNECTION_METHOD_DEFAULT_VALUE);
             }
+            if (!items.containsKey(IPreferencePropertyAccessor.FUJIX_CONNECTION_FOR_READ)) {
+                editor.putBoolean(IPreferencePropertyAccessor.FUJIX_CONNECTION_FOR_READ, false);
+            }
             editor.apply();
         }
         catch (Exception e)
@@ -165,6 +168,11 @@ public class FujiXPreferenceFragment  extends PreferenceFragmentCompat implement
                     Log.v(TAG, " " + key + " , " + value);
                     break;
 
+                case IPreferencePropertyAccessor.FUJIX_CONNECTION_FOR_READ:
+                    value = preferences.getBoolean(key, false);
+                    Log.v(TAG, " " + key + " , " + value);
+                    break;
+
                 default:
                     String strValue = preferences.getString(key, "");
                     setListPreference(key, key, strValue);
@@ -318,6 +326,7 @@ public class FujiXPreferenceFragment  extends PreferenceFragmentCompat implement
                         setBooleanPreference(IPreferencePropertyAccessor.AUTO_CONNECT_TO_CAMERA, IPreferencePropertyAccessor.AUTO_CONNECT_TO_CAMERA, true);
                         setBooleanPreference(IPreferencePropertyAccessor.CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW, IPreferencePropertyAccessor.CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW, true);
                         setBooleanPreference(IPreferencePropertyAccessor.FUJIX_DISPLAY_CAMERA_VIEW, IPreferencePropertyAccessor.FUJIX_DISPLAY_CAMERA_VIEW, false);
+                        setBooleanPreference(IPreferencePropertyAccessor.FUJIX_CONNECTION_FOR_READ, IPreferencePropertyAccessor.FUJIX_CONNECTION_FOR_READ, false);
                     }
                     catch (Exception e)
                     {
index 6c0a1bc..39e9746 100644 (file)
@@ -36,6 +36,8 @@
     <string name="pref_summary_fujix_liveview_wait">ライブビュー画像受信間隔を指定します</string>
     <string name="pref_fujix_command_polling_wait">コマンド間隔(default: 500)</string>
     <string name="pref_summary_fujix_command_polling_wait">カメラ状態の確認間隔を調整します</string>
+    <string name="pref_fujix_connection_for_read">画像転送用の接続シーケンス</string>
+    <string name="pref_fujix_connection_for_read_summary">テスト用です</string>
 
 
     <string name="pref_cat_initialize">起動時設定</string>
index c9b71c1..a366977 100644 (file)
@@ -37,6 +37,8 @@
     <string name="pref_summary_fujix_liveview_wait"> </string>
     <string name="pref_fujix_command_polling_wait">Status polling wait (default: 500)</string>
     <string name="pref_summary_fujix_command_polling_wait"> </string>
+    <string name="pref_fujix_connection_for_read">Connect for transfer connection mode.</string>
+    <string name="pref_fujix_connection_for_read_summary">Test: for picture transfer connection.</string>
 
     <string name="pref_cat_initialize">App. Startup</string>
     <string name="pref_auto_connect_camera">Auto Connect To Camera</string>
index e7da835..bc8ce82 100644 (file)
             android:key="capture_both_camera_and_live_view"
             android:title="@string/pref_capture_both_camera_and_live_view" />
 
+        <CheckBoxPreference
+            android:key="fujix_connection_for_read"
+            android:title="@string/pref_fujix_connection_for_read"
+            android:summary="@string/pref_fujix_connection_for_read_summary"/>
+
+
     </PreferenceCategory>