OSDN Git Service

シャッターを切れるようにした。
[gokigen/FujiCam.git] / app / src / main / java / net / osdn / gokigen / cameratest / fuji / Connection.java
1 package net.osdn.gokigen.cameratest.fuji;
2
3 import android.util.Log;
4
5 import androidx.annotation.NonNull;
6
7 public class Connection
8 {
9     private final String TAG = toString();
10     private final MessageSequence sequence;
11     private final Communication comm;
12
13     public Connection(@NonNull ILiveViewImage imageViewer)
14     {
15         this.comm = new Communication(imageViewer);
16         this.sequence = new MessageSequence();
17     }
18
19     public boolean start_connect()
20     {
21         boolean ret = false;
22
23         if (connect_to_camera())
24         {
25             ret = get_current_settings();
26         }
27         return (ret);
28     }
29
30     private boolean connect_to_camera()
31     {
32         try
33         {
34             ReceivedDataHolder rx_bytes;
35             comm.connect_socket();
36
37             comm.send_to_camera(sequence.registration_message(), false);
38             rx_bytes = comm.receive_from_camera();
39             dump_bytes(0, rx_bytes);
40             Thread.sleep(50);
41
42             // 応答エラーの場合は この値が返ってくるはず  = {0x05, 0x00, 0x00, 0x00, 0x19, 0x20, 0x00, 0x00};
43
44             // start_messageを送信
45             comm.send_to_camera(sequence.start_message(), false);
46             rx_bytes = comm.receive_from_camera();
47             dump_bytes(1, rx_bytes);
48             Thread.sleep(50);
49
50             //  なんだろう?? (送信が必要なようだが)
51             comm.send_to_camera(sequence.start_message2(), false);
52             rx_bytes = comm.receive_from_camera();
53             dump_bytes(2, rx_bytes);
54             Thread.sleep(50);
55
56             // two_part messageを発行 (その1)
57             comm.send_to_camera(sequence.start_message3_1(), false);
58             rx_bytes = comm.receive_from_camera();
59             dump_bytes(3, rx_bytes);
60             Thread.sleep(50);
61
62             // two_part messageを発行 (その2)
63             comm.send_to_camera(sequence.start_message3_2(), false);
64             rx_bytes = comm.receive_from_camera();
65             dump_bytes(4, rx_bytes);
66             Thread.sleep(50);
67
68             // remote mode
69             comm.send_to_camera(sequence.start_message4(), false);
70             rx_bytes = comm.receive_from_camera();
71             dump_bytes(5, rx_bytes);
72             Thread.sleep(50);
73
74             // two_part messageを発行 (その1)
75             comm.send_to_camera(sequence.start_message5_1(), false);
76             rx_bytes = comm.receive_from_camera();
77             dump_bytes(6, rx_bytes);
78             Thread.sleep(50);
79
80             // two_part messageを発行 (その2)
81             comm.send_to_camera(sequence.start_message5_2(), false);
82             rx_bytes = comm.receive_from_camera();
83             dump_bytes(7, rx_bytes);
84             Thread.sleep(50);
85
86             // ????
87             comm.send_to_camera(sequence.start_message6(), false);
88             rx_bytes = comm.receive_from_camera();
89             dump_bytes(8, rx_bytes);
90             Thread.sleep(50);
91
92             // ????
93             comm.send_to_camera(sequence.start_message7(), false);
94             rx_bytes = comm.receive_from_camera();
95             dump_bytes(9, rx_bytes);
96             Thread.sleep(50);
97
98             // ????
99             comm.send_to_camera(sequence.start_message8(), false);
100             rx_bytes = comm.receive_from_camera();
101             dump_bytes(10, rx_bytes);
102             Thread.sleep(50);
103
104             // ????
105             comm.send_to_camera(sequence.start_message9(), false);
106
107             // 応答OKの場合は、8バイト ({0x03, 0x00, 0x01, 0x20} + {0x10, 0x02, 0x00, 0x00} )が応答されるはず
108             rx_bytes = comm.receive_from_camera();
109             dump_bytes(11, rx_bytes);
110             Thread.sleep(150);
111
112
113             // 別のポートもオープンして動作を行う。 (1500ms程度待つといけるみたいだ...)
114             Thread.sleep(2000);
115             comm.start_stream();
116             comm.start_response();
117
118             Log.v(TAG, "connect_to_camera DONE.");
119             return (true);
120         }
121         catch (Exception e)
122         {
123             e.printStackTrace();
124         }
125         return (false);
126     }
127
128     public void reset_to_camera()
129     {
130         try
131         {
132             comm.send_to_camera(sequence.reset_message(), true);
133             ReceivedDataHolder rx_bytes = comm.receive_from_camera();
134             dump_bytes(0, rx_bytes);
135             Thread.sleep(150);
136         }
137         catch (Exception e)
138         {
139             e.printStackTrace();
140         }
141     }
142
143     public void disconnect()
144     {
145         try
146         {
147             comm.stop_stream();
148             comm.stop_response();
149             comm.disconnect_socket();
150         }
151         catch (Exception e)
152         {
153             e.printStackTrace();
154         }
155     }
156
157     private boolean get_current_settings()
158     {
159         try
160         {
161             comm.send_to_camera(sequence.status_request_message(), true);
162
163             ReceivedDataHolder rx_bytes = comm.receive_from_camera();
164             dump_bytes(12, rx_bytes);
165
166             // なんで2回... でもやってみる
167             rx_bytes = comm.receive_from_camera();
168             dump_bytes(13, rx_bytes);
169
170         }
171         catch (Exception e)
172         {
173             e.printStackTrace();
174         }
175         return (false);
176     }
177
178     private void dump_bytes(int indexNumber, ReceivedDataHolder data)
179     {
180         int index = 0;
181         StringBuffer message;
182         message = new StringBuffer();
183         for (byte item : data.getData())
184         {
185             index++;
186             message.append(String.format("%02x ", item));
187             if (index >= 8)
188             {
189                 Log.v(TAG, " RX [" + indexNumber + "] " + message);
190                 index = 0;
191                 message = new StringBuffer();
192             }
193         }
194         if (index != 0)
195         {
196             Log.v(TAG, " RX [" + indexNumber + "] "  + message);
197         }
198         System.gc();
199     }
200
201     public boolean execute_shutter()
202     {
203         try
204         {
205             comm.send_to_camera(sequence.execute_shutter_message(), true);
206
207             ReceivedDataHolder rx_bytes = comm.receive_from_camera();
208             dump_bytes(14, rx_bytes);
209
210             // なんで2回受信... でもやってみる
211             rx_bytes = comm.receive_from_camera();
212             dump_bytes(15, rx_bytes);
213         }
214         catch (Exception e)
215         {
216             e.printStackTrace();
217         }
218         return (false);
219     }
220 }