OSDN Git Service

最新SDKに更新。
[gokigen/A01d.git] / app / src / main / java / net / osdn / gokigen / a01d / camera / canon / wrapper / connection / CanonCameraConnectSequence.java
1 package net.osdn.gokigen.a01d.camera.canon.wrapper.connection;
2
3 import android.app.Activity;
4 import android.graphics.Color;
5 import android.util.Log;
6
7 import androidx.annotation.NonNull;
8
9 import net.osdn.gokigen.a01d.R;
10 import net.osdn.gokigen.a01d.camera.ICameraConnection;
11 import net.osdn.gokigen.a01d.camera.ICameraStatusReceiver;
12 import net.osdn.gokigen.a01d.camera.canon.wrapper.command.messages.specific.CanonSetDevicePropertyValue;
13 import net.osdn.gokigen.a01d.camera.canon.wrapper.status.CanonStatusChecker;
14 import net.osdn.gokigen.a01d.camera.ptpip.IPtpIpInterfaceProvider;
15 import net.osdn.gokigen.a01d.camera.canon.wrapper.command.messages.specific.CanonRegistrationMessage;
16 import net.osdn.gokigen.a01d.camera.ptpip.wrapper.command.IPtpIpCommandCallback;
17 import net.osdn.gokigen.a01d.camera.ptpip.wrapper.command.IPtpIpCommandPublisher;
18 import net.osdn.gokigen.a01d.camera.ptpip.wrapper.command.IPtpIpMessages;
19 import net.osdn.gokigen.a01d.camera.ptpip.wrapper.command.messages.PtpIpCommandGeneric;
20
21 /**
22  *   従来のCanonカメラ接続シーケンス
23  *
24  */
25 public class CanonCameraConnectSequence implements Runnable, IPtpIpCommandCallback, IPtpIpMessages
26 {
27     private final String TAG = this.toString();
28
29     private final Activity context;
30     private final ICameraConnection cameraConnection;
31     private final ICameraStatusReceiver cameraStatusReceiver;
32     private final IPtpIpInterfaceProvider interfaceProvider;
33     private final IPtpIpCommandPublisher commandIssuer;
34     private final CanonStatusChecker statusChecker;
35     private final boolean isDumpLog = false;
36
37     CanonCameraConnectSequence(@NonNull Activity context, @NonNull ICameraStatusReceiver statusReceiver, @NonNull final ICameraConnection cameraConnection, @NonNull IPtpIpInterfaceProvider interfaceProvider, @NonNull CanonStatusChecker statusChecker)
38     {
39         Log.v(TAG, " CanonCameraConnectSequence");
40         this.context = context;
41         this.cameraConnection = cameraConnection;
42         this.cameraStatusReceiver = statusReceiver;
43         this.interfaceProvider = interfaceProvider;
44         this.commandIssuer = interfaceProvider.getCommandPublisher();
45         this.statusChecker = statusChecker;
46     }
47
48     @Override
49     public void run()
50     {
51         try
52         {
53             // カメラとTCP接続
54             IPtpIpCommandPublisher issuer = interfaceProvider.getCommandPublisher();
55             if (!issuer.isConnected())
56             {
57                 if (!interfaceProvider.getCommandCommunication().connect())
58                 {
59                     // 接続失敗...
60                     interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.dialog_title_connect_failed_canon), false, true, Color.RED);
61                     onConnectError(context.getString(R.string.dialog_title_connect_failed_canon));
62                     return;
63                 }
64             }
65             else
66             {
67                 Log.v(TAG, "SOCKET IS ALREADY CONNECTED...");
68             }
69             // コマンドタスクの実行開始
70             issuer.start();
71
72             // 接続シーケンスの開始
73             sendRegistrationMessage();
74
75         }
76         catch (Exception e)
77         {
78             e.printStackTrace();
79             interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.dialog_title_connect_failed_canon), false, true, Color.RED);
80             onConnectError(e.getLocalizedMessage());
81         }
82     }
83
84     private void onConnectError(String reason)
85     {
86         cameraConnection.alertConnectingFailed(reason);
87     }
88
89     @Override
90     public void onReceiveProgress(int currentBytes, int totalBytes, byte[] body)
91     {
92         Log.v(TAG, " " + currentBytes + "/" + totalBytes);
93     }
94
95     @Override
96     public boolean isReceiveMulti()
97     {
98         return (false);
99     }
100
101     @Override
102     public void receivedMessage(int id, byte[] rx_body)
103     {
104         switch (id)
105         {
106             case SEQ_REGISTRATION:
107                 if (checkRegistrationMessage(rx_body))
108                 {
109                     sendInitEventRequest(rx_body);
110                 }
111                 else
112                 {
113                     onConnectError(context.getString(R.string.connect_error_message));
114                 }
115                 break;
116
117             case SEQ_EVENT_INITIALIZE:
118                 if (checkEventInitialize(rx_body))
119                 {
120                     interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting1), false, false, 0);
121                     commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_OPEN_SESSION, isDumpLog, 0, 0x1002, 4, 0x41));
122                 }
123                 else
124                 {
125                     onConnectError(context.getString(R.string.connect_error_message));
126                 }
127                 break;
128
129             case SEQ_OPEN_SESSION:
130                 Log.v(TAG, " SEQ_OPEN_SESSION ");
131                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting2), false, false, 0);
132                 commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_INIT_SESSION, isDumpLog, 0, 0x902f));
133                 break;
134
135             case SEQ_INIT_SESSION:
136                 Log.v(TAG, " SEQ_INIT_SESSION ");
137                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting3), false, false, 0);
138                 commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_CHANGE_REMOTE, isDumpLog, 0, 0x9114, 4, 0x15));
139                 break;
140
141             case SEQ_CHANGE_REMOTE:
142                 Log.v(TAG, " SEQ_CHANGE_REMOTE ");
143                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting4), false, false, 0);
144                 commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_SET_EVENT_MODE, isDumpLog, 0, 0x9115, 4, 0x02));
145                 break;
146
147             case SEQ_SET_EVENT_MODE:
148                 Log.v(TAG, " SEQ_SET_EVENT_MODE ");
149                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting5), false, false, 0);
150                 commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_GET_EVENT, isDumpLog, 0, 0x913d, 4, 0x0fff));
151                 break;
152
153             case SEQ_GET_EVENT:
154                 Log.v(TAG, " SEQ_GET_EVENT ");
155                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting6), false, false, 0);
156                 commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_GET_EVENT1, isDumpLog, 0, 0x9033, 4, 0x00000000));
157                 //commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_GET_EVENT1, isDumpLog, 0, 0x9033, 4, 0x00200000));
158                 break;
159
160             case SEQ_GET_EVENT1:
161                 Log.v(TAG, " SEQ_GET_EVENT1 ");
162                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting7), false, false, 0);
163                 commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_DEVICE_INFORMATION, isDumpLog, 0, 0x1001));
164                 break;
165
166             case SEQ_DEVICE_INFORMATION:
167                 Log.v(TAG, " SEQ_DEVICE_INFORMATION ");
168                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting8), false, false, 0);
169                 //commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_DEVICE_PROPERTY, isDumpLog, 0, 0x9127, 4, 0x0000d1a6));
170                 commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_DEVICE_PROPERTY, isDumpLog, 0, 0x9127, 4, 0x0000d1a6));
171                 commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_DEVICE_PROPERTY, isDumpLog, 0, 0x9127, 4, 0x0000d169));
172                 commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_DEVICE_PROPERTY, isDumpLog, 0, 0x9127, 4, 0x0000d16a));
173                 commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_DEVICE_PROPERTY, isDumpLog, 0, 0x9127, 4, 0x0000d16b));
174                 commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_DEVICE_PROPERTY, isDumpLog, 0, 0x9127, 4, 0x0000d1af));
175                 break;
176
177             case SEQ_DEVICE_PROPERTY:
178                 Log.v(TAG, " SEQ_DEVICE_PROPERTY ");
179                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting9), false, false, 0);
180                 if ((rx_body[8] == (byte) 0x01)&&(rx_body[9] == (byte) 0x20))
181                 {
182                     // コマンドが受け付けられたときだけ次に進む!
183                     try
184                     {
185                         // ちょっと(250ms)待つ
186                         Thread.sleep(250);
187
188                         // コマンド発行
189                         commandIssuer.enqueueCommand(new CanonSetDevicePropertyValue(this, SEQ_SET_DEVICE_PROPERTY, isDumpLog, 0, 150, 0xd136, 0x00));
190                     }
191                     catch (Exception e)
192                     {
193                         e.printStackTrace();
194                     }
195                 }
196                 break;
197
198             case SEQ_SET_DEVICE_PROPERTY:
199                 Log.v(TAG, " SEQ_SET_DEVICE_PROPERTY ");
200                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting10), false, false, 0);
201                 commandIssuer.enqueueCommand(new CanonSetDevicePropertyValue(this, SEQ_SET_DEVICE_PROPERTY_2, isDumpLog, 0, 150, 0xd136, 0x01));
202                 break;
203
204             case SEQ_SET_DEVICE_PROPERTY_2:
205                 Log.v(TAG, " SEQ_SET_DEVICE_PROPERTY_2 ");
206                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting11), false, false, 0);
207                 commandIssuer.enqueueCommand(new CanonSetDevicePropertyValue(this, SEQ_SET_DEVICE_PROPERTY_3, isDumpLog, 0, 150, 0xd136, 0x00));
208                 break;
209
210             case SEQ_SET_DEVICE_PROPERTY_3:
211                 Log.v(TAG, " SEQ_SET_DEVICE_PROPERTY_3 ");
212                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.canon_connect_connecting12), false, false, 0);
213                 commandIssuer.enqueueCommand(new CanonSetDevicePropertyValue(this, SEQ_DEVICE_PROPERTY_FINISHED, isDumpLog, 0, 300, 0xd1b0, 0x08));
214                 break;
215
216             case SEQ_DEVICE_PROPERTY_FINISHED:
217                 Log.v(TAG, " SEQ_DEVICE_PROPERTY_FINISHED ");
218                 interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.connect_connect_finished), false, false, 0);
219                 connectFinished();
220                 Log.v(TAG, "CHANGED MODE : DONE.");
221                 break;
222
223             default:
224                 Log.v(TAG, "RECEIVED UNKNOWN ID : " + id);
225                 onConnectError(context.getString(R.string.connect_receive_unknown_message));
226                 break;
227         }
228     }
229
230     private void sendRegistrationMessage()
231     {
232         interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.connect_start), false, false, 0);
233         cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_start));
234         commandIssuer.enqueueCommand(new CanonRegistrationMessage(this));
235     }
236
237     private void sendInitEventRequest(byte[] receiveData)
238     {
239         interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.connect_start_2), false, false, 0);
240         cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_start_2));
241         try
242         {
243             int eventConnectionNumber = (receiveData[8] & 0xff);
244             eventConnectionNumber = eventConnectionNumber + ((receiveData[9]  & 0xff) << 8);
245             eventConnectionNumber = eventConnectionNumber + ((receiveData[10] & 0xff) << 16);
246             eventConnectionNumber = eventConnectionNumber + ((receiveData[11] & 0xff) << 24);
247             statusChecker.setEventConnectionNumber(eventConnectionNumber);
248             interfaceProvider.getCameraStatusWatcher().startStatusWatch(interfaceProvider.getStatusListener());
249
250             commandIssuer.enqueueCommand(new PtpIpCommandGeneric(this, SEQ_OPEN_SESSION, isDumpLog, 0, 0x1002, 4, 0x41));
251         }
252         catch (Exception e)
253         {
254             e.printStackTrace();
255         }
256     }
257
258     private boolean checkRegistrationMessage(byte[] receiveData)
259     {
260         // データ(Connection Number)がないときにはエラーと判断する
261         return (!((receiveData == null)||(receiveData.length < 12)));
262     }
263
264     private boolean checkEventInitialize(byte[] receiveData)
265     {
266         Log.v(TAG, "checkEventInitialize() ");
267         return (!(receiveData == null));
268     }
269
270     private void connectFinished()
271     {
272         try
273         {
274             // 接続成功のメッセージを出す
275             interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.connect_connected), false, false, 0);
276
277             // ちょっと待つ
278             Thread.sleep(500);
279
280             // 接続成功!のメッセージを出す
281             interfaceProvider.getInformationReceiver().updateMessage(context.getString(R.string.connect_connected), false, false, 0);
282
283             onConnectNotify();
284         }
285         catch (Exception e)
286         {
287             e.printStackTrace();
288         }
289     }
290
291     private void onConnectNotify()
292     {
293         try
294         {
295             final Thread thread = new Thread(new Runnable()
296             {
297                 @Override
298                 public void run()
299                 {
300                     // カメラとの接続確立を通知する
301                     cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connected));
302                     cameraStatusReceiver.onCameraConnected();
303                     Log.v(TAG, " onConnectNotify()");
304                 }
305             });
306             thread.start();
307         }
308         catch (Exception e)
309         {
310             e.printStackTrace();
311         }
312     }
313 }