OSDN Git Service

オートフォーカスの動作を仮実装。
authorMRSa <mrsa@myad.jp>
Mon, 2 Jul 2018 15:31:08 +0000 (00:31 +0900)
committerMRSa <mrsa@myad.jp>
Mon, 2 Jul 2018 15:31:08 +0000 (00:31 +0900)
app/src/main/java/net/osdn/gokigen/a01d/camera/ricohgr2/operation/RicohGr2CameraFocusControl.java
app/src/main/java/net/osdn/gokigen/a01d/camera/ricohgr2/operation/takepicture/RicohGr2AutoFocusControl.java [new file with mode: 0644]
app/src/main/java/net/osdn/gokigen/a01d/camera/ricohgr2/wrapper/RicohGr2InterfaceProvider.java

index f6711fd..a688c7d 100644 (file)
@@ -1,20 +1,53 @@
 package net.osdn.gokigen.a01d.camera.ricohgr2.operation;
 
+import android.graphics.PointF;
+import android.support.annotation.NonNull;
+import android.util.Log;
 import android.view.MotionEvent;
 
 import net.osdn.gokigen.a01d.camera.IFocusingControl;
+import net.osdn.gokigen.a01d.camera.ricohgr2.operation.takepicture.RicohGr2AutoFocusControl;
+import net.osdn.gokigen.a01d.liveview.IAutoFocusFrameDisplay;
+import net.osdn.gokigen.a01d.liveview.IIndicatorControl;
 
 public class RicohGr2CameraFocusControl implements IFocusingControl
 {
+    private final String TAG = toString();
+    private final RicohGr2AutoFocusControl afControl;
+    private final IAutoFocusFrameDisplay frameDisplay;
+
+    public RicohGr2CameraFocusControl(@NonNull final IAutoFocusFrameDisplay frameDisplayer, @NonNull final IIndicatorControl indicator)
+    {
+        this.frameDisplay = frameDisplayer;
+        this.afControl = new RicohGr2AutoFocusControl(frameDisplayer, indicator);
+    }
 
     @Override
-    public boolean driveAutoFocus(MotionEvent motionEvent) {
-        return false;
+    public boolean driveAutoFocus(MotionEvent motionEvent)
+    {
+        Log.v(TAG, "driveAutoFocus()");
+        if (motionEvent.getAction() != MotionEvent.ACTION_DOWN)
+        {
+            return (false);
+        }
+        try
+        {
+            PointF point = frameDisplay.getPointWithEvent(motionEvent);
+            if (frameDisplay.isContainsPoint(point))
+            {
+                afControl.lockAutoFocus(point);
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        return (false);
     }
 
     @Override
     public void unlockAutoFocus()
     {
-
+        afControl.unlockAutoFocus();
     }
 }
diff --git a/app/src/main/java/net/osdn/gokigen/a01d/camera/ricohgr2/operation/takepicture/RicohGr2AutoFocusControl.java b/app/src/main/java/net/osdn/gokigen/a01d/camera/ricohgr2/operation/takepicture/RicohGr2AutoFocusControl.java
new file mode 100644 (file)
index 0000000..91a742a
--- /dev/null
@@ -0,0 +1,201 @@
+package net.osdn.gokigen.a01d.camera.ricohgr2.operation.takepicture;
+
+import android.graphics.PointF;
+import android.graphics.RectF;
+import android.support.annotation.NonNull;
+import android.util.Log;
+
+import net.osdn.gokigen.a01d.camera.sony.operation.takepicture.SonyAutoFocusControl;
+import net.osdn.gokigen.a01d.camera.utils.SimpleHttpClient;
+import net.osdn.gokigen.a01d.liveview.IAutoFocusFrameDisplay;
+import net.osdn.gokigen.a01d.liveview.IIndicatorControl;
+
+import org.json.JSONObject;
+
+public class RicohGr2AutoFocusControl
+{
+    private static final String TAG = SonyAutoFocusControl.class.getSimpleName();
+    private final IIndicatorControl indicator;
+    private final IAutoFocusFrameDisplay frameDisplayer;
+    private String lockAutoFocusUrl = "http://192.168.0.1/v1/lens/focus/lock";
+    private String unlockAutoFocusUrl = "http://192.168.0.1/v1/lens/focus/unlock";
+    private int timeoutMs = 6000;
+
+
+    public RicohGr2AutoFocusControl(@NonNull final IAutoFocusFrameDisplay frameDisplayer, final IIndicatorControl indicator)
+    {
+        this.frameDisplayer = frameDisplayer;
+        this.indicator = indicator;
+    }
+
+    /**
+     *
+     *
+     */
+    public void lockAutoFocus(@NonNull final PointF point)
+    {
+        Log.v(TAG, "lockAutoFocus() : [" + point.x + ", " + point.y + "]");
+        try
+        {
+            Thread thread = new Thread(new Runnable()
+            {
+                @Override
+                public void run()
+                {
+                    RectF preFocusFrameRect = getPreFocusFrameRect(point);
+                    try
+                    {
+                        showFocusFrame(preFocusFrameRect, IAutoFocusFrameDisplay.FocusFrameStatus.Running, 0.0);
+
+                        //int posX = (int) (Math.round(point.x * 100.0));
+                        //int posY = (int) (Math.round(point.y * 100.0));
+                        String postData = "pos=" + ( (int) (Math.round(point.x * 100.0))) + "," + ((int) (Math.round(point.y * 100.0)));
+                        Log.v(TAG, "AF (" + postData + ")");
+                        String result = SimpleHttpClient.httpPost(lockAutoFocusUrl, postData, timeoutMs);
+                        if ((result == null)||(result.length() < 1))
+                        {
+                            Log.v(TAG, "setTouchAFPosition() reply is null.");
+                        }
+                        else if (findTouchAFPositionResult(result))
+                        {
+                            // AF FOCUSED
+                            Log.v(TAG, "lockAutoFocus() : FOCUSED");
+                            showFocusFrame(preFocusFrameRect, IAutoFocusFrameDisplay.FocusFrameStatus.Focused, 1.0);  // いったん1秒だけ表示
+                        }
+                        else
+                        {
+                            // AF ERROR
+                            Log.v(TAG, "lockAutoFocus() : ERROR");
+                            showFocusFrame(preFocusFrameRect, IAutoFocusFrameDisplay.FocusFrameStatus.Failed, 1.0);
+                        }
+                    }
+                    catch (Exception e)
+                    {
+                        e.printStackTrace();
+                        try
+                        {
+                            showFocusFrame(preFocusFrameRect, IAutoFocusFrameDisplay.FocusFrameStatus.Errored, 1.0);
+                        }
+                        catch (Exception ee)
+                        {
+                            ee.printStackTrace();
+                        }
+                    }
+                }
+            });
+            thread.start();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     *
+     *
+     */
+    public void unlockAutoFocus()
+    {
+        Log.v(TAG, "unlockAutoFocus()");
+        try
+        {
+            Thread thread = new Thread(new Runnable()
+            {
+                @Override
+                public void run()
+                {
+                    try
+                    {
+                        String result = SimpleHttpClient.httpPost(unlockAutoFocusUrl, "", timeoutMs);
+                        if ((result == null)||(result.length() < 1))
+                        {
+                            Log.v(TAG, "cancelTouchAFPosition() reply is null.");
+                        }
+                        hideFocusFrame();
+                    }
+                    catch (Exception e)
+                    {
+                        e.printStackTrace();
+                    }
+                }
+            });
+            thread.start();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     *
+     *
+     */
+    private void showFocusFrame(RectF rect, IAutoFocusFrameDisplay.FocusFrameStatus status, double duration)
+    {
+        frameDisplayer.showFocusFrame(rect, status, duration);
+        indicator.onAfLockUpdate(IAutoFocusFrameDisplay.FocusFrameStatus.Focused == status);
+    }
+
+    /**
+     *
+     *
+     */
+    private void hideFocusFrame()
+    {
+        frameDisplayer.hideFocusFrame();
+        indicator.onAfLockUpdate(false);
+    }
+
+    /**
+     *
+     *
+     */
+    private RectF getPreFocusFrameRect(@NonNull PointF point)
+    {
+        float imageWidth =  frameDisplayer.getContentSizeWidth();
+        float imageHeight =  frameDisplayer.getContentSizeHeight();
+
+        // Display a provisional focus frame at the touched point.
+        float focusWidth = 0.125f;  // 0.125 is rough estimate.
+        float focusHeight = 0.125f;
+        if (imageWidth > imageHeight)
+        {
+            focusHeight *= (imageWidth / imageHeight);
+        }
+        else
+        {
+            focusHeight *= (imageHeight / imageWidth);
+        }
+        return (new RectF(point.x - focusWidth / 2.0f, point.y - focusHeight / 2.0f,
+                point.x + focusWidth / 2.0f, point.y + focusHeight / 2.0f));
+    }
+
+    /**
+     *
+     *
+     */
+    private static boolean findTouchAFPositionResult(String replyString)
+    {
+        boolean afResult = false;
+        try
+        {
+            int indexOfTouchAFPositionResult = 1;
+            JSONObject resultObject = new JSONObject(replyString);
+            String result = resultObject.getString("errMsg");
+            boolean focused = resultObject.getBoolean("focused");
+            if (result.contains("OK"))
+            {
+                afResult = focused;
+                Log.v(TAG, "AF Result : " + afResult);
+
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        return (afResult);
+    }
+}
index 276825f..7975467 100644 (file)
@@ -49,7 +49,6 @@ public class RicohGr2InterfaceProvider implements IRicohGr2InterfaceProvider, ID
         liveViewControl = new RicohGr2LiveViewControl();
         captureControl = new RicohGr2CameraCaptureControl();
         zoomControl = new RicohGr2CameraZoomLensControl();
-        focusControl = new RicohGr2CameraFocusControl();
 
     }
 
@@ -70,6 +69,7 @@ public class RicohGr2InterfaceProvider implements IRicohGr2InterfaceProvider, ID
     public void injectDisplay(IAutoFocusFrameDisplay frameDisplayer, IIndicatorControl indicator, IFocusingModeNotify focusingModeNotify)
     {
         Log.v(TAG, "injectDisplay()");
+        focusControl = new RicohGr2CameraFocusControl(frameDisplayer, indicator);
 
     }