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;
27 public Connection(@NonNull Activity activity, @NonNull ILiveViewImage imageViewer, @NonNull IFujiStatusNotify notify)
29 this.comm = new Communication(activity, imageViewer);
30 this.sequence = new MessageSequence();
31 this.statusChecker = new FujiStatusChecker(this, notify);
34 public boolean start_connect(boolean isBothLiveView)
38 if (connect_to_camera(isBothLiveView))
40 ret = requestStatus();
44 statusChecker.start();
50 private boolean connect_to_camera(boolean isBothLiveView)
54 ReceivedDataHolder rx_bytes;
55 comm.connect_socket();
57 comm.send_to_camera(sequence.registration_message(), false);
58 rx_bytes = comm.receive_from_camera();
59 dump_bytes(0, rx_bytes);
63 if (rx_bytes.getData().length == 8)
65 byte[] receiveData = rx_bytes.getData();
66 if ((receiveData[0] == 0x05)&&(receiveData[1] == 0x00)&&(receiveData[2] == 0x00)&&(receiveData[3] == 0x00)&&
67 (receiveData[4] == 0x19)&&(receiveData[5] == 0x20)&&(receiveData[6] == 0x00)&&(receiveData[7] == 0x00))
76 comm.send_to_camera(sequence.start_message(), true);
77 rx_bytes = comm.receive_from_camera();
78 dump_bytes(1, rx_bytes);
81 // なんだろう?? (送信が必要なようだが)
82 comm.send_to_camera(sequence.start_message2(), true);
83 rx_bytes = comm.receive_from_camera();
84 dump_bytes(2, rx_bytes);
87 // two_part messageを発行 (その1)
88 comm.send_to_camera(sequence.start_message3_1(), true);
89 rx_bytes = comm.receive_from_camera();
90 dump_bytes(3, rx_bytes);
93 if (rx_bytes.getData().length <= 50)
95 // two_part messageを発行 (その2)
96 comm.send_to_camera(sequence.start_message3_2(), false);
97 rx_bytes = comm.receive_from_camera();
98 dump_bytes(4, rx_bytes);
103 comm.send_to_camera(sequence.start_message4(), true);
104 rx_bytes = comm.receive_from_camera();
105 dump_bytes(5, rx_bytes);
110 // two_part messageを発行 (その1)
111 comm.send_to_camera(sequence.start_message5_1(), true);
112 rx_bytes = comm.receive_from_camera();
113 dump_bytes(6, rx_bytes);
116 // two_part messageを発行 (その2)
117 comm.send_to_camera(sequence.start_message5_2(), false);
118 rx_bytes = comm.receive_from_camera();
119 dump_bytes(7, rx_bytes);
123 comm.send_to_camera(sequence.start_message6(), true);
124 rx_bytes = comm.receive_from_camera();
125 dump_bytes(8, rx_bytes);
129 comm.send_to_camera(sequence.start_message7(), true);
130 rx_bytes = comm.receive_from_camera();
131 dump_bytes(9, rx_bytes);
135 comm.send_to_camera(sequence.start_message8(), true);
136 rx_bytes = comm.receive_from_camera();
137 dump_bytes(10, rx_bytes);
142 comm.send_to_camera(sequence.camera_remote_message(), true);
144 // 応答OKの場合は、8バイト ({0x03, 0x00, 0x01, 0x20} + {0x10, 0x02, 0x00, 0x00} )が応答されるはず
145 rx_bytes = comm.receive_from_camera();
146 dump_bytes(11, rx_bytes);
150 // 別のポートもオープンして動作を行う。 (1500ms程度待つといけるみたいだ...)
153 comm.start_response();
155 Log.v(TAG, "connect_to_camera DONE.");
165 public void reset_to_camera()
169 comm.send_to_camera(sequence.reset_message(), true);
170 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
171 dump_bytes(0, rx_bytes);
172 statusChecker.stop();
181 public void disconnect()
185 statusChecker.stop();
201 comm.stop_response();
209 comm.disconnect_socket();
218 public boolean requestStatus()
222 comm.send_to_camera(sequence.status_request_message(), true);
223 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
224 if (rx_bytes.getData().length > 0)
227 statusChecker.statusReceived(rx_bytes);
229 dump_bytes(12, rx_bytes);
240 private void dump_bytes(int indexNumber, ReceivedDataHolder data)
243 StringBuffer message;
244 message = new StringBuffer();
245 for (byte item : data.getData())
248 message.append(String.format("%02x ", item));
251 Log.v(TAG, " RX [" + indexNumber + "] " + message);
253 message = new StringBuffer();
258 Log.v(TAG, " RX [" + indexNumber + "] " + message);
263 public boolean execute_focus_point(PointF point)
267 byte x = (byte) (0x000000ff & Math.round(point.x));
268 byte y = (byte) (0x000000ff & Math.round(point.y));
269 Log.v(TAG, "DRIVE AF (" + x + "," + y + ")");
271 comm.send_to_camera(sequence.execute_focus_lock(x, y), true);
273 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
274 dump_bytes(16, rx_bytes);
283 public boolean execute_change_film_simulation()
288 int currentValue = statusChecker.getValue(FILM_SIMULATION);
290 if (currentValue > FILM_SIMULATION_MAX)
292 currentValue = FILM_SIMULATION_MIN;
294 return (updateProperty(FILM_SIMULATION, currentValue));
303 public boolean execute_change_image_aspect()
308 int currentValue = statusChecker.getValue(IMAGE_ASPECT);
310 if (currentValue > IMAGE_ASPECT_MAX)
312 currentValue = IMAGE_ASPECT_MIN;
314 return (updateProperty(IMAGE_ASPECT, currentValue));
324 public boolean execute_unlock_focus()
328 comm.send_to_camera(sequence.execute_focus_unlock(), true);
330 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
331 dump_bytes(17, rx_bytes);
340 public boolean execute_shutter()
344 comm.send_to_camera(sequence.execute_shutter_message(), true);
346 ReceivedDataHolder rx_bytes = comm.receive_from_camera();
347 dump_bytes(14, rx_bytes);
356 public boolean updateProperty(int commandCode, int setValue)
358 ReceivedDataHolder rx_bytes;
360 byte high = (byte) ((0x0000ff00 & commandCode) >> 8);
361 byte low = (byte) (0x000000ff & commandCode);
363 byte data0 = (byte)((0xff000000 & setValue) >> 24);
364 byte data1 = (byte)((0x00ff0000 & setValue) >> 16);
365 byte data2 = (byte)((0x0000ff00 & setValue) >> 8);
366 byte data3 = (byte)((0x000000ff & setValue));
368 // two_part messageを発行 (その1)
369 comm.send_to_camera(sequence.update_property_1(high, low), true);
370 rx_bytes = comm.receive_from_camera();
371 dump_bytes(15, rx_bytes);
374 // two_part messageを発行 (その2)
375 comm.send_to_camera(sequence.update_property_2(data0, data1, data2, data3), false);
376 rx_bytes = comm.receive_from_camera();
377 dump_bytes(16, rx_bytes);