1 package net.osdn.gokigen.cameratest.fuji;
3 import android.graphics.PointF;
4 import android.util.Log;
6 import androidx.annotation.NonNull;
8 import net.osdn.gokigen.cameratest.fuji.statuses.FujiStatusChecker;
9 import net.osdn.gokigen.cameratest.fuji.statuses.IFujiStatusRequest;
11 public class Connection implements IFujiStatusRequest
13 private final String TAG = toString();
14 private final MessageSequence sequence;
15 private final Communication comm;
16 private final FujiStatusChecker statusChecker;
18 public Connection(@NonNull ILiveViewImage imageViewer)
20 this.comm = new Communication(imageViewer);
21 this.sequence = new MessageSequence();
22 this.statusChecker = new FujiStatusChecker(this);
25 public boolean start_connect()
29 if (connect_to_camera())
31 ret = requestStatus();
35 statusChecker.start();
41 private boolean connect_to_camera()
45 ReceivedDataHolder rx_bytes;
46 comm.connect_socket();
48 comm.send_to_camera(sequence.registration_message(), false);
49 rx_bytes = comm.receive_from_camera();
50 dump_bytes(0, rx_bytes);
53 // 応答エラーの場合は この値が返ってくるはず = {0x05, 0x00, 0x00, 0x00, 0x19, 0x20, 0x00, 0x00};
56 comm.send_to_camera(sequence.start_message(), false);
57 rx_bytes = comm.receive_from_camera();
58 dump_bytes(1, rx_bytes);
61 // なんだろう?? (送信が必要なようだが)
62 comm.send_to_camera(sequence.start_message2(), false);
63 rx_bytes = comm.receive_from_camera();
64 dump_bytes(2, rx_bytes);
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);
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);
80 comm.send_to_camera(sequence.start_message4(), false);
81 rx_bytes = comm.receive_from_camera();
82 dump_bytes(5, rx_bytes);
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);
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);
98 comm.send_to_camera(sequence.start_message6(), false);
99 rx_bytes = comm.receive_from_camera();
100 dump_bytes(8, rx_bytes);
104 comm.send_to_camera(sequence.start_message7(), false);
105 rx_bytes = comm.receive_from_camera();
106 dump_bytes(9, rx_bytes);
110 comm.send_to_camera(sequence.start_message8(), false);
111 rx_bytes = comm.receive_from_camera();
112 dump_bytes(10, rx_bytes);
116 comm.send_to_camera(sequence.start_message9(), false);
118 // 応答OKの場合は、8バイト ({0x03, 0x00, 0x01, 0x20} + {0x10, 0x02, 0x00, 0x00} )が応答されるはず
119 rx_bytes = comm.receive_from_camera();
120 dump_bytes(11, rx_bytes);
124 // 別のポートもオープンして動作を行う。 (1500ms程度待つといけるみたいだ...)
127 comm.start_response();
129 Log.v(TAG, "connect_to_camera DONE.");
139 public void reset_to_camera()
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();
155 public void disconnect()
160 comm.stop_response();
161 comm.disconnect_socket();
170 public boolean requestStatus()
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);
180 dump_bytes(12, rx_bytes);
183 rx_bytes = comm.receive_from_camera();
184 dump_bytes(13, rx_bytes);
195 private void dump_bytes(int indexNumber, ReceivedDataHolder data)
198 StringBuffer message;
199 message = new StringBuffer();
200 for (byte item : data.getData())
203 message.append(String.format("%02x ", item));
206 Log.v(TAG, " RX [" + indexNumber + "] " + message);
208 message = new StringBuffer();
213 Log.v(TAG, " RX [" + indexNumber + "] " + message);
218 public boolean execute_focus_point(PointF point)
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 + ")");
226 comm.send_to_camera(sequence.execute_focus_lock(x, y), true);
228 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
229 dump_bytes(16, rx_bytes);
238 public boolean execute_unlock_focus()
242 comm.send_to_camera(sequence.execute_focus_unlock(), true);
244 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
245 dump_bytes(17, rx_bytes);
254 public boolean execute_shutter()
258 comm.send_to_camera(sequence.execute_shutter_message(), true);
260 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
261 dump_bytes(14, rx_bytes);
263 // なんで2回受信... でもやってみる
264 rx_bytes = comm.receive_from_camera();
265 dump_bytes(15, rx_bytes);