OSDN Git Service

接続シーケンスの改良で、LV同時出力も実施してみた。
authorMRSa <mrsa@myad.jp>
Tue, 21 May 2019 15:39:13 +0000 (00:39 +0900)
committerMRSa <mrsa@myad.jp>
Tue, 21 May 2019 15:39:13 +0000 (00:39 +0900)
app/src/main/java/net/osdn/gokigen/cameratest/camtest/CamTest.java
app/src/main/java/net/osdn/gokigen/cameratest/fuji/Connection.java
app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/FujiPreferenceFragment.java
app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/IPreferencePropertyAccessor.java
app/src/main/java/net/osdn/gokigen/cameratest/fuji/statuses/FujiStatusChecker.java
app/src/main/res/values/strings.xml
app/src/main/res/xml/preferences_fuji_x.xml

index 6b28353..ebd44f8 100644 (file)
@@ -1,6 +1,7 @@
 package net.osdn.gokigen.cameratest.camtest;
 
 import android.app.Activity;
+import android.content.SharedPreferences;
 import android.graphics.Bitmap;
 import android.graphics.BitmapFactory;
 import android.graphics.PointF;
@@ -17,10 +18,12 @@ import net.osdn.gokigen.cameratest.fuji.Connection;
 import net.osdn.gokigen.cameratest.fuji.preference.FujiPreferenceFragment;
 import net.osdn.gokigen.cameratest.fuji.ILiveViewImage;
 import net.osdn.gokigen.cameratest.fuji.ReceivedDataHolder;
+import net.osdn.gokigen.cameratest.fuji.preference.IPreferencePropertyAccessor;
 import net.osdn.gokigen.cameratest.fuji.statuses.IFujiStatus;
 import net.osdn.gokigen.cameratest.fuji.statuses.IFujiStatusNotify;
 
 import androidx.annotation.NonNull;
+import androidx.preference.PreferenceManager;
 
 public class CamTest implements View.OnClickListener, View.OnTouchListener, ILiveViewImage, IFujiStatusNotify
 {
@@ -53,14 +56,17 @@ public class CamTest implements View.OnClickListener, View.OnTouchListener, ILiv
             //prepareFile();
             Snackbar.make(activity.findViewById(R.id.constraintLayout), R.string.connect, Snackbar.LENGTH_SHORT).show();
 
+            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(activity);
+            final boolean isBothLiveView = preferences.getBoolean(IPreferencePropertyAccessor.FUJIX_DISPLAY_CAMERA_VIEW, false);
+
             showMessageText("START CONNECT");
             Thread thread = new Thread(new Runnable() {
                 @Override
                 public void run() {
-                    boolean ret = connection.start_connect();
+                    boolean ret = connection.start_connect(isBothLiveView);
                     if (!ret)
                     {
-                        showMessageText("CONNECT FAILURE...");
+                        showMessageText("CONNECT FAILURE... : " + isBothLiveView);
                     }
                 }
             });
index e202b8f..b0122f7 100644 (file)
@@ -23,11 +23,11 @@ public class Connection implements IFujiStatusRequest
         this.statusChecker = new FujiStatusChecker(this, notify);
     }
 
