1 package net.osdn.gokigen.pkremote.camera.vendor.fujix.wrapper.connection;
3 import android.app.Activity;
4 import android.content.SharedPreferences;
5 import android.util.Log;
7 import androidx.annotation.NonNull;
8 import androidx.preference.PreferenceManager;
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;
33 public class FujiXCameraConnectSequenceForPlayback implements Runnable, IFujiXCommandCallback, IFujiXMessages
35 private final String TAG = this.toString();
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;
44 FujiXCameraConnectSequenceForPlayback(@NonNull Activity context, @NonNull ICameraStatusReceiver statusReceiver, @NonNull final ICameraConnection cameraConnection, @NonNull IFujiXInterfaceProvider interfaceProvider)
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();
61 SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
62 isBothLiveView = preferences.getBoolean(IPreferencePropertyAccessor.FUJIX_DISPLAY_CAMERA_VIEW, false);
66 //isBothLiveView = false;
71 IFujiXCommandPublisher issuer = interfaceProvider.getCommandPublisher();
72 if (!issuer.isConnected())
74 if (!interfaceProvider.getCommandCommunication().connect())
77 onConnectError(context.getString(R.string.dialog_title_connect_failed));
85 sendRegistrationMessage();
91 onConnectError(e.getLocalizedMessage());
95 private void onConnectError(String reason)
97 cameraConnection.alertConnectingFailed(reason);
101 public void onReceiveProgress(int currentBytes, int totalBytes, byte[] body)
103 Log.v(TAG, " " + currentBytes + "/" + totalBytes);
107 public boolean isReceiveMulti()
113 public void receivedMessage(int id, byte[] rx_body)
115 //Log.v(TAG, "receivedMessage : " + id + "[" + rx_body.length + " bytes]");
116 //int bodyLength = 0;
117 IFujiXRunModeHolder runModeHolder;
120 case SEQ_REGISTRATION:
121 if (checkRegistrationMessage(rx_body))
123 commandIssuer.enqueueCommand(new StartMessage(this));
127 onConnectError(context.getString(R.string.connect_error_message));
132 commandIssuer.enqueueCommand(new StartMessage2ndRead(this));
135 case SEQ_START_2ND_READ:
136 cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting));
137 if (rx_body.length == (int)rx_body[0])
139 // なぜかもうちょっとデータが飛んでくるので待つ
140 //commandIssuer.enqueueCommand(new ReceiveOnly(this));
142 commandIssuer.enqueueCommand(new StartMessage3rd(this));
146 commandIssuer.enqueueCommand(new StartMessage3rd(this));
150 case SEQ_START_2ND_RECEIVE:
151 commandIssuer.enqueueCommand(new StartMessage3rd(this));
155 commandIssuer.enqueueCommand(new StartMessage4th(this));
161 // カメラのLCDと遠隔のライブビューを同時に表示する場合...
162 commandIssuer.enqueueCommand(new CameraRemoteMessage(this));
166 commandIssuer.enqueueCommand(new StartMessage5th(this));
171 commandIssuer.enqueueCommand(new QueryCameraCapabilities(this));
172 //commandIssuer.enqueueCommand(new StatusRequestMessage(this));
175 case SEQ_QUERY_CAMERA_CAPABILITIES:
176 commandIssuer.enqueueCommand(new CameraRemoteMessage(this));
179 case SEQ_CAMERA_REMOTE:
180 commandIssuer.enqueueCommand(new ChangeToPlayback1st(this));
181 runModeHolder = interfaceProvider.getRunModeHolder();
182 if (runModeHolder != null)
184 runModeHolder.transitToPlaybackMode(false);
189 case SEQ_CHANGE_TO_PLAYBACK_1ST:
190 commandIssuer.enqueueCommand(new ChangeToPlayback2nd(this));
193 case SEQ_CHANGE_TO_PLAYBACK_2ND:
194 commandIssuer.enqueueCommand(new ChangeToPlayback3rd(this));
197 case SEQ_CHANGE_TO_PLAYBACK_3RD:
198 commandIssuer.enqueueCommand(new ChangeToPlayback4th(this));
201 case SEQ_CHANGE_TO_PLAYBACK_4TH:
202 commandIssuer.enqueueCommand(new StatusRequestMessage(this));
205 case SEQ_STATUS_REQUEST:
206 IFujiXCommandCallback callback = interfaceProvider.getStatusHolder();
207 if (callback != null)
209 callback.receivedMessage(id, rx_body);
211 runModeHolder = interfaceProvider.getRunModeHolder();
212 if (runModeHolder != null)
214 runModeHolder.transitToPlaybackMode(true);
217 Log.v(TAG, "CHANGED PLAYBACK MODE : DONE.");
221 Log.v(TAG, "RECEIVED UNKNOWN ID : " + id);
222 onConnectError(context.getString(R.string.connect_receive_unknown_message));
227 private void sendRegistrationMessage()
229 cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_start));
230 commandIssuer.enqueueCommand(new RegistrationMessage(this));
233 private boolean checkRegistrationMessage(byte[] receiveData)
236 if ((receiveData == null)||(receiveData.length < 8))
242 if (receiveData.length == 8)
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)) {
255 private void connectFinished()
261 interfaceProvider.getAsyncEventCommunication().connect();
262 //interfaceProvider.getCameraStatusWatcher().startStatusWatch(interfaceProvider.getStatusListener()); ステータスの定期確認は実施しない
271 private void onConnectNotify()
275 final Thread thread = new Thread(new Runnable()
281 cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connected));
282 cameraStatusReceiver.onCameraConnected();
283 Log.v(TAG, "onConnectNotify()");