1 package net.osdn.gokigen.a01d.camera.theta.operation;
3 import android.content.Context;
4 import android.content.SharedPreferences;
5 import android.preference.PreferenceManager;
6 import android.util.Log;
8 import androidx.annotation.NonNull;
10 import net.osdn.gokigen.a01d.camera.ILiveViewControl;
11 import net.osdn.gokigen.a01d.camera.theta.wrapper.IThetaSessionIdProvider;
12 import net.osdn.gokigen.a01d.camera.utils.SimpleHttpClient;
13 import net.osdn.gokigen.a01d.liveview.IIndicatorControl;
14 import net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor;
16 import org.json.JSONObject;
18 public class ThetaSingleShotControl
20 private final String TAG = toString();
21 private final IThetaSessionIdProvider sessionIdProvider;
22 private final ILiveViewControl liveViewControl;
23 private final IIndicatorControl indicator;
24 private boolean useThetaV21 = false;
25 private int timeoutMs = 6000;
28 public ThetaSingleShotControl(@NonNull Context context, @NonNull final IThetaSessionIdProvider sessionIdProvider, @NonNull IIndicatorControl indicator, @NonNull ILiveViewControl liveViewControl)
30 this.sessionIdProvider = sessionIdProvider;
31 this.liveViewControl = liveViewControl;
32 this.indicator = indicator;
35 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
36 useThetaV21 = preferences.getBoolean(IPreferencePropertyAccessor.USE_OSC_THETA_V21, false);
42 Log.v(TAG, "USE THETA WEB API V2.1 (OSC V2) : " + useThetaV21);
49 public void singleShot()
51 Log.v(TAG, "singleShot()");
54 final Thread thread = new Thread(new Runnable()
61 String shootUrl = "http://192.168.1.1/osc/commands/execute";
62 String postData = (useThetaV21) ? "{\"name\":\"camera.takePicture\",\"parameters\":{\"timeout\":0}}" : "{\"name\":\"camera.takePicture\",\"parameters\":{\"sessionId\": \"" + sessionIdProvider.getSessionId() + "\"}}";
63 String result = SimpleHttpClient.httpPost(shootUrl, postData, timeoutMs);
64 if ((result == null)||(result.length() < 1))
66 Log.v(TAG, "singleShot() reply is null.");
70 Log.v(TAG, " singleShot() : " + result);
71 indicator.onShootingStatusUpdate(IIndicatorControl.shootingStatus.Starting);
77 indicator.onShootingStatusUpdate(IIndicatorControl.shootingStatus.Stopping);
78 liveViewControl.stopLiveView();
79 waitMs(300); // ちょっと待つ...
80 liveViewControl.startLiveView();
99 * (ただし、タイムアウト時間を超えたらライブビューを再開させる)
101 private void waitChangeStatus()
103 final String getStateUrl = "http://192.168.1.1/osc/state";
104 final int maxWaitTimeoutMs = 9000; // 最大待ち時間 (単位: ms)
105 String fingerprint = "";
108 String result = SimpleHttpClient.httpPost(getStateUrl, "", timeoutMs);
109 if (result.length() > 0)
111 JSONObject object = new JSONObject(result);
112 fingerprint = object.getString("fingerprint");
115 Log.v(TAG, " " + getStateUrl + " " + result + " " + "(" + fingerprint + ")");
124 long firstTime = System.currentTimeMillis();
125 long currentTime = firstTime;
126 while ((currentTime - firstTime) < maxWaitTimeoutMs)
129 String result = SimpleHttpClient.httpPost(getStateUrl, "", timeoutMs);
130 if (result.length() > 0)
132 JSONObject object = new JSONObject(result);
133 String current_fingerprint = object.getString("fingerprint");
136 // Log.v(TAG, " " + getStateUrl + " ( " + result + " ) " + "(" + fingerprint + " " + current_fingerprint + ")");
137 if (!fingerprint.equals(current_fingerprint))
139 // fingerprintが更新された!
142 Log.v(TAG, " ----- NOW PROCESSING ----- : " + fingerprint);
145 currentTime = System.currentTimeMillis();
158 private void waitMs(int waitMs)
162 Thread.sleep(waitMs);