OSDN Git Service

G9での撮影ができるところまで確認。
authorMRSa <mrsa@myad.jp>
Sun, 12 Jul 2020 11:12:09 +0000 (20:12 +0900)
committerMRSa <mrsa@myad.jp>
Sun, 12 Jul 2020 11:12:09 +0000 (20:12 +0900)
app/src/main/java/net/osdn/gokigen/a01d/A01dMain.java
app/src/main/java/net/osdn/gokigen/a01d/ICardSlotSelectionReceiver.java [new file with mode: 0644]
app/src/main/java/net/osdn/gokigen/a01d/ICardSlotSelector.java [new file with mode: 0644]
app/src/main/java/net/osdn/gokigen/a01d/camera/CameraInterfaceProvider.java
app/src/main/java/net/osdn/gokigen/a01d/camera/panasonic/wrapper/PanasonicCameraWrapper.java
app/src/main/java/net/osdn/gokigen/a01d/camera/panasonic/wrapper/eventlistener/CameraEventObserver.java
app/src/main/java/net/osdn/gokigen/a01d/camera/panasonic/wrapper/eventlistener/CameraStatusHolder.java

index 38440f9..6c33a31 100644 (file)
@@ -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 (file)
index 0000000..05fedec
--- /dev/null
@@ -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 (file)
index 0000000..04231c6
--- /dev/null
@@ -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);
+}
index 60df36c..8115697 100644 (file)
@@ -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);
index bf73062..5fc62cf 100644 (file)
@@ -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)
             {
index 518b499..232ead2 100644 (file)
@@ -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);
-    }
 }
index 649fd9e..8184306 100644 (file)
@@ -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("<sd_memory>set</sd_memory>") && (reply.contains("<sd2_memory>set</sd2_memory>")))
+            {
+                // カードが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 = "<current_sd>";
+            int indexStart = reply.indexOf(header);
+            int indexEnd = reply.indexOf("</current_sd>");
+            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("<result>ok</result>") > 0)
+                            {
+                                loop = false;
+                                cardSlotSelector.selectSlot(slotId);
+                            }
+                            else
+                            {
+                                Thread.sleep(1000);  // 1秒待つ
+                            }
+                        }
+                    }
+                    catch (Exception e)
+                    {
+                        e.printStackTrace();
+                    }
+                }
+            });
+            thread.start();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
     }
 }