OSDN Git Service

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