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.IFujiStatusNotify;
10 import net.osdn.gokigen.cameratest.fuji.statuses.IFujiStatusRequest;
12 public class Connection implements IFujiStatusRequest
14 private final String TAG = toString();
15 private final MessageSequence sequence;
16 private final Communication comm;
17 private final FujiStatusChecker statusChecker;
19 public Connection(@NonNull ILiveViewImage imageViewer, @NonNull IFujiStatusNotify notify)
21 this.comm = new Communication(imageViewer);
22 this.sequence = new MessageSequence();
23 this.statusChecker = new FujiStatusChecker(this, notify);
26 public boolean start_connect()
30 if (connect_to_camera())
32 ret = requestStatus();
36 statusChecker.start();
42 private boolean connect_to_camera()
46 ReceivedDataHolder rx_bytes;
47 comm.connect_socket();
49 comm.send_to_camera(sequence.registration_message(), false);
50 rx_bytes = comm.receive_from_camera();
51 dump_bytes(0, rx_bytes);
55 if (rx_bytes.getData().length == 8)
57 byte[] receiveData = rx_bytes.getData();
58 if ((receiveData[0] == 0x05)&&(receiveData[1] == 0x00)&&(receiveData[2] == 0x00)&&(receiveData[3] == 0x00)&&
59 (receiveData[4] == 0x19)&&(receiveData[5] == 0x20)&&(receiveData[6] == 0x00)&&(receiveData[7] == 0x00))
68 comm.send_to_camera(sequence.start_message(), true);
69 rx_bytes = comm.receive_from_camera();
70 dump_bytes(1, rx_bytes);
74 // なんだろう?? (送信が必要なようだが)
75 comm.send_to_camera(sequence.start_message2(), true);
76 rx_bytes = comm.receive_from_camera();
77 dump_bytes(2, rx_bytes);
81 // two_part messageを発行 (その1)
82 comm.send_to_camera(sequence.start_message3_1(), true);
83 rx_bytes = comm.receive_from_camera();
84 dump_bytes(3, rx_bytes);
87 // two_part messageを発行 (その2)
88 comm.send_to_camera(sequence.start_message3_2(), false);
89 rx_bytes = comm.receive_from_camera();
90 dump_bytes(4, rx_bytes);
96 comm.send_to_camera(sequence.start_message4(), true);
97 rx_bytes = comm.receive_from_camera();
98 dump_bytes(5, rx_bytes);
102 // two_part messageを発行 (その1)
103 comm.send_to_camera(sequence.start_message5_1(), true);
104 rx_bytes = comm.receive_from_camera();
105 dump_bytes(6, rx_bytes);
108 // two_part messageを発行 (その2)
109 comm.send_to_camera(sequence.start_message5_2(), false);
110 rx_bytes = comm.receive_from_camera();
111 dump_bytes(7, rx_bytes);
116 comm.send_to_camera(sequence.start_message6(), true);
117 rx_bytes = comm.receive_from_camera();
118 dump_bytes(8, rx_bytes);
122 comm.send_to_camera(sequence.start_message7(), true);
123 rx_bytes = comm.receive_from_camera();
124 dump_bytes(9, rx_bytes);
129 comm.send_to_camera(sequence.start_message8(), true);
130 rx_bytes = comm.receive_from_camera();
131 dump_bytes(10, rx_bytes);
135 comm.send_to_camera(sequence.camera_remote_message(), true);
137 // 応答OKの場合は、8バイト ({0x03, 0x00, 0x01, 0x20} + {0x10, 0x02, 0x00, 0x00} )が応答されるはず
138 rx_bytes = comm.receive_from_camera();
139 dump_bytes(11, rx_bytes);
143 // 別のポートもオープンして動作を行う。 (1500ms程度待つといけるみたいだ...)
146 comm.start_response();
148 Log.v(TAG, "connect_to_camera DONE.");
158 public void reset_to_camera()
162 comm.send_to_camera(sequence.reset_message(), true);
163 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
164 dump_bytes(0, rx_bytes);
165 statusChecker.stop();
174 public void disconnect()
178 statusChecker.stop();
194 comm.stop_response();
202 comm.disconnect_socket();
211 public boolean requestStatus()
215 comm.send_to_camera(sequence.status_request_message(), true);
216 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
217 if (rx_bytes.getData().length > 0)
220 statusChecker.statusReceived(rx_bytes);
222 dump_bytes(12, rx_bytes);
233 private void dump_bytes(int indexNumber, ReceivedDataHolder data)
236 StringBuffer message;
237 message = new StringBuffer();
238 for (byte item : data.getData())
241 message.append(String.format("%02x ", item));
244 Log.v(TAG, " RX [" + indexNumber + "] " + message);
246 message = new StringBuffer();
251 Log.v(TAG, " RX [" + indexNumber + "] " + message);
256 public boolean execute_focus_point(PointF point)
260 byte x = (byte) (0x000000ff & Math.round(point.x));
261 byte y = (byte) (0x000000ff & Math.round(point.y));
262 Log.v(TAG, "DRIVE AF (" + x + "," + y + ")");
264 comm.send_to_camera(sequence.execute_focus_lock(x, y), true);
266 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
267 dump_bytes(16, rx_bytes);
276 public boolean execute_unlock_focus()
280 comm.send_to_camera(sequence.execute_focus_unlock(), true);
282 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
283 dump_bytes(17, rx_bytes);
292 public boolean execute_shutter()
296 comm.send_to_camera(sequence.execute_shutter_message(), true);
298 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
299 dump_bytes(14, rx_bytes);