OSDN Git Service

FujiXのJPEGダウンロード機能を追加。
[gokigen/PKRemote.git] / app / src / main / java / net / osdn / gokigen / pkremote / camera / vendor / fujix / wrapper / connection / FujiXCameraConnectSequenceForPlayback.java
1 package net.osdn.gokigen.pkremote.camera.vendor.fujix.wrapper.connection;
2
3 import android.app.Activity;
4 import android.content.SharedPreferences;
5 import android.util.Log;
6
7 import androidx.annotation.NonNull;
8 import androidx.preference.PreferenceManager;
9
10 import net.osdn.gokigen.pkremote.R;
11 import net.osdn.gokigen.pkremote.camera.interfaces.control.ICameraConnection;
12 import net.osdn.gokigen.pkremote.camera.interfaces.status.ICameraStatusReceiver;
13 import net.osdn.gokigen.pkremote.camera.vendor.fujix.IFujiXInterfaceProvider;
14 import net.osdn.gokigen.pkremote.camera.vendor.fujix.wrapper.command.IFujiXCommandCallback;
15 import net.osdn.gokigen.pkremote.camera.vendor.fujix.wrapper.command.IFujiXCommandPublisher;
16 import net.osdn.gokigen.pkremote.camera.vendor.fujix.wrapper.command.IFujiXMessages;
17 import net.osdn.gokigen.pkremote.camera.vendor.fujix.wrapper.command.messages.QueryCameraCapabilities;
18 import net.osdn.gokigen.pkremote.camera.vendor.fujix.wrapper.command.messages.StatusRequestMessage;
19 import net.osdn.gokigen.pkremote.camera.vendor.fujix.wrapper.command.messages.changemode.ChangeToPlayback1st;
20 import net.osdn.gokigen.pkremote.camera.vendor.fujix.wrapper.command.messages.changemode.ChangeToPlayback2nd;
21 import net.osdn.gokigen.pkremote.camera.vendor.fujix.wrapper.command.messages.changemode.ChangeToPlayback3rd;
22 import net.osdn.gokigen.pkremote.camera.vendor.fujix.wrapper.command.messages.changemode.ChangeToPlayback4th;
23 import net.osdn.gokigen.pkremote.camera.vendor.fujix.wrapper.command.messages.start.CameraRemoteMessage;
24 import net.osdn.gokigen.pkremote.camera.vendor.fujix.wrapper.command.messages.start.RegistrationMessage;
25 import net.osdn.gokigen.pkremote.camera.vendor.fujix.wrapper.command.messages.start.StartMessage;
26 import net.osdn.gokigen.pkremote.camera.vendor.fujix.wrapper.command.messages.start.StartMessage2ndRead;
27 import net.osdn.gokigen.pkremote.camera.vendor.fujix.wrapper.command.messages.start.StartMessage3rd;
28 import net.osdn.gokigen.pkremote.camera.vendor.fujix.wrapper.command.messages.start.StartMessage4th;
29 import net.osdn.gokigen.pkremote.camera.vendor.fujix.wrapper.command.messages.start.StartMessage5th;
30 import net.osdn.gokigen.pkremote.camera.vendor.fujix.wrapper.status.IFujiXRunModeHolder;
31 import net.osdn.gokigen.pkremote.preference.IPreferencePropertyAccessor;
32
33 public class FujiXCameraConnectSequenceForPlayback implements Runnable, IFujiXCommandCallback, IFujiXMessages
34 {
35     private final String TAG = this.toString();
36
37     private final Activity context;
38     private final ICameraConnection cameraConnection;
39     private final ICameraStatusReceiver cameraStatusReceiver;
40     private final IFujiXInterfaceProvider interfaceProvider;
41     private final IFujiXCommandPublisher commandIssuer;
42     private boolean isBothLiveView = false;
43
44     FujiXCameraConnectSequenceForPlayback(@NonNull Activity context, @NonNull ICameraStatusReceiver statusReceiver, @NonNull final ICameraConnection cameraConnection, @NonNull IFujiXInterfaceProvider interfaceProvider)
45     {
46         Log.v(TAG, " FujiXCameraConnectSequenceForPlayback");
47         this.context = context;
48         this.cameraConnection = cameraConnection;
49         this.cameraStatusReceiver = statusReceiver;
50         this.interfaceProvider = interfaceProvider;
51         this.commandIssuer = interfaceProvider.getCommandPublisher();
52     }
53
54     @Override
55     public void run()
56     {
57         try
58         {
59             try
60             {
61                 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
62                 isBothLiveView = preferences.getBoolean(IPreferencePropertyAccessor.FUJIX_DISPLAY_CAMERA_VIEW, false);
63             }
64             catch (Exception e)
65             {
66                 //isBothLiveView = false;
67                 e.printStackTrace();
68             }
69
70             // カメラとTCP接続
71             IFujiXCommandPublisher issuer = interfaceProvider.getCommandPublisher();
72             if (!issuer.isConnected())
73             {
74                 if (!interfaceProvider.getCommandCommunication().connect())
75                 {
76                     // 接続失敗...
77                     onConnectError(context.getString(R.string.dialog_title_connect_failed));
78                     return;
79                 }
80             }
81             // コマンドタスクの実行開始
82             issuer.start();
83
84             // 接続シーケンスの開始
85             sendRegistrationMessage();
86
87         }
88         catch (Exception e)
89         {
90             e.printStackTrace();
91             onConnectError(e.getLocalizedMessage());
92         }
93     }
94
95     private void onConnectError(String reason)
96     {
97         cameraConnection.alertConnectingFailed(reason);
98     }
99
100     @Override
101     public void onReceiveProgress(int currentBytes, int totalBytes, byte[] body)
102     {
103         Log.v(TAG, " " + currentBytes + "/" + totalBytes);
104     }
105
106     @Override
107     public boolean isReceiveMulti()
108     {
109         return (false);
110     }
111
112     @Override
113     public void receivedMessage(int id, byte[] rx_body)
114     {
115         //Log.v(TAG, "receivedMessage : " + id + "[" + rx_body.length + " bytes]");
116         //int bodyLength = 0;
117         IFujiXRunModeHolder runModeHolder;
118         switch (id)
119         {
120             case SEQ_REGISTRATION:
121                 if (checkRegistrationMessage(rx_body))
122                 {
123                     commandIssuer.enqueueCommand(new StartMessage(this));
124                 }
125                 else
126                 {
127                     onConnectError(context.getString(R.string.connect_error_message));
128                 }
129                 break;
130
131             case SEQ_START:
132                 commandIssuer.enqueueCommand(new StartMessage2ndRead(this));
133                 break;
134
135             case SEQ_START_2ND_READ:
136                 cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting));
137                 if (rx_body.length == (int)rx_body[0])
138                 {
139                     // なぜかもうちょっとデータが飛んでくるので待つ
140                     //commandIssuer.enqueueCommand(new ReceiveOnly(this));
141
142                     commandIssuer.enqueueCommand(new StartMessage3rd(this));
143                 }
144                 else
145                 {
146                     commandIssuer.enqueueCommand(new StartMessage3rd(this));
147                 }
148                 break;
149
150             case SEQ_START_2ND_RECEIVE:
151                 commandIssuer.enqueueCommand(new StartMessage3rd(this));
152                 break;
153
154             case SEQ_START_3RD:
155                 commandIssuer.enqueueCommand(new StartMessage4th(this));
156                 break;
157
158             case SEQ_START_4TH:
159                 if (isBothLiveView)
160                 {
161                     // カメラのLCDと遠隔のライブビューを同時に表示する場合...
162                     commandIssuer.enqueueCommand(new CameraRemoteMessage(this));
163                 }
164                 else
165                 {
166                     commandIssuer.enqueueCommand(new StartMessage5th(this));
167                 }
168                 break;
169
170             case SEQ_START_5TH:
171                 commandIssuer.enqueueCommand(new QueryCameraCapabilities(this));
172                 //commandIssuer.enqueueCommand(new StatusRequestMessage(this));
173                 break;
174
175             case SEQ_QUERY_CAMERA_CAPABILITIES:
176                 commandIssuer.enqueueCommand(new CameraRemoteMessage(this));
177                 break;
178
179             case SEQ_CAMERA_REMOTE:
180                 commandIssuer.enqueueCommand(new ChangeToPlayback1st(this));
181                 runModeHolder = interfaceProvider.getRunModeHolder();
182                 if (runModeHolder != null)
183                 {
184                     runModeHolder.transitToPlaybackMode(false);
185                 }
186                 //connectFinished();
187                 break;
188
189             case SEQ_CHANGE_TO_PLAYBACK_1ST:
190                 commandIssuer.enqueueCommand(new ChangeToPlayback2nd(this));
191                 break;
192
193             case SEQ_CHANGE_TO_PLAYBACK_2ND:
194                 commandIssuer.enqueueCommand(new ChangeToPlayback3rd(this));
195                 break;
196
197             case SEQ_CHANGE_TO_PLAYBACK_3RD:
198                 commandIssuer.enqueueCommand(new ChangeToPlayback4th(this));
199                 break;
200
201             case SEQ_CHANGE_TO_PLAYBACK_4TH:
202                 commandIssuer.enqueueCommand(new StatusRequestMessage(this));
203                 break;
204
205             case SEQ_STATUS_REQUEST:
206                 IFujiXCommandCallback callback = interfaceProvider.getStatusHolder();
207                 if (callback != null)
208                 {
209                     callback.receivedMessage(id, rx_body);
210                 }
211                 runModeHolder = interfaceProvider.getRunModeHolder();
212                 if (runModeHolder != null)
213                 {
214                     runModeHolder.transitToPlaybackMode(true);
215                 }
216                 connectFinished();
217                 Log.v(TAG, "CHANGED PLAYBACK MODE : DONE.");
218                 break;
219
220             default:
221                 Log.v(TAG, "RECEIVED UNKNOWN ID : " + id);
222                 onConnectError(context.getString(R.string.connect_receive_unknown_message));
223                 break;
224         }
225     }
226
227     private void sendRegistrationMessage()
228     {
229         cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_start));
230         commandIssuer.enqueueCommand(new RegistrationMessage(this));
231     }
232
233     private boolean checkRegistrationMessage(byte[] receiveData)
234     {
235         // データがないときにはエラー
236         if ((receiveData == null)||(receiveData.length < 8))
237         {
238             return (false);
239         }
240
241         // 応答エラーかどうかをチェックする
242         if (receiveData.length == 8)
243         {
244             if ((receiveData[0] == 0x05) && (receiveData[1] == 0x00) && (receiveData[2] == 0x00) && (receiveData[3] == 0x00) &&
245                     (receiveData[4] == 0x19) && (receiveData[5] == 0x20) && (receiveData[6] == 0x00) && (receiveData[7] == 0x00)) {
246                 // 応答エラー...
247                 return (false);
248             }
249             return (false);
250         }
251         return (true);
252     }
253
254
255     private void connectFinished()
256     {
257         try
258         {
259             // ちょっと待つ
260             Thread.sleep(1000);
261             interfaceProvider.getAsyncEventCommunication().connect();
262             //interfaceProvider.getCameraStatusWatcher().startStatusWatch(interfaceProvider.getStatusListener());  ステータスの定期確認は実施しない
263             onConnectNotify();
264         }
265         catch (Exception e)
266         {
267             e.printStackTrace();
268         }
269     }
270
271     private void onConnectNotify()
272     {
273         try
274         {
275             final Thread thread = new Thread(new Runnable()
276             {
277                 @Override
278                 public void run()
279                 {
280                     // カメラとの接続確立を通知する
281                     cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connected));
282                     cameraStatusReceiver.onCameraConnected();
283                     Log.v(TAG, "onConnectNotify()");
284                 }
285             });
286             thread.start();
287         }
288         catch (Exception e)
289         {
290             e.printStackTrace();
291         }
292     }
293
294 }