1 package net.osdn.gokigen.a01d.camera.ricohgr2.operation.takepicture;
3 import android.graphics.PointF;
4 import android.graphics.RectF;
5 import android.util.Log;
7 import net.osdn.gokigen.a01d.camera.ricohgr2.wrapper.IUsePentaxCommand;
8 import net.osdn.gokigen.a01d.camera.utils.SimpleHttpClient;
9 import net.osdn.gokigen.a01d.liveview.IAutoFocusFrameDisplay;
10 import net.osdn.gokigen.a01d.liveview.IIndicatorControl;
12 import org.json.JSONObject;
14 import androidx.annotation.NonNull;
20 public class RicohGr2AutoFocusControl
22 private static final String TAG = RicohGr2AutoFocusControl.class.getSimpleName();
23 private final IIndicatorControl indicator;
24 private final IAutoFocusFrameDisplay frameDisplayer;
25 private final IUsePentaxCommand usePentaxCommand;
26 private String unlockAutoFocusUrl = "http://192.168.0.1/v1/lens/focus/unlock";
27 private String halfPressShutterUrl = "http://192.168.0.1/_gr";
28 private int timeoutMs = 6000;
35 public RicohGr2AutoFocusControl(@NonNull final IAutoFocusFrameDisplay frameDisplayer, final IIndicatorControl indicator, @NonNull IUsePentaxCommand usePentaxCommand)
37 this.frameDisplayer = frameDisplayer;
38 this.indicator = indicator;
39 this.usePentaxCommand = usePentaxCommand;
46 public void lockAutoFocus(@NonNull final PointF point)
48 Log.v(TAG, "lockAutoFocus() : [" + point.x + ", " + point.y + "]");
51 Thread thread = new Thread(new Runnable()
56 RectF preFocusFrameRect = getPreFocusFrameRect(point);
59 showFocusFrame(preFocusFrameRect, IAutoFocusFrameDisplay.FocusFrameStatus.Running, 0.0);
61 String lockAutoFocusUrl = (usePentaxCommand.getUsePentaxCommand()) ? "http://192.168.0.1/v1/lens/focus" : "http://192.168.0.1/v1/lens/focus/lock";
62 //int posX = (int) (Math.round(point.x * 100.0));
63 //int posY = (int) (Math.round(point.y * 100.0));
64 String postData = "pos=" + ( (int) (Math.round(point.x * 100.0))) + "," + ((int) (Math.round(point.y * 100.0)));
65 Log.v(TAG, "AF (" + postData + ")");
66 String result = SimpleHttpClient.httpPost(lockAutoFocusUrl, postData, timeoutMs);
67 if ((result == null)||(result.length() < 1))
69 Log.v(TAG, "setTouchAFPosition() reply is null.");
71 else if (findTouchAFPositionResult(result))
74 Log.v(TAG, "lockAutoFocus() : FOCUSED");
75 showFocusFrame(preFocusFrameRect, IAutoFocusFrameDisplay.FocusFrameStatus.Focused, 1.0); // いったん1秒だけ表示
80 Log.v(TAG, "lockAutoFocus() : ERROR");
81 showFocusFrame(preFocusFrameRect, IAutoFocusFrameDisplay.FocusFrameStatus.Failed, 1.0);
89 showFocusFrame(preFocusFrameRect, IAutoFocusFrameDisplay.FocusFrameStatus.Errored, 1.0);
110 public void unlockAutoFocus()
112 Log.v(TAG, "unlockAutoFocus()");
115 Thread thread = new Thread(new Runnable()
122 String result = SimpleHttpClient.httpPost(unlockAutoFocusUrl, "", timeoutMs);
123 if ((result == null)||(result.length() < 1))
125 Log.v(TAG, "cancelTouchAFPosition() reply is null.");
147 public void halfPressShutter(final boolean isPressed)
149 Log.v(TAG, "halfPressShutter() " + isPressed);
152 Thread thread = new Thread(new Runnable()
159 String postData = (isPressed) ? "cmd=baf 1" : "cmd=baf 0";
160 String result = SimpleHttpClient.httpPost(halfPressShutterUrl, postData, timeoutMs);
161 if ((result == null)||(result.length() < 1))
163 Log.v(TAG, "halfPressShutter() [" + isPressed + "] reply is null.");
184 private void showFocusFrame(RectF rect, IAutoFocusFrameDisplay.FocusFrameStatus status, double duration)
186 frameDisplayer.showFocusFrame(rect, status, duration);
187 indicator.onAfLockUpdate(IAutoFocusFrameDisplay.FocusFrameStatus.Focused == status);
194 private void hideFocusFrame()
196 frameDisplayer.hideFocusFrame();
197 indicator.onAfLockUpdate(false);
204 private RectF getPreFocusFrameRect(@NonNull PointF point)
206 float imageWidth = frameDisplayer.getContentSizeWidth();
207 float imageHeight = frameDisplayer.getContentSizeHeight();
209 // Display a provisional focus frame at the touched point.
210 float focusWidth = 0.125f; // 0.125 is rough estimate.
211 float focusHeight = 0.125f;
212 if (imageWidth > imageHeight)
214 focusHeight *= (imageWidth / imageHeight);
218 focusHeight *= (imageHeight / imageWidth);
220 return (new RectF(point.x - focusWidth / 2.0f, point.y - focusHeight / 2.0f,
221 point.x + focusWidth / 2.0f, point.y + focusHeight / 2.0f));
228 private static boolean findTouchAFPositionResult(String replyString)
230 boolean afResult = false;
233 JSONObject resultObject = new JSONObject(replyString);
234 String result = resultObject.getString("errMsg");
235 boolean focused = resultObject.getBoolean("focused");
236 if (result.contains("OK"))
239 Log.v(TAG, "AF Result : " + afResult);