public FujiXInterfaceProvider(@NonNull Activity context, @NonNull ICameraStatusReceiver provider)
{
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
- int communicationTimeoutMs = 5000; // デフォルトは 5000ms とする
+ int communicationTimeoutMs;
try
{
communicationTimeoutMs = Integer.parseInt(preferences.getString(IPreferencePropertyAccessor.RICOH_GET_PICS_LIST_TIMEOUT, IPreferencePropertyAccessor.RICOH_GET_PICS_LIST_TIMEOUT_DEFAULT_VALUE)) * 1000;
statusChecker = new FujiXStatusChecker(context, commandPublisher);
playbackControl = new FujiXPlaybackControl(context, this);
hardwareStatus = new FujiXHardwareStatus();
- runMode = new FujiXRunMode(this);
+ runMode = new FujiXRunMode(this, statusChecker);
}
public void prepare()
private final IFujiXInterfaceProvider interfaceProvider;
private final FujiXCameraModeChangeToLiveView toLiveViewCommand;
private final FujiXCameraModeChangeToPlayback toPlaybackCommand;
+ private final FujiXStatusChecker statusChecker;
private boolean isChanging = false;
- private boolean isRecordingMode = false;
+ private boolean isRecordingMode = true;
private boolean modeChangeIsPending = false;
private ICameraRunModeCallback runModeCallback = null;
- FujiXRunMode(@NonNull IFujiXInterfaceProvider interfaceProvider)
+ FujiXRunMode(@NonNull IFujiXInterfaceProvider interfaceProvider, @NonNull FujiXStatusChecker statusChecker)
{
this.interfaceProvider = interfaceProvider;
+ this.statusChecker = statusChecker;
toLiveViewCommand = new FujiXCameraModeChangeToLiveView(interfaceProvider.getCommandPublisher(), this);
toPlaybackCommand = new FujiXCameraModeChangeToPlayback(interfaceProvider.getCommandPublisher(), this);
}
}
@Override
+ public int getStartLiveViewSequenceNumber()
+ {
+ return (toLiveViewCommand.getChangedSequenceNumber());
+ }
+
+ @Override
public void receivedMessage(int id, byte[] rx_body)
{
- Log.v(TAG, " receivedMessage() " + id);
+ Log.v(TAG, " FujiXRunMode::receivedMessage() " + id);
+ statusChecker.receivedMessage(id, rx_body);
}
@Override
{
void transitToRecordingMode(boolean isFinished);
void transitToPlaybackMode(boolean isFinished);
+
+ int getStartLiveViewSequenceNumber();
}
private final int portNumber;
private boolean isStart = false;
+ private boolean isHold = false;
+ private int holdId = 0;
private Socket socket = null;
private DataOutputStream dos = null;
private BufferedReader bufferedReader = null;
private int sequenceNumber = SEQUENCE_START_NUMBER;
private Queue<IFujiXCommand> commandQueue;
+ private Queue<IFujiXCommand> holdCommandQueue;
public FujiXCommandPublisher(@NonNull String ip, int portNumber)
this.ipAddress = ip;
this.portNumber = portNumber;
this.commandQueue = new ArrayDeque<>();
+ this.holdCommandQueue = new ArrayDeque<>();
commandQueue.clear();
+ holdCommandQueue.clear();
}
@Override
commandQueue.clear();
}
+/*
@Override
public boolean enqueueCommand(@NonNull IFujiXCommand command)
{
}
return (false);
}
+*/
+ @Override
+ public boolean enqueueCommand(@NonNull IFujiXCommand command)
+ {
+ try
+ {
+ if (isHold) {
+ if (holdId == command.getHoldId()) {
+ if (command.isRelease()) {
+ // コマンドをキューに積んだ後、リリースする
+ boolean ret = commandQueue.offer(command);
+ isHold = false;
+
+ // 溜まっているキューを積みなおす
+ while (holdCommandQueue.size() != 0) {
+ IFujiXCommand queuedCommand = holdCommandQueue.poll();
+ commandQueue.offer(queuedCommand);
+ if ((queuedCommand != null)&&(queuedCommand.isHold()))
+ {
+ // 特定シーケンスに入った場合は、そこで積みなおすのをやめる
+ isHold = true;
+ holdId = queuedCommand.getHoldId();
+ break;
+ }
+ }
+ return (ret);
+ }
+ return (commandQueue.offer(command));
+ } else {
+ // 特定シーケンスではなかったので HOLD
+ return (holdCommandQueue.offer(command));
+ }
+ }
+ if (command.isHold())
+ {
+ isHold = true;
+ holdId = command.getHoldId();
+ }
+ //Log.v(TAG, "Enqueue : " + command.getId());
+ return (commandQueue.offer(command));
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ return (false);
+ }
+
+ @Override
+ public boolean flushHoldQueue()
+ {
+ Log.v(TAG, " flushHoldQueue()");
+ holdCommandQueue.clear();
+ System.gc();
+ return (true);
+ }
private void issueCommand(@NonNull IFujiXCommand command)
{
// コマンド送信結果(応答)の通知先
IFujiXCommandCallback responseCallback();
+ // 特定シーケンスを特定するID
+ int getHoldId();
+
+ // 特定シーケンスに入るか?
+ boolean isHold();
+
+ // 特定シーケンスから出るか?
+ boolean isRelease();
+
// デバッグ用: ログ(logcat)に通信結果を残すかどうか
boolean dumpLog();
+
}
boolean isConnected();
boolean enqueueCommand(@NonNull IFujiXCommand command);
+ boolean flushHoldQueue();
+
void start();
void stop();
}
int SEQ_STATUS_REQUEST = 9;
int SEQ_QUERY_CAMERA_CAPABILITIES = 11;
- int SEQ_CHANGE_TO_PLAYBACK_1ST = 12;
- int SEQ_CHANGE_TO_PLAYBACK_2ND = 13;
- int SEQ_CHANGE_TO_PLAYBACK_3RD = 14;
- int SEQ_CHANGE_TO_PLAYBACK_4TH = 15;
+ int SEQ_CHANGE_TO_LIVEVIEW_ZERO = 20;
+ int SEQ_CHANGE_TO_LIVEVIEW_1ST = 21;
+ int SEQ_CHANGE_TO_LIVEVIEW_2ND = 22;
+ int SEQ_CHANGE_TO_LIVEVIEW_3RD = 23;
+ int SEQ_CHANGE_TO_LIVEVIEW_4TH = 24;
+ int SEQ_CHANGE_TO_LIVEVIEW_5TH = 25;
+ int SEQ_CHANGE_TO_LIVEVIEW_6TH = 26;
- int SEQ_CHANGE_TO_LIVEVIEW_1ST = 16;
- int SEQ_CHANGE_TO_LIVEVIEW_2ND = 17;
- int SEQ_CHANGE_TO_LIVEVIEW_3RD = 18;
- int SEQ_CHANGE_TO_LIVEVIEW_4TH = 19;
- int SEQ_CHANGE_TO_LIVEVIEW_5TH = 20;
+ int SEQ_CHANGE_TO_PLAYBACK_ZERO = 30;
+ int SEQ_CHANGE_TO_PLAYBACK_1ST = 31;
+ int SEQ_CHANGE_TO_PLAYBACK_2ND = 32;
+ int SEQ_CHANGE_TO_PLAYBACK_3RD = 33;
+ int SEQ_CHANGE_TO_PLAYBACK_4TH = 34;
+ int SEQ_CHANGE_TO_PLAYBACK_5TH = 35;
+ int SEQ_CHANGE_TO_PLAYBACK_6TH = 36;
+ int SEQ_CHANGE_TO_PLAYBACK_7TH = 37;
- int SEQ_SET_PROPERTY_VALUE = 21;
- int SEQ_FOCUS_LOCK = 22;
- int SEQ_FOCUS_UNLOCK = 23;
- int SEQ_CAPTURE = 24;
+ int SEQ_SET_PROPERTY_VALUE = 100;
+ int SEQ_FOCUS_LOCK = 101;
+ int SEQ_FOCUS_UNLOCK = 102;
+ int SEQ_CAPTURE = 103;
- int SEQ_IMAGE_INFO = 25;
- int SEQ_THUMBNAIL = 26;
- int SEQ_FULL_IMAGE = 27;
+ int SEQ_IMAGE_INFO = 104;
+ int SEQ_THUMBNAIL = 105;
+ int SEQ_FULL_IMAGE = 106;
}
}
@Override
+ public int getHoldId()
+ {
+ return (0);
+ }
+
+ @Override
+ public boolean isHold()
+ {
+ return (false);
+ }
+
+ @Override
+ public boolean isRelease()
+ {
+ return (false);
+ }
+
+ @Override
public boolean dumpLog()
{
return (true);
package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode;
-
import androidx.annotation.NonNull;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
public class ChangeToLiveView1st extends FujiXCommandBase
{
+ private final int holdId;
private final IFujiXCommandCallback callback;
- public ChangeToLiveView1st(@NonNull IFujiXCommandCallback callback)
+ public ChangeToLiveView1st(int holdId, @NonNull IFujiXCommandCallback callback)
{
+ this.holdId = holdId;
this.callback = callback;
}
});
}
+
+ @Override
+ public int getHoldId()
+ {
+ return (holdId);
+ }
+
+ @Override
+ public boolean isHold()
+ {
+ return (true);
+ }
+
+ @Override
+ public boolean isRelease()
+ {
+ return (false);
+ }
}
package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode;
-
import androidx.annotation.NonNull;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
public class ChangeToLiveView2nd extends FujiXCommandBase
{
+ private final int holdId;
private final IFujiXCommandCallback callback;
- public ChangeToLiveView2nd(@NonNull IFujiXCommandCallback callback)
+ public ChangeToLiveView2nd(int holdId, @NonNull IFujiXCommandCallback callback)
{
+ this.holdId = holdId;
this.callback = callback;
}
});
}
+ @Override
+ public int getHoldId()
+ {
+ return (holdId);
+ }
+
+ @Override
+ public boolean isHold()
+ {
+ return (true);
+ }
+
+ @Override
+ public boolean isRelease()
+ {
+ return (false);
+ }
}
package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode;
-
import androidx.annotation.NonNull;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
public class ChangeToLiveView3rd extends FujiXCommandBase
{
+ private final int holdId;
private final IFujiXCommandCallback callback;
- public ChangeToLiveView3rd(@NonNull IFujiXCommandCallback callback)
+ public ChangeToLiveView3rd(int holdId, @NonNull IFujiXCommandCallback callback)
{
+ this.holdId = holdId;
this.callback = callback;
}
(byte)0x24, (byte)0xdf, (byte)0x00, (byte)0x00,
});
}
+
+ @Override
+ public int getHoldId()
+ {
+ return (holdId);
+ }
+
+ @Override
+ public boolean isHold()
+ {
+ return (true);
+ }
+
+ @Override
+ public boolean isRelease()
+ {
+ return (false);
+ }
}
package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode;
-
import androidx.annotation.NonNull;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
public class ChangeToLiveView4th extends FujiXCommandBase
{
+ private final int holdId;
private final IFujiXCommandCallback callback;
- public ChangeToLiveView4th(@NonNull IFujiXCommandCallback callback)
+ public ChangeToLiveView4th(int holdId, @NonNull IFujiXCommandCallback callback)
{
+ this.holdId = holdId;
this.callback = callback;
}
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
// data ...
- (byte)0x07, (byte)0x00, (byte)0x02, (byte)0x00,
+ //(byte)0x07, (byte)0x00, (byte)0x02, (byte)0x00,
+ (byte)0x0a, (byte)0x00, (byte)0x02, (byte)0x00,
});
}
+
+ @Override
+ public int getHoldId()
+ {
+ return (holdId);
+ }
+
+ @Override
+ public boolean isHold()
+ {
+ return (true);
+ }
+
+ @Override
+ public boolean isRelease()
+ {
+ return (false);
+ }
}
package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode;
-
import androidx.annotation.NonNull;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
public class ChangeToLiveView5th extends FujiXCommandBase
{
+ private final int holdId;
private final IFujiXCommandCallback callback;
- public ChangeToLiveView5th(@NonNull IFujiXCommandCallback callback)
+ public ChangeToLiveView5th(int holdId, @NonNull IFujiXCommandCallback callback)
{
+ this.holdId = holdId;
this.callback = callback;
}
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
});
}
+
+ @Override
+ public int getHoldId()
+ {
+ return (holdId);
+ }
+
+ @Override
+ public boolean isHold()
+ {
+ return (true);
+ }
+
+ @Override
+ public boolean isRelease()
+ {
+ return (false);
+ }
}
--- /dev/null
+package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode;
+
+import androidx.annotation.NonNull;
+
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXMessages;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.FujiXCommandBase;
+
+public class ChangeToLiveView6th extends FujiXCommandBase
+{
+ private final int holdId;
+ private final IFujiXCommandCallback callback;
+
+ public ChangeToLiveView6th(int holdId, @NonNull IFujiXCommandCallback callback)
+ {
+ this.holdId = holdId;
+ this.callback = callback;
+ }
+
+ @Override
+ public IFujiXCommandCallback responseCallback()
+ {
+ return (callback);
+ }
+
+ @Override
+ public int getId()
+ {
+ return (IFujiXMessages.SEQ_CHANGE_TO_LIVEVIEW_6TH);
+ }
+
+ @Override
+ public byte[] commandBody()
+ {
+ return (new byte[] {
+ // message_header.index : uint16 (0: terminate, 2: two_part_message, 1: other)
+ (byte)0x01, (byte)0x00,
+
+ // message_header.type : 0x902b
+ (byte)0x2b, (byte)0x90,
+
+ // sequence number
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+
+ // data ...
+ //(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ //(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ });
+ }
+
+ @Override
+ public int getHoldId()
+ {
+ return (holdId);
+ }
+
+ @Override
+ public boolean isHold()
+ {
+ return (false);
+ }
+
+ @Override
+ public boolean isRelease()
+ {
+ return (true);
+ }
+}
--- /dev/null
+package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode;
+
+import androidx.annotation.NonNull;
+
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXMessages;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.FujiXCommandBase;
+
+public class ChangeToLiveViewZero extends FujiXCommandBase
+{
+ private final int holdId;
+ private final IFujiXCommandCallback callback;
+
+ public ChangeToLiveViewZero(int holdId, @NonNull IFujiXCommandCallback callback)
+ {
+ this.holdId = holdId;
+ this.callback = callback;
+ }
+
+ @Override
+ public IFujiXCommandCallback responseCallback()
+ {
+ return (callback);
+ }
+
+ @Override
+ public int getId()
+ {
+ return (IFujiXMessages.SEQ_CHANGE_TO_LIVEVIEW_ZERO);
+ }
+
+ @Override
+ public byte[] commandBody()
+ {
+ return (new byte[] {
+
+ // message_header.index : uint16 (0: terminate, 2: two_part_message, 1: other)
+ (byte)0x01, (byte)0x00,
+
+ // message_header.type : single_part (0x1015) : 0xd212 (status_request)
+ (byte)0x15, (byte)0x10,
+
+ // sequence number
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+
+ // data ...
+ (byte)0x24, (byte)0xdf, (byte)0x00, (byte)0x00,
+ });
+ }
+
+ @Override
+ public int getHoldId()
+ {
+ return (holdId);
+ }
+
+ @Override
+ public boolean isHold()
+ {
+ return (true);
+ }
+
+ @Override
+ public boolean isRelease()
+ {
+ return (false);
+ }
+}
package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode;
-
import androidx.annotation.NonNull;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
public class ChangeToPlayback1st extends FujiXCommandBase
{
+ private final int holdId;
private final IFujiXCommandCallback callback;
- public ChangeToPlayback1st(@NonNull IFujiXCommandCallback callback)
+ public ChangeToPlayback1st(int holdId, @NonNull IFujiXCommandCallback callback)
{
+ this.holdId = holdId;
this.callback = callback;
}
});
}
+
+ @Override
+ public int getHoldId()
+ {
+ return (holdId);
+ }
+
+ @Override
+ public boolean isHold()
+ {
+ return (true);
+ }
+
+ @Override
+ public boolean isRelease()
+ {
+ return (false);
+ }
}
package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode;
-
import androidx.annotation.NonNull;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
public class ChangeToPlayback2nd extends FujiXCommandBase
{
+ private final int holdId;
private final IFujiXCommandCallback callback;
- public ChangeToPlayback2nd(@NonNull IFujiXCommandCallback callback)
+ public ChangeToPlayback2nd(int holdId, @NonNull IFujiXCommandCallback callback)
{
+ this.holdId = holdId;
this.callback = callback;
}
// data ...
(byte)0x0b, (byte)0x00,
+ //(byte)0x05, (byte)0x00,
});
}
+
+ @Override
+ public int getHoldId()
+ {
+ return (holdId);
+ }
+
+ @Override
+ public boolean isHold()
+ {
+ return (true);
+ }
+
+ @Override
+ public boolean isRelease()
+ {
+ return (false);
+ }
}
package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode;
-
import androidx.annotation.NonNull;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXMessages;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.FujiXCommandBase;
-public class ChangeToPlayback3rd extends FujiXCommandBase
+public class ChangeToPlayback3rd extends FujiXCommandBase
{
+ private final int holdId;
private final IFujiXCommandCallback callback;
- public ChangeToPlayback3rd(@NonNull IFujiXCommandCallback callback)
+ public ChangeToPlayback3rd(int holdId, @NonNull IFujiXCommandCallback callback)
{
+ this.holdId = holdId;
this.callback = callback;
}
public byte[] commandBody()
{
return (new byte[] {
-
// message_header.index : uint16 (0: terminate, 2: two_part_message, 1: other)
(byte)0x01, (byte)0x00,
- // message_header.type : single_part (0x1015) : 0xd212 (status_request)
+ // message_header.type : 0x1015
(byte)0x15, (byte)0x10,
// sequence number
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
// data ...
- (byte)0x25, (byte)0xdf, (byte)0x00, (byte)0x00,
+ (byte)0x12, (byte)0xd2, (byte)0x00, (byte)0x00,
+ //(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
});
}
+
+
+ @Override
+ public int getHoldId()
+ {
+ return (holdId);
+ }
+
+ @Override
+ public boolean isHold()
+ {
+ return (true);
+ }
+
+ @Override
+ public boolean isRelease()
+ {
+ return (false);
+ }
}
package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode;
-
import androidx.annotation.NonNull;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXMessages;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.FujiXCommandBase;
-public class ChangeToPlayback4th extends FujiXCommandBase
+public class ChangeToPlayback4th extends FujiXCommandBase
{
+ private final int holdId;
private final IFujiXCommandCallback callback;
- public ChangeToPlayback4th(@NonNull IFujiXCommandCallback callback)
+ public ChangeToPlayback4th(int holdId, @NonNull IFujiXCommandCallback callback)
{
+ this.holdId = holdId;
this.callback = callback;
}
public byte[] commandBody()
{
return (new byte[] {
+
// message_header.index : uint16 (0: terminate, 2: two_part_message, 1: other)
(byte)0x01, (byte)0x00,
- // message_header.type : two_part (0x1016) : SetDevicePropValue
- (byte)0x16, (byte)0x10,
+ // message_header.type : single_part (0x1015) : 0xd212 (status_request)
+ (byte)0x15, (byte)0x10,
// sequence number
(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
}
@Override
- public byte[] commandBody2()
+ public int getHoldId()
{
- return (new byte[] {
- // message_header.index : uint16 (0: terminate, 2: two_part_message, 1: other)
- (byte)0x02, (byte)0x00,
-
- // message_header.type : two_part (0x1016) : SetDevicePropValue
- (byte)0x16, (byte)0x10,
-
- // sequence number
- (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
-
- // data ...
- (byte)0x02, (byte)0x00,
+ return (holdId);
+ }
- });
+ @Override
+ public boolean isHold()
+ {
+ return (true);
}
+ @Override
+ public boolean isRelease()
+ {
+ return (false);
+ }
}
--- /dev/null
+package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode;
+
+import androidx.annotation.NonNull;
+
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXMessages;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.FujiXCommandBase;
+
+public class ChangeToPlayback5th extends FujiXCommandBase
+{
+ private final int holdId;
+ private final IFujiXCommandCallback callback;
+
+ public ChangeToPlayback5th(int holdId, @NonNull IFujiXCommandCallback callback)
+ {
+ this.holdId = holdId;
+ this.callback = callback;
+ }
+
+ @Override
+ public IFujiXCommandCallback responseCallback()
+ {
+ return (callback);
+ }
+
+ @Override
+ public int getId()
+ {
+ return (IFujiXMessages.SEQ_CHANGE_TO_PLAYBACK_5TH);
+ }
+
+ @Override
+ public byte[] commandBody()
+ {
+ return (new byte[] {
+ // message_header.index : uint16 (0: terminate, 2: two_part_message, 1: other)
+ (byte)0x01, (byte)0x00,
+
+ // message_header.type : two_part (0x1016) : SetDevicePropValue
+ (byte)0x16, (byte)0x10,
+
+ // sequence number
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+
+ // data ...
+ (byte)0x25, (byte)0xdf, (byte)0x00, (byte)0x00,
+ });
+ }
+
+ @Override
+ public byte[] commandBody2()
+ {
+ return (new byte[] {
+ // message_header.index : uint16 (0: terminate, 2: two_part_message, 1: other)
+ (byte)0x02, (byte)0x00,
+
+ // message_header.type : two_part (0x1016) : SetDevicePropValue
+ (byte)0x16, (byte)0x10,
+
+ // sequence number
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+
+ // data ...
+ //(byte)0x02, (byte)0x00,
+ (byte)0x04, (byte)0x00,
+
+ });
+ }
+
+ @Override
+ public int getHoldId()
+ {
+ return (holdId);
+ }
+
+ @Override
+ public boolean isHold()
+ {
+ return (true);
+ }
+
+ @Override
+ public boolean isRelease()
+ {
+ return (false);
+ }
+}
--- /dev/null
+package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode;
+
+import androidx.annotation.NonNull;
+
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXMessages;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.FujiXCommandBase;
+
+public class ChangeToPlayback6th extends FujiXCommandBase
+{
+ private final int holdId;
+ private final IFujiXCommandCallback callback;
+
+ public ChangeToPlayback6th(int holdId, @NonNull IFujiXCommandCallback callback)
+ {
+ this.holdId = holdId;
+ this.callback = callback;
+ }
+
+ @Override
+ public IFujiXCommandCallback responseCallback()
+ {
+ return (callback);
+ }
+
+ @Override
+ public int getId()
+ {
+ return (IFujiXMessages.SEQ_CHANGE_TO_PLAYBACK_6TH);
+ }
+
+ @Override
+ public byte[] commandBody()
+ {
+ return (new byte[] {
+ // message_header.index : uint16 (0: terminate, 2: two_part_message, 1: other)
+ (byte)0x01, (byte)0x00,
+
+ // message_header.type : 0x902b
+ (byte)0x2b, (byte)0x90,
+
+ // sequence number
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+
+ // data ...
+ //(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ //(byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ });
+ }
+
+
+ @Override
+ public int getHoldId()
+ {
+ return (holdId);
+ }
+
+ @Override
+ public boolean isHold()
+ {
+ return (false);
+ }
+
+ @Override
+ public boolean isRelease()
+ {
+ return (true);
+ }
+}
--- /dev/null
+package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode;
+
+import androidx.annotation.NonNull;
+
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXMessages;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.FujiXCommandBase;
+
+public class ChangeToPlayback7th extends FujiXCommandBase
+{
+ private final int holdId;
+ private final IFujiXCommandCallback callback;
+
+ public ChangeToPlayback7th(int holdId, @NonNull IFujiXCommandCallback callback)
+ {
+ this.holdId = holdId;
+ this.callback = callback;
+ }
+
+ @Override
+ public IFujiXCommandCallback responseCallback()
+ {
+ return (callback);
+ }
+
+ @Override
+ public int getId()
+ {
+ return (IFujiXMessages.SEQ_CHANGE_TO_PLAYBACK_7TH);
+ }
+
+ @Override
+ public byte[] commandBody()
+ {
+ return (new byte[] {
+
+ // message_header.index : uint16 (0: terminate, 2: two_part_message, 1: other)
+ (byte)0x01, (byte)0x00,
+
+ // message_header.type : single_part (0x1015) : 0xd212 (status_request)
+ (byte)0x15, (byte)0x10,
+
+ // sequence number
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+
+ // data ...
+ (byte)0x25, (byte)0xdf, (byte)0x00, (byte)0x00,
+ });
+ }
+
+ @Override
+ public int getHoldId()
+ {
+ return (holdId);
+ }
+
+ @Override
+ public boolean isHold()
+ {
+ return (true);
+ }
+
+ @Override
+ public boolean isRelease()
+ {
+ return (false);
+ }
+}
--- /dev/null
+package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode;
+
+import androidx.annotation.NonNull;
+
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXMessages;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.FujiXCommandBase;
+
+public class ChangeToPlaybackZero extends FujiXCommandBase
+{
+ private final int holdId;
+ private final IFujiXCommandCallback callback;
+
+ private final byte data0;
+ private final byte data1;
+ private final byte data2;
+ private final byte data3;
+
+ public ChangeToPlaybackZero(int holdId, int value, @NonNull IFujiXCommandCallback callback)
+ {
+ this.holdId = holdId;
+ this.callback = callback;
+
+ data0 = ((byte) (0x000000ff & value));
+ data1 = ((byte)((0x0000ff00 & value) >> 8));
+ data2 = ((byte)((0x00ff0000 & value) >> 16));
+ data3 = ((byte)((0xff000000 & value) >> 24));
+ }
+
+ @Override
+ public IFujiXCommandCallback responseCallback()
+ {
+ return (callback);
+ }
+
+ @Override
+ public int getId()
+ {
+ return (IFujiXMessages.SEQ_CHANGE_TO_PLAYBACK_ZERO);
+ }
+
+ @Override
+ public byte[] commandBody()
+ {
+ return (new byte[] {
+
+ // message_header.index : uint16 (0: terminate, 2: two_part_message, 1: other)
+ (byte)0x01, (byte)0x00,
+
+ ////////
+ (byte)0x18, (byte)0x10,
+
+ // sequence number
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+
+ // data ...
+ data0, data1, data2, data3,
+ });
+ }
+
+ @Override
+ public int getHoldId()
+ {
+ return (holdId);
+ }
+
+ @Override
+ public boolean isHold()
+ {
+ return (true);
+ }
+
+ @Override
+ public boolean isRelease()
+ {
+ return (false);
+ }
+}
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode.ChangeToLiveView3rd;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode.ChangeToLiveView4th;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode.ChangeToLiveView5th;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode.ChangeToLiveView6th;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode.ChangeToLiveViewZero;
public class FujiXCameraModeChangeToLiveView implements View.OnClickListener, IFujiXCommandCallback
{
private final String TAG = toString();
+ private static final int COMMANDID_CHANGE_TO_LIVEVIEW = 100;
private final IFujiXCommandPublisher publisher;
private final IFujiXCommandCallback callback;
private IFujiXRunModeHolder runModeHolder = null;
+ private int changedLiveviewSeqNumber = 8;
public FujiXCameraModeChangeToLiveView(@NonNull IFujiXCommandPublisher publisher, @Nullable IFujiXCommandCallback callback)
{
public void startModeChange(IFujiXRunModeHolder runModeHolder)
{
- Log.v(TAG, " startModeChange()");
+ Log.v(TAG, " startModeChange() : FujiXCameraModeChangeToLiveView");
try
{
if (runModeHolder != null)
this.runModeHolder = runModeHolder;
this.runModeHolder.transitToRecordingMode(false);
}
- publisher.enqueueCommand(new ChangeToLiveView1st(this));
+ publisher.enqueueCommand(new ChangeToLiveViewZero(COMMANDID_CHANGE_TO_LIVEVIEW,this));
}
catch (Exception e)
{
{
switch (id)
{
+ case IFujiXMessages.SEQ_CHANGE_TO_LIVEVIEW_ZERO:
+ publisher.enqueueCommand(new ChangeToLiveView1st(COMMANDID_CHANGE_TO_LIVEVIEW,this));
+ break;
+
case IFujiXMessages.SEQ_CHANGE_TO_LIVEVIEW_1ST:
- publisher.enqueueCommand(new ChangeToLiveView2nd(this));
+ publisher.enqueueCommand(new ChangeToLiveView2nd(COMMANDID_CHANGE_TO_LIVEVIEW,this));
break;
case IFujiXMessages.SEQ_CHANGE_TO_LIVEVIEW_2ND:
- publisher.enqueueCommand(new ChangeToLiveView3rd(this));
+ publisher.enqueueCommand(new ChangeToLiveView3rd(COMMANDID_CHANGE_TO_LIVEVIEW,this));
break;
case IFujiXMessages.SEQ_CHANGE_TO_LIVEVIEW_3RD:
- publisher.enqueueCommand(new ChangeToLiveView4th(this));
+ publisher.enqueueCommand(new ChangeToLiveView4th(COMMANDID_CHANGE_TO_LIVEVIEW,this));
break;
case IFujiXMessages.SEQ_CHANGE_TO_LIVEVIEW_4TH:
- publisher.enqueueCommand(new ChangeToLiveView5th(this));
+ publisher.enqueueCommand(new ChangeToLiveView6th(COMMANDID_CHANGE_TO_LIVEVIEW,this));
break;
case IFujiXMessages.SEQ_CHANGE_TO_LIVEVIEW_5TH:
+ //publisher.enqueueCommand(new ChangeToLiveView6th(COMMANDID_CHANGE_TO_LIVEVIEW,this));
+
+ // Liveview切り替え時のシーケンス番号を記憶する
+ changedLiveviewSeqNumber = getSequenceNumber(rx_body);
publisher.enqueueCommand(new StatusRequestMessage(this));
break;
+ case IFujiXMessages.SEQ_CHANGE_TO_LIVEVIEW_6TH:
+ publisher.enqueueCommand(new ChangeToLiveView5th(COMMANDID_CHANGE_TO_LIVEVIEW,this));
+ //publisher.enqueueCommand(new StatusRequestMessage(this));
+ break;
+
case IFujiXMessages.SEQ_STATUS_REQUEST:
if (callback != null)
{
{
runModeHolder.transitToRecordingMode(true);
}
- Log.v(TAG, " CHANGED LIVEVIEW MODE : DONE.");
+ Log.v(TAG, " - - - - - CHANGED LIVEVIEW MODE : DONE.");
break;
default:
e.printStackTrace();
}
}
+
+ private int getSequenceNumber(byte[] byte_array)
+ {
+ int seqNumber = 8; // 起動時の初期値...
+ try
+ {
+ if (byte_array.length > 11)
+ {
+ seqNumber = ((((int) byte_array[11]) & 0xff) << 24) + ((((int) byte_array[10]) & 0xff) << 16) + ((((int) byte_array[9]) & 0xff) << 8) + (((int) byte_array[8]) & 0xff);
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ return (seqNumber);
+ }
+
+ public int getChangedSequenceNumber()
+ {
+ return (changedLiveviewSeqNumber);
+ }
+
}
import androidx.annotation.Nullable;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.IFujiXRunModeHolder;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommand;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandCallback;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandPublisher;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXMessages;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode.ChangeToPlayback1st;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode.ChangeToPlayback2nd;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode.ChangeToPlayback3rd;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode.ChangeToPlayback6th;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode.ChangeToPlayback7th;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode.ChangeToPlaybackZero;
import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode.ChangeToPlayback4th;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.changemode.ChangeToPlayback5th;
public class FujiXCameraModeChangeToPlayback implements View.OnClickListener, IFujiXCommandCallback
{
private final String TAG = toString();
+ private static final int COMMANDID_CHANGE_TO_PLAYBACK = 200;
private final IFujiXCommandPublisher publisher;
private final IFujiXCommandCallback callback;
private IFujiXRunModeHolder runModeHolder = null;
this.callback = callback;
}
- public void startModeChange(IFujiXRunModeHolder runModeHolder)
+ public void startModeChange(@Nullable IFujiXRunModeHolder runModeHolder)
{
- Log.v(TAG, "startModeChange()");
+ Log.v(TAG, " startModeChange() : FujiXCameraModeChangeToPlayback");
try
{
+ int seqNumber = 8;
if (runModeHolder != null)
{
this.runModeHolder = runModeHolder;
this.runModeHolder.transitToPlaybackMode(false);
+ seqNumber = runModeHolder.getStartLiveViewSequenceNumber();
}
- publisher.enqueueCommand(new ChangeToPlayback1st(this));
+ publisher.enqueueCommand(new ChangeToPlaybackZero(COMMANDID_CHANGE_TO_PLAYBACK, seqNumber, this));
}
catch (Exception e)
{
@Override
public void receivedMessage(int id, byte[] rx_body)
{
- //Log.v(TAG, "receivedMessage : " + id + "[" + rx_body.length + " bytes]");
- //int bodyLength = 0;
try
{
switch (id)
{
+ case IFujiXMessages.SEQ_CHANGE_TO_PLAYBACK_ZERO:
+ enqueueCommand(id, rx_body, new ChangeToPlayback1st(COMMANDID_CHANGE_TO_PLAYBACK,this));
+ break;
+
case IFujiXMessages.SEQ_CHANGE_TO_PLAYBACK_1ST:
- publisher.enqueueCommand(new ChangeToPlayback2nd(this));
+ enqueueCommand(id, rx_body, new ChangeToPlayback3rd(COMMANDID_CHANGE_TO_PLAYBACK,this));
break;
case IFujiXMessages.SEQ_CHANGE_TO_PLAYBACK_2ND:
- publisher.enqueueCommand(new ChangeToPlayback3rd(this));
- //publisher.enqueueCommand(new StatusRequestMessage(this));
+ enqueueCommand(id, rx_body, new ChangeToPlayback7th(COMMANDID_CHANGE_TO_PLAYBACK,this));
break;
case IFujiXMessages.SEQ_CHANGE_TO_PLAYBACK_3RD:
- publisher.enqueueCommand(new ChangeToPlayback4th(this));
+ enqueueCommand(id, rx_body, new ChangeToPlayback4th(COMMANDID_CHANGE_TO_PLAYBACK,this));
break;
case IFujiXMessages.SEQ_CHANGE_TO_PLAYBACK_4TH:
- publisher.enqueueCommand(new StatusRequestMessage(this));
+ enqueueCommand(id, rx_body, new ChangeToPlayback2nd(COMMANDID_CHANGE_TO_PLAYBACK,this));
+ break;
+
+ case IFujiXMessages.SEQ_CHANGE_TO_PLAYBACK_5TH:
+ enqueueCommand(id, rx_body, new ChangeToPlayback6th(COMMANDID_CHANGE_TO_PLAYBACK,this));
+ break;
+
+ case IFujiXMessages.SEQ_CHANGE_TO_PLAYBACK_6TH:
+ enqueueCommand(id, rx_body, new StatusRequestMessage(this));
+ break;
+
+ case IFujiXMessages.SEQ_CHANGE_TO_PLAYBACK_7TH:
+ enqueueCommand(id, rx_body, new ChangeToPlayback5th(COMMANDID_CHANGE_TO_PLAYBACK,this));
break;
case IFujiXMessages.SEQ_STATUS_REQUEST:
{
runModeHolder.transitToPlaybackMode(true);
}
- Log.v(TAG, " CHANGED PLAYBACK MODE : DONE.");
+ Log.v(TAG, " - - - - - CHANGED PLAYBACK MODE : DONE.");
break;
default:
e.printStackTrace();
}
}
+
+ private void enqueueCommand(int id, byte[] rx_body, IFujiXCommand command)
+ {
+ //Log.v(TAG, " --- receivedMessage : " + id + "[" + rx_body.length + " bytes]");
+ publisher.enqueueCommand(command);
+ }
+
}
@Override
public void showPictureStarted()
{
+ try
+ {
+ Log.v(TAG, " showPictureStarted() ");
+ IFujiXCommandPublisher publisher = provider.getCommandPublisher();
+ publisher.flushHoldQueue();
+ System.gc();
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
}
@Override
public void showPictureFinished()
{
+ try
+ {
+ Log.v(TAG, " showPictureFinished() ");
+ IFujiXCommandPublisher publisher = provider.getCommandPublisher();
+ publisher.flushHoldQueue();
+ System.gc();
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
}
private void getCameraContents(ICameraContentListCallback callback)
runMode.changeRunMode(false, this);
return;
}
+
+ try
+ {
+ // 画像表示が開始することを通知する
+ playbackControl.showPictureStarted();
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+
viewPager.setCurrentItem(contentIndex);
}
}
}
+ try
+ {
+ // 画像表示が終わったことを通知する
+ playbackControl.showPictureFinished();
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+
if (!runMode.isRecordingMode())
{
// Threadで呼んではダメみたいだ...
private PreferenceFragmentCompat preferenceFragment = null;
private LogCatFragment logCatFragment = null;
+ private ImageGridViewFragment imageGridViewFragment = null;
public static CameraSceneUpdater newInstance(@NonNull AppCompatActivity activity)
{
Log.v(TAG, "changeScenceToImageList()");
try
{
- ImageGridViewFragment fragment = ImageGridViewFragment.newInstance(interfaceProvider.getPlaybackControl(), interfaceProvider.getCameraRunMode());
+ if (imageGridViewFragment == null)
+ {
+ imageGridViewFragment = ImageGridViewFragment.newInstance(interfaceProvider.getPlaybackControl(), interfaceProvider.getCameraRunMode());
+ }
FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction();
- transaction.replace(R.id.fragment1, fragment);
+ transaction.replace(R.id.fragment1, imageGridViewFragment);
// backstackに追加
transaction.addToBackStack(null);
transaction.commit();