-    public boolean start_connect()
+    public boolean start_connect(boolean isBothLiveView)
     {
         boolean ret = false;
 
-        if (connect_to_camera())
+        if (connect_to_camera(isBothLiveView))
         {
             ret = requestStatus();
             if (ret)
@@ -39,7 +39,7 @@ public class Connection implements IFujiStatusRequest
         return (ret);
     }
 
-    private boolean connect_to_camera()
+    private boolean connect_to_camera(boolean isBothLiveView)
     {
         try
         {
@@ -70,67 +70,66 @@ public class Connection implements IFujiStatusRequest
             dump_bytes(1, rx_bytes);
             Thread.sleep(50);
 
-/**/
             //  なんだろう?? (送信が必要なようだが)
             comm.send_to_camera(sequence.start_message2(), true);
             rx_bytes = comm.receive_from_camera();
             dump_bytes(2, rx_bytes);
             Thread.sleep(50);
-/**/
-/**/
+
             // two_part messageを発行 (その1)
             comm.send_to_camera(sequence.start_message3_1(), true);
             rx_bytes = comm.receive_from_camera();
             dump_bytes(3, rx_bytes);
             Thread.sleep(50);
 
-            // two_part messageを発行 (その2)
-            comm.send_to_camera(sequence.start_message3_2(), false);
-            rx_bytes = comm.receive_from_camera();
-            dump_bytes(4, rx_bytes);
-            Thread.sleep(50);
-/**/
+            if (rx_bytes.getData().length <= 50)
+            {
+                // two_part messageを発行 (その2)
+                comm.send_to_camera(sequence.start_message3_2(), false);
+                rx_bytes = comm.receive_from_camera();
+                dump_bytes(4, rx_bytes);
+                Thread.sleep(50);
+            }
 
-/**/
             // remote mode
             comm.send_to_camera(sequence.start_message4(), true);
             rx_bytes = comm.receive_from_camera();
             dump_bytes(5, rx_bytes);
             Thread.sleep(50);
-/**/
-/**/
-            // two_part messageを発行 (その1)
-            comm.send_to_camera(sequence.start_message5_1(), true);
-            rx_bytes = comm.receive_from_camera();
-            dump_bytes(6, rx_bytes);
-            Thread.sleep(50);
 
-            // two_part messageを発行 (その2)
-            comm.send_to_camera(sequence.start_message5_2(), false);
-            rx_bytes = comm.receive_from_camera();
-            dump_bytes(7, rx_bytes);
-            Thread.sleep(50);
-/**/
-/**/
-            // ????
-            comm.send_to_camera(sequence.start_message6(), true);
-            rx_bytes = comm.receive_from_camera();
-            dump_bytes(8, rx_bytes);
-            Thread.sleep(50);
+            if (!isBothLiveView)
+            {
+                // two_part messageを発行 (その1)
+                comm.send_to_camera(sequence.start_message5_1(), true);
+                rx_bytes = comm.receive_from_camera();
+                dump_bytes(6, rx_bytes);
+                Thread.sleep(50);
+
+                // two_part messageを発行 (その2)
+                comm.send_to_camera(sequence.start_message5_2(), false);
+                rx_bytes = comm.receive_from_camera();
+                dump_bytes(7, rx_bytes);
+                Thread.sleep(50);
+
+                // ????
+                comm.send_to_camera(sequence.start_message6(), true);
+                rx_bytes = comm.receive_from_camera();
+                dump_bytes(8, rx_bytes);
+                Thread.sleep(50);
+
+                // ????
+                comm.send_to_camera(sequence.start_message7(), true);
+                rx_bytes = comm.receive_from_camera();
+                dump_bytes(9, rx_bytes);
+                Thread.sleep(50);
+
+                // ????
+                comm.send_to_camera(sequence.start_message8(), true);
+                rx_bytes = comm.receive_from_camera();
+                dump_bytes(10, rx_bytes);
+                Thread.sleep(50);
+            }
 
-            // ????
-            comm.send_to_camera(sequence.start_message7(), true);
-            rx_bytes = comm.receive_from_camera();
-            dump_bytes(9, rx_bytes);
-            Thread.sleep(50);
-/**/
-/**/
-            // ????
-            comm.send_to_camera(sequence.start_message8(), true);
-            rx_bytes = comm.receive_from_camera();
-            dump_bytes(10, rx_bytes);
-            Thread.sleep(50);
-/**/
             // リモート制御の開始!
             comm.send_to_camera(sequence.camera_remote_message(), true);
 
index d1fc3c4..37017eb 100644 (file)
@@ -1,18 +1,27 @@
 package net.osdn.gokigen.cameratest.fuji.preference;
 
 import android.content.Context;
+import android.content.SharedPreferences;
 import android.os.Bundle;
+import android.util.Log;
 
 import androidx.annotation.NonNull;
+import androidx.fragment.app.FragmentActivity;
+import androidx.preference.CheckBoxPreference;
 import androidx.preference.ListPreference;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceManager;
 
 import net.osdn.gokigen.cameratest.IApplicationControl;
 import net.osdn.gokigen.cameratest.R;
 
-public class FujiPreferenceFragment extends PreferenceFragmentCompat
+import java.util.Map;
+
+public class FujiPreferenceFragment extends PreferenceFragmentCompat implements SharedPreferences.OnSharedPreferenceChangeListener
 {
+    private final String TAG = toString();
+    private SharedPreferences preferences = null;
     private PowerOffController powerOffController = null;
 
     /**
@@ -38,6 +47,31 @@ public class FujiPreferenceFragment extends PreferenceFragmentCompat
         powerOffController = new PowerOffController(context, control);
     }
 
+    /**
+     *
+     *
+     */
+    @Override
+    public void onAttach(@NonNull Context activity)
+    {
+        super.onAttach(activity);
+        Log.v(TAG, "onAttach()");
+        try
+        {
+            // Preference をつかまえる
+            preferences = PreferenceManager.getDefaultSharedPreferences(activity);
+
+            // Preference を初期設定する
+            initializePreferences();
+
+            preferences.registerOnSharedPreferenceChangeListener(this);
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
     @Override
     public void onCreatePreferences(Bundle savedInstanceState, String rootKey)
     {
@@ -56,4 +90,179 @@ public class FujiPreferenceFragment extends PreferenceFragmentCompat
         findPreference("exit_application").setOnPreferenceClickListener(powerOffController);
 
     }
+
+    /**
+     * Preferenceの初期化...
+     *
+     */
+    private void initializePreferences()
+    {
+        try
+        {
+            Map<String, ?> items = preferences.getAll();
+            SharedPreferences.Editor editor = preferences.edit();
+
+            if (!items.containsKey(IPreferencePropertyAccessor.CONNECTION_METHOD)) {
+                editor.putString(IPreferencePropertyAccessor.CONNECTION_METHOD, IPreferencePropertyAccessor.CONNECTION_METHOD_DEFAULT_VALUE);
+            }
+            if (!items.containsKey(IPreferencePropertyAccessor.CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW)) {
+                editor.putBoolean(IPreferencePropertyAccessor.CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW, true);
+            }
+            if (!items.containsKey(IPreferencePropertyAccessor.FUJIX_DISPLAY_CAMERA_VIEW)) {
+                editor.putBoolean(IPreferencePropertyAccessor.FUJIX_DISPLAY_CAMERA_VIEW, false);
+            }
+            editor.apply();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+
+    @Override
+    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)
+    {
+        Log.v(TAG, "onSharedPreferenceChanged() : " + key);
+        boolean value;
+        if (key != null)
+        {
+            switch (key)
+            {
+                case IPreferencePropertyAccessor.CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW:
+                    value = preferences.getBoolean(key, true);
+                    Log.v(TAG, " " + key + " , " + value);
+                    break;
+
+                case IPreferencePropertyAccessor.FUJIX_DISPLAY_CAMERA_VIEW:
+                    value = preferences.getBoolean(key, false);
+                    Log.v(TAG, " " + key + " , " + value);
+                    break;
+
+                default:
+                    String strValue = preferences.getString(key, "");
+                    setListPreference(key, key, strValue);
+                    break;
+            }
+        }
+    }
+
+    /**
+     *
+     *
+     */
+    @Override
+    public void onResume()
+    {
+        super.onResume();
+        Log.v(TAG, "onResume() Start");
+        try
+        {
+            synchronizedProperty();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+
+        Log.v(TAG, "onResume() End");
+    }
+
+    /**
+     *
+     *
+     */
+    @Override
+    public void onPause()
+    {
+        super.onPause();
+        Log.v(TAG, "onPause() Start");
+        try
+        {
+            // Preference変更のリスナを解除
+            preferences.unregisterOnSharedPreferenceChangeListener(this);
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+
+        Log.v(TAG, "onPause() End");
+    }
+
+    /**
+     * ListPreference の表示データを設定
+     *
+     * @param pref_key     Preference(表示)のキー
+     * @param key          Preference(データ)のキー
+     * @param defaultValue Preferenceのデフォルト値
+     */
+    private void setListPreference(String pref_key, String key, String defaultValue)
+    {
+        try
+        {
+            ListPreference pref;
+            pref = (ListPreference) findPreference(pref_key);
+            String value = preferences.getString(key, defaultValue);
+            if (pref != null)
+            {
+                pref.setValue(value);
+                pref.setSummary(value);
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * BooleanPreference の表示データを設定
+     *
+     * @param pref_key     Preference(表示)のキー
+     * @param key          Preference(データ)のキー
+     * @param defaultValue Preferenceのデフォルト値
+     */
+    private void setBooleanPreference(String pref_key, String key, boolean defaultValue)
+    {
+        try
+        {
+            CheckBoxPreference pref = (CheckBoxPreference) findPreference(pref_key);
+            if (pref != null) {
+                boolean value = preferences.getBoolean(key, defaultValue);
+                pref.setChecked(value);
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     *
+     *
+     */
+    private void synchronizedProperty()
+    {
+        final FragmentActivity activity = getActivity();
+        if (activity != null)
+        {
+            activity.runOnUiThread(new Runnable() {
+                @Override
+                public void run() {
+                    try
+                    {
+                        // Preferenceの画面に反映させる
+                        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);
+                    }
+                    catch (Exception e)
+                    {
+                        e.printStackTrace();
+                    }
+                }
+            });
+        }
+    }
 }
index 54f3f60..6005876 100644 (file)
@@ -3,8 +3,13 @@ package net.osdn.gokigen.cameratest.fuji.preference;
 public interface IPreferencePropertyAccessor
 {
     String EXIT_APPLICATION = "exit_application";
+
     String CONNECTION_METHOD = "connection_method";
     String CONNECTION_METHOD_DEFAULT_VALUE = "FUJI_X";
 
+    String CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW = "capture_both_camera_and_live_view";
+
+    String FUJIX_DISPLAY_CAMERA_VIEW = "fujix_display_camera_view";
+
 
 }
index 749c5f8..2b2f351 100644 (file)
@@ -80,6 +80,12 @@ public class FujiStatusChecker implements IFujiStatusReceiver
         boolean isStatusUpdated = false;
         try
         {
+            if (data.length < 14)
+            {
+                Log.v(TAG, "received status length is short. (" + data.length + " bytes.)");
+                return;
+            }
+
             int nofStatus = (data[13] * 256) + data[12];
             //Log.v(TAG, "status Received. " + data.length + " bytes. [status : " + nofStatus + "]");
 
index f2fb73a..0e21ddb 100644 (file)
@@ -34,6 +34,9 @@
     <string name="pref_degug_info">Debug Information</string>
     <string name="pref_summary_debug_info">LogCat Information</string>
 
+    <string name="pref_fujix_display_camera_view">Use Camera Display</string>
+    <string name="pref_fujix_display_camera_view_summary">Shows liveview screen both camera and smartphone.</string>
+
     <string name="pref_special_thanks">Special Thanks to : fuji-cam-wifi-tool</string>
 
 
index 18998ff..2a8aa46 100644 (file)
 
     <PreferenceCategory
         android:title="@string/pref_cat_camera">
+        <CheckBoxPreference
+            android:key="fujix_display_camera_view"
+            android:title="@string/pref_fujix_display_camera_view"
+            android:summary="@string/pref_fujix_display_camera_view_summary"/>
 
         <CheckBoxPreference
             android:key="capture_both_camera_and_live_view"