OSDN Git Service

Theta制御のコマンドを組み込む。
[gokigen/ThetaThoughtShutter.git] / app / src / main / java / jp / osdn / gokigen / thetathoughtshutter / theta / operation / ThetaSingleShotControl.kt
1 package jp.osdn.gokigen.thetathoughtshutter.theta.operation
2
3 import android.util.Log
4 import jp.osdn.gokigen.thetathoughtshutter.utils.SimpleHttpClient
5 import org.json.JSONObject
6
7 class ThetaSingleShotControl(private val executeUrl : String = "http://192.168.1.1")
8 {
9     private val httpClient = SimpleHttpClient()
10
11     /**
12      *
13      *
14      */
15     fun singleShot()
16     {
17         Log.v(TAG, "singleShot()")
18         try
19         {
20             val thread = Thread {
21                 try
22                 {
23                     val shootUrl = "${executeUrl}/osc/commands/execute"
24                     val postData = "{\"name\":\"camera.takePicture\",\"parameters\":{\"timeout\":0}}"
25                     val result: String? = httpClient.httpPostWithHeader(shootUrl, postData, null, "application/json;charset=utf-8", timeoutMs)
26                     if ((result != null)&&(result.isNotEmpty()))
27                     {
28                         Log.v(TAG, " singleShot() : $result")
29
30                         // 画像処理が終わるまで待つ
31                         waitChangeStatus()
32                     }
33                     else
34                     {
35                         Log.v(TAG, "singleShot() reply is null. $shootUrl")
36                     }
37                 }
38                 catch (e: Exception)
39                 {
40                     e.printStackTrace()
41                 }
42             }
43             thread.start()
44         }
45         catch (e: Exception)
46         {
47             e.printStackTrace()
48         }
49     }
50
51     /**
52      * 撮影状態が変わるまで待つ。
53      * (ただし、タイムアウト時間を超えたらライブビューを再開させる)
54      */
55     private fun waitChangeStatus()
56     {
57         val getStateUrl = "${executeUrl}/osc/state"
58         val maxWaitTimeoutMs = 9000 // 最大待ち時間 (単位: ms)
59         var fingerprint = ""
60         try
61         {
62             val result: String? = httpClient.httpPost(getStateUrl, "", timeoutMs)
63             if ((result != null)&&(result.isNotEmpty()))
64             {
65                 val jsonObject = JSONObject(result)
66                 fingerprint = jsonObject.getString("fingerprint")
67
68                 //  現在の状態(ログを出す)
69                 Log.v(TAG, " $getStateUrl $result ($fingerprint)")
70             }
71         }
72         catch (e: Exception)
73         {
74             e.printStackTrace()
75         }
76
77         try
78         {
79             val firstTime = System.currentTimeMillis()
80             var currentTime = firstTime
81             while (currentTime - firstTime < maxWaitTimeoutMs)
82             {
83                 //  ... 状態を見て次に進める
84                 val result: String? = httpClient.httpPost(getStateUrl, "", timeoutMs)
85                 if ((result != null)&&(result.isNotEmpty()))
86                 {
87                     val jsonObject = JSONObject(result)
88                     val currentFingerprint = jsonObject.getString("fingerprint")
89
90                     //  ログを出してみる
91                     // Log.v(TAG, " " + getStateUrl + " ( " + result + " ) " + "(" + fingerprint + " " + current_fingerprint + ")");
92                     if (fingerprint != currentFingerprint)
93                     {
94                         // fingerprintが更新された!
95                         break
96                     }
97                     Log.v(TAG, "  -----  NOW PROCESSING  ----- : $fingerprint")
98                 }
99                 waitMs(750)
100                 currentTime = System.currentTimeMillis()
101             }
102         }
103         catch (e: Exception)
104         {
105             e.printStackTrace()
106         }
107     }
108
109     /**
110      *
111      *
112      */
113     private fun waitMs(waitMs: Int)
114     {
115         try
116         {
117             Thread.sleep(waitMs.toLong())
118         }
119         catch (e: Exception)
120         {
121             e.printStackTrace()
122         }
123     }
124
125     companion object
126     {
127         private val TAG = ThetaSingleShotControl::class.java.simpleName
128         private const val timeoutMs = 6000
129     }
130 }