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);
54 // 応答エラーの場合は この値が返ってくるはず = {0x05, 0x00, 0x00, 0x00, 0x19, 0x20, 0x00, 0x00};
57 comm.send_to_camera(sequence.start_message(), false);
58 rx_bytes = comm.receive_from_camera();
59 dump_bytes(1, rx_bytes);
62 // なんだろう?? (送信が必要なようだが)
63 comm.send_to_camera(sequence.start_message2(), false);
64 rx_bytes = comm.receive_from_camera();
65 dump_bytes(2, rx_bytes);
68 // two_part messageを発行 (その1)
69 comm.send_to_camera(sequence.start_message3_1(), false);
70 rx_bytes = comm.receive_from_camera();
71 dump_bytes(3, rx_bytes);
74 // two_part messageを発行 (その2)
75 comm.send_to_camera(sequence.start_message3_2(), false);
76 rx_bytes = comm.receive_from_camera();
77 dump_bytes(4, rx_bytes);
81 comm.send_to_camera(sequence.start_message4(), false);
82 rx_bytes = comm.receive_from_camera();
83 dump_bytes(5, rx_bytes);
86 // two_part messageを発行 (その1)
87 comm.send_to_camera(sequence.start_message5_1(), false);
88 rx_bytes = comm.receive_from_camera();
89 dump_bytes(6, rx_bytes);
92 // two_part messageを発行 (その2)
93 comm.send_to_camera(sequence.start_message5_2(), false);
94 rx_bytes = comm.receive_from_camera();
95 dump_bytes(7, rx_bytes);
99 comm.send_to_camera(sequence.start_message6(), false);
100 rx_bytes = comm.receive_from_camera();
101 dump_bytes(8, rx_bytes);
105 comm.send_to_camera(sequence.start_message7(), false);
106 rx_bytes = comm.receive_from_camera();
107 dump_bytes(9, rx_bytes);
111 comm.send_to_camera(sequence.start_message8(), false);
112 rx_bytes = comm.receive_from_camera();
113 dump_bytes(10, rx_bytes);
117 comm.send_to_camera(sequence.start_message9(), false);
119 // 応答OKの場合は、8バイト ({0x03, 0x00, 0x01, 0x20} + {0x10, 0x02, 0x00, 0x00} )が応答されるはず
120 rx_bytes = comm.receive_from_camera();
121 dump_bytes(11, rx_bytes);
125 // 別のポートもオープンして動作を行う。 (1500ms程度待つといけるみたいだ...)
128 comm.start_response();
130 Log.v(TAG, "connect_to_camera DONE.");
140 public void reset_to_camera()
144 comm.send_to_camera(sequence.reset_message(), true);
145 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
146 dump_bytes(0, rx_bytes);
147 statusChecker.stop();
156 public void disconnect()
161 comm.stop_response();
162 comm.disconnect_socket();
171 public boolean requestStatus()
175 comm.send_to_camera(sequence.status_request_message(), true);
176 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
177 if (rx_bytes.getData().length > 0)
180 statusChecker.statusReceived(rx_bytes);
182 dump_bytes(12, rx_bytes);
193 private void dump_bytes(int indexNumber, ReceivedDataHolder data)
196 StringBuffer message;
197 message = new StringBuffer();
198 for (byte item : data.getData())
201 message.append(String.format("%02x ", item));
204 Log.v(TAG, " RX [" + indexNumber + "] " + message);
206 message = new StringBuffer();
211 Log.v(TAG, " RX [" + indexNumber + "] " + message);
216 public boolean execute_focus_point(PointF point)
220 byte x = (byte) (0x000000ff & Math.round(point.x));
221 byte y = (byte) (0x000000ff & Math.round(point.y));
222 Log.v(TAG, "DRIVE AF (" + x + "," + y + ")");
224 comm.send_to_camera(sequence.execute_focus_lock(x, y), true);
226 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
227 dump_bytes(16, rx_bytes);
236 public boolean execute_unlock_focus()
240 comm.send_to_camera(sequence.execute_focus_unlock(), true);
242 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
243 dump_bytes(17, rx_bytes);
252 public boolean execute_shutter()
256 comm.send_to_camera(sequence.execute_shutter_message(), true);
258 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
259 dump_bytes(14, rx_bytes);