OSDN Git Service

撮影後、一定時間待つのではなく状態を見てからライブビューを再開するように変更する。
[gokigen/A01d.git] / app / src / main / java / net / osdn / gokigen / a01d / camera / theta / operation / ThetaSingleShotControl.java
1 package net.osdn.gokigen.a01d.camera.theta.operation;
2
3 import android.content.Context;
4 import android.content.SharedPreferences;
5 import android.preference.PreferenceManager;
6 import android.util.Log;
7
8 import androidx.annotation.NonNull;
9
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;
15
16 import org.json.JSONObject;
17
18 public class ThetaSingleShotControl
19 {
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;
26
27
28     public ThetaSingleShotControl(@NonNull Context context, @NonNull final IThetaSessionIdProvider sessionIdProvider, @NonNull IIndicatorControl indicator, @NonNull ILiveViewControl liveViewControl)
29     {
30         this.sessionIdProvider = sessionIdProvider;
31         this.liveViewControl = liveViewControl;
32         this.indicator = indicator;
33         try
34         {
35             SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
36             useThetaV21 = preferences.getBoolean(IPreferencePropertyAccessor.USE_OSC_THETA_V21, false);
37         }
38         catch (Exception e)
39         {
40             e.printStackTrace();
41         }
42         Log.v(TAG, "USE THETA WEB API V2.1 (OSC V2) : " + useThetaV21);
43     }
44
45     /**
46      *
47      *
48      */
49     public void singleShot()
50     {
51         Log.v(TAG, "singleShot()");
52         try
53         {
54             final Thread thread = new Thread(new Runnable()
55             {
56                 @Override
57                 public void run()
58                 {
59                     try
60                     {
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))
65                         {
66                             Log.v(TAG, "singleShot() reply is null.");
67                         }
68                         else
69                         {
70                             Log.v(TAG, " singleShot() : " + result);
71                             indicator.onShootingStatusUpdate(IIndicatorControl.shootingStatus.Starting);
72
73                             // 画像処理が終わるまで待つ
74                             waitChangeStatus();
75
76                             // ライブビューのの再実行を指示する
77                             indicator.onShootingStatusUpdate(IIndicatorControl.shootingStatus.Stopping);
78                             liveViewControl.stopLiveView();
79                             waitMs(300);  // ちょっと待つ...
80                             liveViewControl.startLiveView();
81                         }
82                     }
83                     catch (Exception e)
84                     {
85                         e.printStackTrace();
86                     }
87                 }
88             });
89             thread.start();
90         }
91         catch (Exception e)
92         {
93             e.printStackTrace();
94         }
95     }
96
97     /**
98      *    撮影状態が変わるまで待つ。
99      *     (ただし、タイムアウト時間を超えたらライブビューを再開させる)
100      */
101     private void waitChangeStatus()
102     {
103         final String getStateUrl = "http://192.168.1.1/osc/state";
104         final int maxWaitTimeoutMs = 9000;  // 最大待ち時間 (単位: ms)
105         String fingerprint = "";
106         try
107         {
108             String result = SimpleHttpClient.httpPost(getStateUrl, "", timeoutMs);
109             if (result.length() > 0)
110             {
111                 JSONObject object = new JSONObject(result);
112                 fingerprint = object.getString("fingerprint");
113
114                 //  現在の状態(ログを出す)
115                 Log.v(TAG, " " + getStateUrl + " " + result + " " + "(" + fingerprint + ")");
116             }
117         }
118         catch (Exception e)
119         {
120             e.printStackTrace();
121         }
122         try
123         {
124             long firstTime = System.currentTimeMillis();
125             long currentTime = firstTime;
126             while ((currentTime - firstTime) < maxWaitTimeoutMs)
127             {
128                 //  ... 状態を見て次に進める
129                 String result = SimpleHttpClient.httpPost(getStateUrl, "", timeoutMs);
130                 if (result.length() > 0)
131                 {
132                     JSONObject object = new JSONObject(result);
133                     String current_fingerprint = object.getString("fingerprint");
134
135                     //  ログを出してみる
136                     // Log.v(TAG, " " + getStateUrl + " ( " + result + " ) " + "(" + fingerprint + " " + current_fingerprint + ")");
137                     if (!fingerprint.equals(current_fingerprint))
138                     {
139                         // fingerprintが更新された!
140                         break;
141                     }
142                     Log.v(TAG, "  -----  NOW PROCESSING  ----- : " + fingerprint);
143                 }
144                 waitMs(1000);
145                 currentTime = System.currentTimeMillis();
146             }
147         }
148         catch (Exception e)
149         {
150             e.printStackTrace();
151         }
152     }
153
154     /**
155      *
156      *
157      */
158     private void waitMs(int waitMs)
159     {
160         try
161         {
162             Thread.sleep(waitMs);
163         }
164         catch (Exception e)
165         {
166             e.printStackTrace();
167         }
168     }
169 }