OSDN Git Service

ステータス受信準備。
[gokigen/FujiCam.git] / app / src / main / java / net / osdn / gokigen / cameratest / fuji / Connection.java
1 package net.osdn.gokigen.cameratest.fuji;
2
3 import android.graphics.PointF;
4 import android.util.Log;
5
6 import androidx.annotation.NonNull;
7
8 import net.osdn.gokigen.cameratest.fuji.statuses.FujiStatusChecker;
9 import net.osdn.gokigen.cameratest.fuji.statuses.IFujiStatusRequest;
10
11 public class Connection implements IFujiStatusRequest
12 {
13     private final String TAG = toString();
14     private final MessageSequence sequence;
15     private final Communication comm;
16     private final FujiStatusChecker statusChecker;
17
18     public Connection(@NonNull ILiveViewImage imageViewer)
19     {
20         this.comm = new Communication(imageViewer);
21         this.sequence = new MessageSequence();
22         this.statusChecker = new FujiStatusChecker(this);
23     }
24
25     public boolean start_connect()
26     {
27         boolean ret = false;
28
29         if (connect_to_camera())
30         {
31             ret = requestStatus();
32             if (ret)
33             {
34                 // 定期監視の開始
35                 statusChecker.start();
36             }
37         }
38         return (ret);
39     }
40
41     private boolean connect_to_camera()
42     {
43         try
44         {
45             ReceivedDataHolder rx_bytes;
46             comm.connect_socket();
47
48             comm.send_to_camera(sequence.registration_message(), false);
49             rx_bytes = comm.receive_from_camera();
50             dump_bytes(0, rx_bytes);
51             Thread.sleep(50);
52
53             // 応答エラーの場合は この値が返ってくるはず  = {0x05, 0x00, 0x00, 0x00, 0x19, 0x20, 0x00, 0x00};
54
55             // start_messageを送信
56             comm.send_to_camera(sequence.start_message(), false);
57             rx_bytes = comm.receive_from_camera();
58             dump_bytes(1, rx_bytes);
59             Thread.sleep(50);
60
61             //  なんだろう?? (送信が必要なようだが)
62             comm.send_to_camera(sequence.start_message2(), false);
63             rx_bytes = comm.receive_from_camera();
64             dump_bytes(2, rx_bytes);
65             Thread.sleep(50);
66
67             // two_part messageを発行 (その1)
68             comm.send_to_camera(sequence.start_message3_1(), false);
69             rx_bytes = comm.receive_from_camera();
70             dump_bytes(3, rx_bytes);
71             Thread.sleep(50);
72
73             // two_part messageを発行 (その2)
74             comm.send_to_camera(sequence.start_message3_2(), false);
75             rx_bytes = comm.receive_from_camera();
76             dump_bytes(4, rx_bytes);
77             Thread.sleep(50);
78
79             // remote mode
80             comm.send_to_camera(sequence.start_message4(), false);
81             rx_bytes = comm.receive_from_camera();
82             dump_bytes(5, rx_bytes);
83             Thread.sleep(50);
84
85             // two_part messageを発行 (その1)
86             comm.send_to_camera(sequence.start_message5_1(), false);
87             rx_bytes = comm.receive_from_camera();
88             dump_bytes(6, rx_bytes);
89             Thread.sleep(50);
90
91             // two_part messageを発行 (その2)
92             comm.send_to_camera(sequence.start_message5_2(), false);
93             rx_bytes = comm.receive_from_camera();
94             dump_bytes(7, rx_bytes);
95             Thread.sleep(50);
96
97             // ????
98             comm.send_to_camera(sequence.start_message6(), false);
99             rx_bytes = comm.receive_from_camera();
100             dump_bytes(8, rx_bytes);
101             Thread.sleep(50);
102
103             // ????
104             comm.send_to_camera(sequence.start_message7(), false);
105             rx_bytes = comm.receive_from_camera();
106             dump_bytes(9, rx_bytes);
107             Thread.sleep(50);
108
109             // ????
110             comm.send_to_camera(sequence.start_message8(), false);
111             rx_bytes = comm.receive_from_camera();
112             dump_bytes(10, rx_bytes);
113             Thread.sleep(50);
114
115             // ????
116             comm.send_to_camera(sequence.start_message9(), false);
117
118             // 応答OKの場合は、8バイト ({0x03, 0x00, 0x01, 0x20} + {0x10, 0x02, 0x00, 0x00} )が応答されるはず
119             rx_bytes = comm.receive_from_camera();
120             dump_bytes(11, rx_bytes);
121             Thread.sleep(150);
122
123
124             // 別のポートもオープンして動作を行う。 (1500ms程度待つといけるみたいだ...)
125             Thread.sleep(2000);
126             comm.start_stream();
127             comm.start_response();
128
129             Log.v(TAG, "connect_to_camera DONE.");
130             return (true);
131         }
132         catch (Exception e)
133         {
134             e.printStackTrace();
135         }
136         return (false);
137     }
138
139     public void reset_to_camera()
140     {
141         try
142         {
143             comm.send_to_camera(sequence.reset_message(), true);
144             ReceivedDataHolder rx_bytes = comm.receive_from_camera();
145             dump_bytes(0, rx_bytes);
146             statusChecker.stop();
147             Thread.sleep(150);
148         }
149         catch (Exception e)
150         {
151             e.printStackTrace();
152         }
153     }
154
155     public void disconnect()
156     {
157         try
158         {
159             comm.stop_stream();
160             comm.stop_response();
161             comm.disconnect_socket();
162         }
163         catch (Exception e)
164         {
165             e.printStackTrace();
166         }
167     }
168
169     @Override
170     public boolean requestStatus()
171     {
172         try
173         {
174             comm.send_to_camera(sequence.status_request_message(), true);
175             //Thread.sleep(30);// ちょっと待つ
176             ReceivedDataHolder rx_bytes = comm.receive_from_camera();
177             if (rx_bytes.getData().length > 0) {
178                 statusChecker.statusReceived(rx_bytes);
179             }
180             dump_bytes(12, rx_bytes);
181
182             // なんで2回... でもやってみる
183             rx_bytes = comm.receive_from_camera();
184             dump_bytes(13, rx_bytes);
185
186             return (true);
187         }
188         catch (Exception e)
189         {
190             e.printStackTrace();
191         }
192         return (false);
193     }
194
195     private void dump_bytes(int indexNumber, ReceivedDataHolder data)
196     {
197         int index = 0;
198         StringBuffer message;
199         message = new StringBuffer();
200         for (byte item : data.getData())
201         {
202             index++;
203             message.append(String.format("%02x ", item));
204             if (index >= 8)
205             {
206                 Log.v(TAG, " RX [" + indexNumber + "] " + message);
207                 index = 0;
208                 message = new StringBuffer();
209             }
210         }
211         if (index != 0)
212         {
213             Log.v(TAG, " RX [" + indexNumber + "] "  + message);
214         }
215         System.gc();
216     }
217
218     public boolean execute_focus_point(PointF point)
219     {
220         try
221         {
222             byte x = (byte) (0x000000ff & Math.round(point.x));
223             byte y = (byte) (0x000000ff & Math.round(point.y));
224             Log.v(TAG, "DRIVE AF (" + x + "," + y + ")");
225
226             comm.send_to_camera(sequence.execute_focus_lock(x, y), true);
227
228             ReceivedDataHolder rx_bytes = comm.receive_from_camera();
229             dump_bytes(16, rx_bytes);
230         }
231         catch (Exception e)
232         {
233             e.printStackTrace();
234         }
235         return (false);
236     }
237
238     public boolean execute_unlock_focus()
239     {
240         try
241         {
242             comm.send_to_camera(sequence.execute_focus_unlock(), true);
243
244             ReceivedDataHolder rx_bytes = comm.receive_from_camera();
245             dump_bytes(17, rx_bytes);
246         }
247         catch (Exception e)
248         {
249             e.printStackTrace();
250         }
251         return (false);
252     }
253
254     public boolean execute_shutter()
255     {
256         try
257         {
258             comm.send_to_camera(sequence.execute_shutter_message(), true);
259
260             ReceivedDataHolder rx_bytes = comm.receive_from_camera();
261             dump_bytes(14, rx_bytes);
262
263             // なんで2回受信... でもやってみる
264             rx_bytes = comm.receive_from_camera();
265             dump_bytes(15, rx_bytes);
266         }
267         catch (Exception e)
268         {
269             e.printStackTrace();
270         }
271         return (false);
272     }
273 }