1 package net.osdn.gokigen.cameratest.fuji;
3 import android.app.Activity;
4 import android.graphics.PointF;
5 import android.util.Log;
7 import androidx.annotation.NonNull;
9 import net.osdn.gokigen.cameratest.fuji.statuses.FujiStatusChecker;
10 import net.osdn.gokigen.cameratest.fuji.statuses.IFujiStatusNotify;
11 import net.osdn.gokigen.cameratest.fuji.statuses.IFujiStatusRequest;
13 import static net.osdn.gokigen.cameratest.fuji.statuses.IFujiCameraProperties.FILM_SIMULATION;
14 import static net.osdn.gokigen.cameratest.fuji.statuses.IFujiCameraProperties.IMAGE_ASPECT;
15 import static net.osdn.gokigen.cameratest.fuji.statuses.IFujiCameraPropertyValues.FILM_SIMULATION_MAX;
16 import static net.osdn.gokigen.cameratest.fuji.statuses.IFujiCameraPropertyValues.FILM_SIMULATION_MIN;
17 import static net.osdn.gokigen.cameratest.fuji.statuses.IFujiCameraPropertyValues.IMAGE_ASPECT_MAX;
18 import static net.osdn.gokigen.cameratest.fuji.statuses.IFujiCameraPropertyValues.IMAGE_ASPECT_MIN;
20 public class Connection implements IFujiStatusRequest
22 private final String TAG = toString();
23 private final MessageSequence sequence;
24 private final Communication comm;
25 private final FujiStatusChecker statusChecker;
26 private boolean pauseRequestStatus = false;
28 public Connection(@NonNull Activity activity, @NonNull ILiveViewImage imageViewer, @NonNull IFujiStatusNotify notify)
30 this.comm = new Communication(activity, imageViewer);
31 this.sequence = new MessageSequence();
32 this.statusChecker = new FujiStatusChecker(this, notify);
35 public boolean start_connect(boolean isBothLiveView)
39 if (connect_to_camera(isBothLiveView))
41 ret = requestStatus();
45 statusChecker.start();
51 private boolean connect_to_camera(boolean isBothLiveView)
55 ReceivedDataHolder rx_bytes;
56 comm.connect_socket();
58 comm.send_to_camera(sequence.registration_message(), false, false);
59 rx_bytes = comm.receive_from_camera();
60 dump_bytes(0, rx_bytes);
64 if (rx_bytes.getData().length == 8)
66 byte[] receiveData = rx_bytes.getData();
67 if ((receiveData[0] == 0x05)&&(receiveData[1] == 0x00)&&(receiveData[2] == 0x00)&&(receiveData[3] == 0x00)&&
68 (receiveData[4] == 0x19)&&(receiveData[5] == 0x20)&&(receiveData[6] == 0x00)&&(receiveData[7] == 0x00))
77 comm.send_to_camera(sequence.start_message(), true, true);
78 rx_bytes = comm.receive_from_camera();
79 dump_bytes(1, rx_bytes);
82 // なんだろう?? (送信が必要なようだが)
83 comm.send_to_camera(sequence.start_message2(), true, true);
84 rx_bytes = comm.receive_from_camera();
85 dump_bytes(2, rx_bytes);
88 // two_part messageを発行 (その1)
89 comm.send_to_camera(sequence.start_message3_1(), true, true);
90 rx_bytes = comm.receive_from_camera();
91 dump_bytes(3, rx_bytes);
94 if (rx_bytes.getData().length <= 50)
96 // two_part messageを発行 (その2)
97 comm.send_to_camera(sequence.start_message3_2(), false, false);
98 rx_bytes = comm.receive_from_camera();
99 dump_bytes(4, rx_bytes);
104 comm.send_to_camera(sequence.start_message4(), true, true);
105 rx_bytes = comm.receive_from_camera();
106 dump_bytes(5, rx_bytes);
111 // two_part messageを発行 (その1)
112 comm.send_to_camera(sequence.start_message5_1(), true, false);
113 rx_bytes = comm.receive_from_camera();
114 dump_bytes(6, rx_bytes);
117 // two_part messageを発行 (その2)
118 comm.send_to_camera(sequence.start_message5_2(), true, true);
119 rx_bytes = comm.receive_from_camera();
120 dump_bytes(7, rx_bytes);
124 comm.send_to_camera(sequence.start_message6(), true, true);
125 rx_bytes = comm.receive_from_camera();
126 dump_bytes(8, rx_bytes);
130 comm.send_to_camera(sequence.query_camera_capabilities(), true, true);
131 rx_bytes = comm.receive_from_camera();
132 dump_bytes(9, rx_bytes);
136 comm.send_to_camera(sequence.start_message8(), true, true);
137 rx_bytes = comm.receive_from_camera();
138 dump_bytes(10, rx_bytes);
143 comm.send_to_camera(sequence.camera_remote_message(), true, true);
145 // 応答OKの場合は、8バイト ({0x03, 0x00, 0x01, 0x20} + {0x10, 0x02, 0x00, 0x00} )が応答されるはず
146 rx_bytes = comm.receive_from_camera();
147 dump_bytes(11, rx_bytes);
151 // 別のポートもオープンして動作を行う。 (1500ms程度待つといけるみたいだ...)
154 comm.start_response();
156 Log.v(TAG, "connect_to_camera DONE.");
166 public void reset_to_camera()
170 comm.send_to_camera(sequence.reset_message(), true, true);
171 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
172 dump_bytes(0, rx_bytes);
173 statusChecker.stop();
182 public void disconnect()
186 statusChecker.stop();
202 comm.stop_response();
210 comm.disconnect_socket();
219 public boolean requestStatus()
221 if (pauseRequestStatus)
228 comm.send_to_camera(sequence.status_request_message(), true, true);
229 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
230 if (rx_bytes.getData().length > 0)
233 statusChecker.statusReceived(rx_bytes);
235 dump_bytes(12, rx_bytes);
246 private void dump_bytes(int indexNumber, ReceivedDataHolder data)
249 StringBuffer message;
250 message = new StringBuffer();
251 for (byte item : data.getData())
254 message.append(String.format("%02x ", item));
257 Log.v(TAG, " RX [" + indexNumber + "] " + message);
259 message = new StringBuffer();
264 Log.v(TAG, " RX [" + indexNumber + "] " + message);
269 public boolean execute_focus_point(PointF point)
273 byte x = (byte) (0x000000ff & Math.round(point.x));
274 byte y = (byte) (0x000000ff & Math.round(point.y));
275 Log.v(TAG, "DRIVE AF (" + x + "," + y + ")");
277 comm.send_to_camera(sequence.execute_focus_lock(x, y), true, true);
279 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
280 dump_bytes(16, rx_bytes);
289 public boolean execute_change_film_simulation()
294 int currentValue = statusChecker.getValue(FILM_SIMULATION);
296 if (currentValue > FILM_SIMULATION_MAX)
298 currentValue = FILM_SIMULATION_MIN;
300 return (updateProperty(FILM_SIMULATION, currentValue, true));
309 public boolean execute_change_image_aspect()
314 int currentValue = statusChecker.getValue(IMAGE_ASPECT);
316 if (currentValue > IMAGE_ASPECT_MAX)
318 currentValue = IMAGE_ASPECT_MIN;
320 return (updateProperty(IMAGE_ASPECT, currentValue, true));
329 public boolean execute_query_camera_capability()
331 pauseRequestStatus = true;
334 comm.send_to_camera(sequence.query_camera_capabilities(), true, true);
336 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
337 dump_bytes(21, rx_bytes);
343 pauseRequestStatus = false;
348 public boolean execute_unlock_focus()
352 comm.send_to_camera(sequence.execute_focus_unlock(), true, true);
354 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
355 dump_bytes(17, rx_bytes);
364 public boolean execute_shutter()
368 comm.send_to_camera(sequence.execute_shutter_message(), true, true);
370 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
371 dump_bytes(14, rx_bytes);
380 private boolean updateProperty(int commandCode, int setValue, boolean isShort)
382 pauseRequestStatus = true;
383 ReceivedDataHolder rx_bytes;
385 byte high = (byte) ((0x0000ff00 & commandCode) >> 8);
386 byte low = (byte) (0x000000ff & commandCode);
388 byte data0 = (byte)((0xff000000 & setValue) >> 24);
389 byte data1 = (byte)((0x00ff0000 & setValue) >> 16);
390 byte data2 = (byte)((0x0000ff00 & setValue) >> 8);
391 byte data3 = (byte)((0x000000ff & setValue));
393 // two_part messageを発行 (その1)
394 comm.send_to_camera(sequence.update_property_1(high, low), true, false);
396 rx_bytes = comm.receive_from_camera();
397 dump_bytes(19, rx_bytes);
399 // two_part messageを発行 (その1) : ダミーでもう一発...!
400 comm.send_to_camera(sequence.update_property_1(high, low), true, false);
402 rx_bytes = comm.receive_from_camera();
403 dump_bytes(15, rx_bytes);
405 // two_part messageを発行 (その2)
406 comm.send_to_camera((isShort) ? sequence.update_property_2(data2, data3) : sequence.update_property_2(data0, data1, data2, data3), true, true);
408 rx_bytes = comm.receive_from_camera();
409 dump_bytes(20, rx_bytes);
415 pauseRequestStatus = false;