From 583ae4452fed4116d283fbd997ae488b8bebf6d8 Mon Sep 17 00:00:00 2001 From: MRSa Date: Sun, 12 Jul 2020 20:12:09 +0900 Subject: [PATCH] =?utf8?q?G9=E3=81=A7=E3=81=AE=E6=92=AE=E5=BD=B1=E3=81=8C?= =?utf8?q?=E3=81=A7=E3=81=8D=E3=82=8B=E3=81=A8=E3=81=93=E3=82=8D=E3=81=BE?= =?utf8?q?=E3=81=A7=E7=A2=BA=E8=AA=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../main/java/net/osdn/gokigen/a01d/A01dMain.java | 31 ++++- .../gokigen/a01d/ICardSlotSelectionReceiver.java | 6 + .../net/osdn/gokigen/a01d/ICardSlotSelector.java | 11 ++ .../a01d/camera/CameraInterfaceProvider.java | 5 +- .../panasonic/wrapper/PanasonicCameraWrapper.java | 7 +- .../wrapper/eventlistener/CameraEventObserver.java | 104 ++++---------- .../wrapper/eventlistener/CameraStatusHolder.java | 153 ++++++++++++++++++++- 7 files changed, 228 insertions(+), 89 deletions(-) create mode 100644 app/src/main/java/net/osdn/gokigen/a01d/ICardSlotSelectionReceiver.java create mode 100644 app/src/main/java/net/osdn/gokigen/a01d/ICardSlotSelector.java diff --git a/app/src/main/java/net/osdn/gokigen/a01d/A01dMain.java b/app/src/main/java/net/osdn/gokigen/a01d/A01dMain.java index 38440f9..6c33a31 100644 --- a/app/src/main/java/net/osdn/gokigen/a01d/A01dMain.java +++ b/app/src/main/java/net/osdn/gokigen/a01d/A01dMain.java @@ -1,6 +1,7 @@ package net.osdn.gokigen.a01d; import android.Manifest; +import android.annotation.SuppressLint; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.graphics.Color; @@ -39,6 +40,7 @@ import net.osdn.gokigen.a01d.preference.summary.PreferenceFragmentSummary; import net.osdn.gokigen.a01d.preference.theta.ThetaPreferenceFragment; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; @@ -54,7 +56,7 @@ import java.util.Map; * A01d ; * */ -public class A01dMain extends AppCompatActivity implements ICameraStatusReceiver, IChangeScene, ICameraPowerOn.PowerOnCameraCallback, IInformationReceiver +public class A01dMain extends AppCompatActivity implements ICameraStatusReceiver, IChangeScene, ICameraPowerOn.PowerOnCameraCallback, IInformationReceiver, ICardSlotSelector { private final String TAG = toString(); private IInterfaceProvider interfaceProvider = null; @@ -76,7 +78,9 @@ public class A01dMain extends AppCompatActivity implements ICameraStatusReceiver private LogCatFragment logCatFragment = null; private LiveViewFragment liveViewFragment = null; + @Override + @SuppressLint("InlinedApi") protected void onCreate(Bundle savedInstanceState) { final int REQUEST_NEED_PERMISSIONS = 1010; @@ -117,7 +121,9 @@ public class A01dMain extends AppCompatActivity implements ICameraStatusReceiver (ContextCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_ADMIN) != PackageManager.PERMISSION_GRANTED) || (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) || (ContextCompat.checkSelfPermission(this, Manifest.permission.INTERNET) != PackageManager.PERMISSION_GRANTED)) { + ActivityCompat.requestPermissions(this, + new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, @@ -154,7 +160,7 @@ public class A01dMain extends AppCompatActivity implements ICameraStatusReceiver { try { - interfaceProvider = new CameraInterfaceProvider(this, this, this); + interfaceProvider = new CameraInterfaceProvider(this, this, this, this); } catch (Exception e) { @@ -244,15 +250,16 @@ public class A01dMain extends AppCompatActivity implements ICameraStatusReceiver @Override public void changeSceneToCameraPropertyList() { +/* try { ICameraConnection.CameraConnectionMethod method = interfaceProvider.getCammeraConnectionMethod(); - } catch (Exception e) { e.printStackTrace(); } +*/ } /** @@ -856,4 +863,22 @@ public class A01dMain extends AppCompatActivity implements ICameraStatusReceiver } /**/ } + + @Override + public void setupSlotSelector(boolean isEnable, @Nullable ICardSlotSelectionReceiver slotSelectionReceiver) + { + // 特に何もしない + } + + @Override + public void selectSlot(@NonNull String slotId) + { + // 特に何もしない + } + + @Override + public void changedCardSlot(@NonNull String slotId) + { + // 特に何もしない + } } diff --git a/app/src/main/java/net/osdn/gokigen/a01d/ICardSlotSelectionReceiver.java b/app/src/main/java/net/osdn/gokigen/a01d/ICardSlotSelectionReceiver.java new file mode 100644 index 0000000..05fedec --- /dev/null +++ b/app/src/main/java/net/osdn/gokigen/a01d/ICardSlotSelectionReceiver.java @@ -0,0 +1,6 @@ +package net.osdn.gokigen.a01d; + +public interface ICardSlotSelectionReceiver +{ + void slotSelected(String slotId); +} diff --git a/app/src/main/java/net/osdn/gokigen/a01d/ICardSlotSelector.java b/app/src/main/java/net/osdn/gokigen/a01d/ICardSlotSelector.java new file mode 100644 index 0000000..04231c6 --- /dev/null +++ b/app/src/main/java/net/osdn/gokigen/a01d/ICardSlotSelector.java @@ -0,0 +1,11 @@ +package net.osdn.gokigen.a01d; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +public interface ICardSlotSelector +{ + void setupSlotSelector(boolean isEnable, @Nullable ICardSlotSelectionReceiver slotSelectionReceiver); + void selectSlot(@NonNull String slotId); + void changedCardSlot(@NonNull String slotId); +} diff --git a/app/src/main/java/net/osdn/gokigen/a01d/camera/CameraInterfaceProvider.java b/app/src/main/java/net/osdn/gokigen/a01d/camera/CameraInterfaceProvider.java index 60df36c..8115697 100644 --- a/app/src/main/java/net/osdn/gokigen/a01d/camera/CameraInterfaceProvider.java +++ b/app/src/main/java/net/osdn/gokigen/a01d/camera/CameraInterfaceProvider.java @@ -3,6 +3,7 @@ package net.osdn.gokigen.a01d.camera; import android.app.Activity; import android.content.SharedPreferences; +import net.osdn.gokigen.a01d.ICardSlotSelector; import net.osdn.gokigen.a01d.IInformationReceiver; import net.osdn.gokigen.a01d.camera.canon.wrapper.CanonInterfaceProvider; import net.osdn.gokigen.a01d.camera.fujix.IFujiXInterfaceProvider; @@ -42,7 +43,7 @@ public class CameraInterfaceProvider implements IInterfaceProvider private final NikonInterfaceProvider nikon; private final CameraStatusListener statusListener; - public CameraInterfaceProvider(@NonNull Activity context, @NonNull ICameraStatusReceiver provider, @NonNull IInformationReceiver informationReceiver) + public CameraInterfaceProvider(@NonNull Activity context, @NonNull ICameraStatusReceiver provider, @NonNull IInformationReceiver informationReceiver, @NonNull ICardSlotSelector cardSlotSelector) { this.context = context; this.statusListener = new CameraStatusListener(); @@ -50,7 +51,7 @@ public class CameraInterfaceProvider implements IInterfaceProvider olympusPen = new OlympusPenInterfaceProvider(context, provider, statusListener); sony = new SonyCameraWrapper(context, provider, statusListener); fujiX = new FujiXInterfaceProvider(context, provider, statusListener); - panasonic = new PanasonicCameraWrapper(context, provider, statusListener); + panasonic = new PanasonicCameraWrapper(context, provider, statusListener, cardSlotSelector); ricohGr2 = new RicohGr2InterfaceProvider(context, provider); theta = new ThetaInterfaceProvider(context, provider, statusListener); canon = new CanonInterfaceProvider(context, provider, statusListener, informationReceiver); diff --git a/app/src/main/java/net/osdn/gokigen/a01d/camera/panasonic/wrapper/PanasonicCameraWrapper.java b/app/src/main/java/net/osdn/gokigen/a01d/camera/panasonic/wrapper/PanasonicCameraWrapper.java index bf73062..5fc62cf 100644 --- a/app/src/main/java/net/osdn/gokigen/a01d/camera/panasonic/wrapper/PanasonicCameraWrapper.java +++ b/app/src/main/java/net/osdn/gokigen/a01d/camera/panasonic/wrapper/PanasonicCameraWrapper.java @@ -3,6 +3,7 @@ package net.osdn.gokigen.a01d.camera.panasonic.wrapper; import android.app.Activity; import android.util.Log; +import net.osdn.gokigen.a01d.ICardSlotSelector; import net.osdn.gokigen.a01d.camera.ICameraChangeListener; import net.osdn.gokigen.a01d.camera.ICameraConnection; import net.osdn.gokigen.a01d.camera.ICameraInformation; @@ -36,6 +37,7 @@ public class PanasonicCameraWrapper implements IPanasonicCameraHolder, IPanasoni private static final int TIMEOUT_MS = 3000; private final ICameraStatusReceiver provider; private final ICameraChangeListener listener; + private final ICardSlotSelector cardSlotSelector; private IPanasonicCamera panasonicCamera = null; //private IPanasonicCameraApi panasonicCameraApi = null; private ICameraEventObserver eventObserver = null; @@ -45,11 +47,12 @@ public class PanasonicCameraWrapper implements IPanasonicCameraHolder, IPanasoni private PanasonicCameraZoomLensControl zoomControl = null; private PanasonicCameraConnection cameraConnection = null; - public PanasonicCameraWrapper(final Activity context, final ICameraStatusReceiver statusReceiver , final @NonNull ICameraChangeListener listener) + public PanasonicCameraWrapper(final Activity context, final ICameraStatusReceiver statusReceiver , final @NonNull ICameraChangeListener listener, @NonNull ICardSlotSelector cardSlotSelector) { this.context = context; this.provider = statusReceiver; this.listener = listener; + this.cardSlotSelector = cardSlotSelector; } @Override @@ -61,7 +64,7 @@ public class PanasonicCameraWrapper implements IPanasonicCameraHolder, IPanasoni //this.panasonicCameraApi = PanasonicCameraApi.newInstance(panasonicCamera); if (eventObserver == null) { - eventObserver = CameraEventObserver.newInstance(context, panasonicCamera); + eventObserver = CameraEventObserver.newInstance(context, panasonicCamera, cardSlotSelector); } if (liveViewControl == null) { diff --git a/app/src/main/java/net/osdn/gokigen/a01d/camera/panasonic/wrapper/eventlistener/CameraEventObserver.java b/app/src/main/java/net/osdn/gokigen/a01d/camera/panasonic/wrapper/eventlistener/CameraEventObserver.java index 518b499..232ead2 100644 --- a/app/src/main/java/net/osdn/gokigen/a01d/camera/panasonic/wrapper/eventlistener/CameraEventObserver.java +++ b/app/src/main/java/net/osdn/gokigen/a01d/camera/panasonic/wrapper/eventlistener/CameraEventObserver.java @@ -4,8 +4,10 @@ import android.content.Context; import android.os.Handler; import android.util.Log; +import net.osdn.gokigen.a01d.ICardSlotSelector; import net.osdn.gokigen.a01d.camera.ICameraChangeListener; import net.osdn.gokigen.a01d.camera.panasonic.wrapper.IPanasonicCamera; +import net.osdn.gokigen.a01d.camera.utils.SimpleHttpClient; import org.json.JSONArray; import org.json.JSONObject; @@ -19,23 +21,23 @@ import androidx.annotation.NonNull; public class CameraEventObserver implements ICameraEventObserver { private static final String TAG = CameraEventObserver.class.getSimpleName(); + private static final int TIMEOUT_MS = 3000; + private final CameraStatusHolder statusHolder; private boolean isEventMonitoring; private boolean isActive; private final IPanasonicCamera remote; - // private final ReplyJsonParser replyParser; - private String eventVersion = "1.1"; // 初期値を "1.0" から "1.1" に更新 - public static ICameraEventObserver newInstance(@NonNull Context context, @NonNull IPanasonicCamera apiClient) + public static ICameraEventObserver newInstance(@NonNull Context context, @NonNull IPanasonicCamera apiClient, @NonNull ICardSlotSelector cardSlotSelector) { - return (new CameraEventObserver(context, apiClient)); + return (new CameraEventObserver(context, apiClient, cardSlotSelector)); } - private CameraEventObserver(@NonNull Context context, @NonNull IPanasonicCamera apiClient) + private CameraEventObserver(@NonNull Context context, @NonNull IPanasonicCamera apiClient, @NonNull ICardSlotSelector cardSlotSelector) { super(); remote = apiClient; - //replyParser = new ReplyJsonParser(new Handler(context.getMainLooper())); + statusHolder = new CameraStatusHolder(context, apiClient, cardSlotSelector); isEventMonitoring = false; isActive = false; } @@ -48,14 +50,13 @@ public class CameraEventObserver implements ICameraEventObserver Log.w(TAG, "start() observer is not active."); return (false); } - if (isEventMonitoring) { Log.w(TAG, "start() already starting."); return (false); } + isEventMonitoring = true; - isEventMonitoring = false; try { Thread thread = new Thread() @@ -64,64 +65,26 @@ public class CameraEventObserver implements ICameraEventObserver public void run() { Log.d(TAG, "start() exec."); - boolean firstCall = true; - MONITORLOOP: while (isEventMonitoring) + while (isEventMonitoring) { - // At first, call as non-Long Polling. - boolean longPolling = !firstCall; try { -/* - // Call getEvent API. - JSONObject replyJson = remoteApi.getEvent(eventVersion, longPolling); - - // Check error code at first. - int errorCode = findErrorCode(replyJson); - Log.d(TAG, "getEvent errorCode: " + errorCode); - switch (errorCode) { - case 0: // no error - // Pass through. - break; - case 1: // "Any" error - case 12: // "No such method" error - if (eventVersion.equals("1.1")) - { - // "1.1" でエラーが発生した時には "1.0" にダウングレードして再実行 - eventVersion = "1.0"; - continue MONITORLOOP; - } - replyParser.fireResponseErrorListener(); - break MONITORLOOP; // end monitoring. - - case 2: // "Timeout" error - // Re-call immediately. - continue MONITORLOOP; - - case 40402: // "Already polling" error - // Retry after 5 sec. - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - // do nothing. - } - continue MONITORLOOP; - - default: - Log.w(TAG, "SimpleCameraEventObserver: Unexpected error: " + errorCode); - replyParser.fireResponseErrorListener(); - break MONITORLOOP; // end monitoring. - } - - // parse - replyParser.parse(replyJson); -*/ + // parse reply message + statusHolder.parse(SimpleHttpClient.httpGet(remote.getCmdUrl() + "cam.cgi?mode=getstate", TIMEOUT_MS)); + } + catch (Exception e) + { + e.printStackTrace(); + } + try + { + Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } - firstCall = false; - } // MONITORLOOP end. + } isEventMonitoring = false; } }; @@ -152,7 +115,7 @@ public class CameraEventObserver implements ICameraEventObserver { try { - //replyParser.setEventChangeListener(listener); + statusHolder.setEventChangeListener(listener); } catch (Exception e) { @@ -165,7 +128,7 @@ public class CameraEventObserver implements ICameraEventObserver { try { - //replyParser.clearEventChangeListener(); + statusHolder.clearEventChangeListener(); } catch (Exception e) { @@ -176,8 +139,7 @@ public class CameraEventObserver implements ICameraEventObserver @Override public ICameraStatusHolder getCameraStatusHolder() { - return (null); - //return (replyParser); + return (statusHolder); } @Override @@ -186,22 +148,4 @@ public class CameraEventObserver implements ICameraEventObserver isActive = true; } - private static int findErrorCode(JSONObject replyJson) - { - int code = 0; // 0 means no error. - try - { - if (replyJson.has("error")) - { - JSONArray errorObj = replyJson.getJSONArray("error"); - code = errorObj.getInt(0); - } - } - catch (Exception e) - { - e.printStackTrace(); - code = -1; - } - return (code); - } } diff --git a/app/src/main/java/net/osdn/gokigen/a01d/camera/panasonic/wrapper/eventlistener/CameraStatusHolder.java b/app/src/main/java/net/osdn/gokigen/a01d/camera/panasonic/wrapper/eventlistener/CameraStatusHolder.java index 649fd9e..8184306 100644 --- a/app/src/main/java/net/osdn/gokigen/a01d/camera/panasonic/wrapper/eventlistener/CameraStatusHolder.java +++ b/app/src/main/java/net/osdn/gokigen/a01d/camera/panasonic/wrapper/eventlistener/CameraStatusHolder.java @@ -1,9 +1,107 @@ package net.osdn.gokigen.a01d.camera.panasonic.wrapper.eventlistener; +import android.content.Context; +import android.util.Log; + +import androidx.annotation.NonNull; + +import net.osdn.gokigen.a01d.ICardSlotSelectionReceiver; +import net.osdn.gokigen.a01d.ICardSlotSelector; +import net.osdn.gokigen.a01d.camera.ICameraChangeListener; +import net.osdn.gokigen.a01d.camera.panasonic.wrapper.IPanasonicCamera; +import net.osdn.gokigen.a01d.camera.utils.SimpleHttpClient; + import java.util.List; -public class CameraStatusHolder implements ICameraStatusHolder +public class CameraStatusHolder implements ICameraStatusHolder, ICardSlotSelectionReceiver { + private static final String TAG = CameraStatusHolder.class.getSimpleName(); + private final Context context; + private final IPanasonicCamera remote; + private static final int TIMEOUT_MS = 3000; + private final ICardSlotSelector cardSlotSelector; + private ICameraChangeListener listener = null; + private String current_sd = "sd1"; + private boolean isInitialized = false; + private boolean isDualSlot = false; + + CameraStatusHolder(@NonNull Context context, @NonNull IPanasonicCamera apiClient, @NonNull ICardSlotSelector cardSlotSelector) + { + this.context = context; + this.remote = apiClient; + this.cardSlotSelector = cardSlotSelector; + + } + + void parse(String reply) + { + try + { + // Log.v(TAG, " getState : " + reply); + + boolean isEnableDualSlot = false; + if (reply.contains("set") && (reply.contains("set"))) + { + // カードが2枚刺さっている場合... + isEnableDualSlot = true; + } + if ((!isInitialized)||(isDualSlot != isEnableDualSlot)) + { + // 初回だけの実行... + if (isEnableDualSlot) + { + // カードが2枚刺さっている場合... + cardSlotSelector.setupSlotSelector(true, this); + } + else + { + // カードが1つしか刺さっていない場合... + cardSlotSelector.setupSlotSelector(false, null); + } + isInitialized = true; + isDualSlot = isEnableDualSlot; + } + checkCurrentSlot(reply); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + private void checkCurrentSlot(String reply) + { + try + { + String header = ""; + int indexStart = reply.indexOf(header); + int indexEnd = reply.indexOf(""); + if ((indexStart > 0)&&(indexEnd > 0)&&(indexStart < indexEnd)) + { + String currentSlot = reply.substring(indexStart + header.length(), indexEnd); + if (!current_sd.equals(currentSlot)) + { + current_sd = currentSlot; + cardSlotSelector.changedCardSlot(current_sd); + } + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + void setEventChangeListener(@NonNull ICameraChangeListener listener) + { + this.listener = listener; + } + + void clearEventChangeListener() + { + this.listener = null; + } + @Override public String getCameraStatus() { @@ -37,6 +135,57 @@ public class CameraStatusHolder implements ICameraStatusHolder @Override public String getStorageId() { - return (null); + return (current_sd); + } + + @Override + public void slotSelected(@NonNull String slotId) + { + Log.v(TAG, " slotSelected : " + slotId); + if (!current_sd.equals(slotId)) + { + // スロットを変更したい! + requestToChangeSlot(slotId); + } + } + + + private void requestToChangeSlot(final String slotId) + { + try + { + Thread thread = new Thread(new Runnable() { + @Override + public void run() + { + try + { + boolean loop = true; + while (loop) + { + String reply = SimpleHttpClient.httpGet(remote.getCmdUrl() + "cam.cgi?mode=setsetting&type=current_sd&value=" + slotId, TIMEOUT_MS); + if (reply.indexOf("ok") > 0) + { + loop = false; + cardSlotSelector.selectSlot(slotId); + } + else + { + Thread.sleep(1000); // 1秒待つ + } + } + } + catch (Exception e) + { + e.printStackTrace(); + } + } + }); + thread.start(); + } + catch (Exception e) + { + e.printStackTrace(); + } } } -- 2.11.0