From: MRSa Date: Tue, 21 May 2019 15:39:13 +0000 (+0900) Subject: 接続シーケンスの改良で、LV同時出力も実施してみた。 X-Git-Url: http://git.osdn.net/view?p=gokigen%2FFujiCam.git;a=commitdiff_plain;h=e53e8901bec2e5e15c1c8c78ba68cad63530e971 接続シーケンスの改良で、LV同時出力も実施してみた。 --- diff --git a/app/src/main/java/net/osdn/gokigen/cameratest/camtest/CamTest.java b/app/src/main/java/net/osdn/gokigen/cameratest/camtest/CamTest.java index 6b28353..ebd44f8 100644 --- a/app/src/main/java/net/osdn/gokigen/cameratest/camtest/CamTest.java +++ b/app/src/main/java/net/osdn/gokigen/cameratest/camtest/CamTest.java @@ -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); } } }); diff --git a/app/src/main/java/net/osdn/gokigen/cameratest/fuji/Connection.java b/app/src/main/java/net/osdn/gokigen/cameratest/fuji/Connection.java index e202b8f..b0122f7 100644 --- a/app/src/main/java/net/osdn/gokigen/cameratest/fuji/Connection.java +++ b/app/src/main/java/net/osdn/gokigen/cameratest/fuji/Connection.java @@ -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); diff --git a/app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/FujiPreferenceFragment.java b/app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/FujiPreferenceFragment.java index d1fc3c4..37017eb 100644 --- a/app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/FujiPreferenceFragment.java +++ b/app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/FujiPreferenceFragment.java @@ -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 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(); + } + } + }); + } + } } diff --git a/app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/IPreferencePropertyAccessor.java b/app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/IPreferencePropertyAccessor.java index 54f3f60..6005876 100644 --- a/app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/IPreferencePropertyAccessor.java +++ b/app/src/main/java/net/osdn/gokigen/cameratest/fuji/preference/IPreferencePropertyAccessor.java @@ -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"; + } diff --git a/app/src/main/java/net/osdn/gokigen/cameratest/fuji/statuses/FujiStatusChecker.java b/app/src/main/java/net/osdn/gokigen/cameratest/fuji/statuses/FujiStatusChecker.java index 749c5f8..2b2f351 100644 --- a/app/src/main/java/net/osdn/gokigen/cameratest/fuji/statuses/FujiStatusChecker.java +++ b/app/src/main/java/net/osdn/gokigen/cameratest/fuji/statuses/FujiStatusChecker.java @@ -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 + "]"); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index f2fb73a..0e21ddb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -34,6 +34,9 @@ Debug Information LogCat Information + Use Camera Display + Shows liveview screen both camera and smartphone. + Special Thanks to : fuji-cam-wifi-tool diff --git a/app/src/main/res/xml/preferences_fuji_x.xml b/app/src/main/res/xml/preferences_fuji_x.xml index 18998ff..2a8aa46 100644 --- a/app/src/main/res/xml/preferences_fuji_x.xml +++ b/app/src/main/res/xml/preferences_fuji_x.xml @@ -19,6 +19,10 @@ +