package net.osdn.gokigen.a01d;
- import android.Manifest;
- import android.content.SharedPreferences;
- import android.content.pm.PackageManager;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.WindowManager;
- import android.widget.Toast;
-
- import net.osdn.gokigen.a01d.camera.CameraInterfaceProvider;
- import net.osdn.gokigen.a01d.camera.IInterfaceProvider;
- import net.osdn.gokigen.a01d.camera.fujix.cameraproperty.FujiXCameraCommandSendDialog;
- import net.osdn.gokigen.a01d.camera.olympus.cameraproperty.OlyCameraPropertyListFragment;
- import net.osdn.gokigen.a01d.camera.ICameraStatusReceiver;
- import net.osdn.gokigen.a01d.camera.ICameraConnection;
- import net.osdn.gokigen.a01d.camera.olympus.wrapper.connection.ble.ICameraPowerOn;
- import net.osdn.gokigen.a01d.camera.panasonic.operation.PanasonicSendCommandDialog;
- import net.osdn.gokigen.a01d.camera.sony.cameraproperty.SonyCameraApiListFragment;
- import net.osdn.gokigen.a01d.liveview.IStatusViewDrawer;
- import net.osdn.gokigen.a01d.liveview.LiveViewFragment;
- import net.osdn.gokigen.a01d.logcat.LogCatFragment;
- import net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor;
- import net.osdn.gokigen.a01d.preference.fujix.FujiXPreferenceFragment;
- import net.osdn.gokigen.a01d.preference.olympus.PreferenceFragment;
- import net.osdn.gokigen.a01d.preference.panasonic.PanasonicPreferenceFragment;
- import net.osdn.gokigen.a01d.preference.ricohgr2.RicohGr2PreferenceFragment;
- import net.osdn.gokigen.a01d.preference.sony.SonyPreferenceFragment;
-
- import androidx.annotation.NonNull;
- import androidx.appcompat.app.ActionBar;
- import androidx.appcompat.app.AppCompatActivity;
- import androidx.core.app.ActivityCompat;
- import androidx.core.content.ContextCompat;
- import androidx.fragment.app.FragmentTransaction;
- import androidx.preference.PreferenceFragmentCompat;
- import androidx.preference.PreferenceManager;
+import android.Manifest;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.util.Log;
+import android.view.WindowManager;
+import android.widget.Toast;
+
+import net.osdn.gokigen.a01d.camera.CameraInterfaceProvider;
+import net.osdn.gokigen.a01d.camera.IInterfaceProvider;
+import net.osdn.gokigen.a01d.camera.fujix.cameraproperty.FujiXCameraCommandSendDialog;
+import net.osdn.gokigen.a01d.camera.olympus.cameraproperty.OlyCameraPropertyListFragment;
+import net.osdn.gokigen.a01d.camera.ICameraStatusReceiver;
+import net.osdn.gokigen.a01d.camera.ICameraConnection;
+import net.osdn.gokigen.a01d.camera.olympus.wrapper.connection.ble.ICameraPowerOn;
+import net.osdn.gokigen.a01d.camera.panasonic.operation.PanasonicSendCommandDialog;
+import net.osdn.gokigen.a01d.camera.sony.cameraproperty.SonyCameraApiListFragment;
+import net.osdn.gokigen.a01d.liveview.IStatusViewDrawer;
+import net.osdn.gokigen.a01d.liveview.LiveViewFragment;
+import net.osdn.gokigen.a01d.logcat.LogCatFragment;
+import net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor;
+import net.osdn.gokigen.a01d.preference.fujix.FujiXPreferenceFragment;
+import net.osdn.gokigen.a01d.preference.olympus.PreferenceFragment;
+import net.osdn.gokigen.a01d.preference.panasonic.PanasonicPreferenceFragment;
+import net.osdn.gokigen.a01d.preference.ricohgr2.RicohGr2PreferenceFragment;
+import net.osdn.gokigen.a01d.preference.sony.SonyPreferenceFragment;
+
+import androidx.annotation.NonNull;
+import androidx.appcompat.app.ActionBar;
+import androidx.appcompat.app.AppCompatActivity;
+import androidx.core.app.ActivityCompat;
+import androidx.core.content.ContextCompat;
+import androidx.fragment.app.FragmentTransaction;
+import androidx.preference.PreferenceFragmentCompat;
+import androidx.preference.PreferenceManager;
/**
* A01d ;
@Override
public void updateCameraStatus(String message)
{
-
+ //Log.v(TAG, "updateCameraStatus() : " + message);
+ try
+ {
+ if (updateReceiver != null)
+ {
+ updateReceiver.updateCameraStatus(message);
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
}
@Override
import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.IFujiXCommandCallback;
import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.IFujiXCommandPublisher;
import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.IFujiXCommunication;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.status.IFujiXRunModeHolder;
import net.osdn.gokigen.a01d.liveview.ICameraStatusUpdateNotify;
import net.osdn.gokigen.a01d.liveview.liveviewlistener.ILiveViewListener;
ICaptureControl getCaptureControl();
IDisplayInjector getDisplayInjector();
+ IFujiXRunModeHolder getRunModeHolder();
+ IFujiXCommandCallback getStatusHolder();
IFujiXCommandPublisher getCommandPublisher();
IFujiXCommunication getLiveviewCommunication();
IFujiXCommunication getAsyncEventCommunication();
IFujiXCommunication getCommandCommunication();
ICameraStatusWatcher getStatusWatcher();
ICameraStatusUpdateNotify getStatusListener();
- ICameraStatus getCameraStatus();
+
+ ICameraStatusWatcher getCameraStatusWatcher();
+ ICameraStatus getCameraStatusListHolder();
+
void setAsyncEventReceiver(@NonNull IFujiXCommandCallback receiver);
}
package net.osdn.gokigen.a01d.camera.fujix.cameraproperty;
import android.app.Activity;
+import android.util.Log;
import android.widget.TextView;
import androidx.annotation.NonNull;
class FujiXCameraCommandResponse implements IFujiXCommandCallback
{
+ private final String TAG = toString();
private final Activity activity;
private final TextView field;
}
}
+ @Override
+ public void onReceiveProgress(int currentBytes, int totalBytes, byte[] body)
+ {
+ Log.v(TAG, " " + currentBytes + "/" + totalBytes);
+ }
+
+ @Override
+ public boolean isReceiveMulti()
+ {
+ return (false);
+ }
@Override
public void receivedMessage(int id, byte[] rx_body)
private void prepare(@NonNull IFujiXInterfaceProvider interfaceProvider)
{
- this.cameraStatus = interfaceProvider.getCameraStatus();
+ this.cameraStatus = interfaceProvider.getCameraStatusListHolder();
}
/**
Log.v(TAG, "Response Received.");
frameDisplay.hideFocusFrame();
}
+
+ @Override
+ public void onReceiveProgress(int currentBytes, int totalBytes, byte[] body)
+ {
+ Log.v(TAG, " " + currentBytes + "/" + totalBytes);
+ }
+
+ @Override
+ public boolean isReceiveMulti()
+ {
+ return (false);
+ }
}
indicator.onAfLockUpdate(false);
}
+ @Override
+ public void onReceiveProgress(int currentBytes, int totalBytes, byte[] body)
+ {
+ Log.v(TAG, " " + currentBytes + "/" + totalBytes);
+ }
+
+ @Override
+ public boolean isReceiveMulti()
+ {
+ return (false);
+ }
@Override
public void receivedMessage(int id, byte[] rx_body)
import net.osdn.gokigen.a01d.camera.fujix.wrapper.connection.FujiXConnection;
import net.osdn.gokigen.a01d.camera.fujix.wrapper.liveview.FujiXLiveViewControl;
import net.osdn.gokigen.a01d.camera.fujix.wrapper.status.FujiXStatusChecker;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.status.IFujiXRunModeHolder;
import net.osdn.gokigen.a01d.liveview.IAutoFocusFrameDisplay;
import net.osdn.gokigen.a01d.liveview.ICameraStatusUpdateNotify;
import net.osdn.gokigen.a01d.liveview.IIndicatorControl;
private FujiXFocusingControl focusingControl;
private FujiXStatusChecker statusChecker;
private ICameraStatusUpdateNotify statusListener;
+ private FujiXRunMode runmode;
+
public FujiXInterfaceProvider(@NonNull Activity context, @NonNull ICameraStatusReceiver provider, @NonNull ICameraStatusUpdateNotify statusListener)
{
fujiXConnection = new FujiXConnection(context, provider, this);
zoomControl = new FujiXZoomControl();
statusChecker = new FujiXStatusChecker(activity, commandPublisher);
+ this.runmode = new FujiXRunMode();
this.statusListener = statusListener;
}
}
@Override
+ public IFujiXRunModeHolder getRunModeHolder()
+ {
+ return (runmode);
+ }
+
+ @Override
+ public IFujiXCommandCallback getStatusHolder() {
+ return (statusChecker);
+ }
+
+ @Override
public IFujiXCommandPublisher getCommandPublisher()
{
return (commandPublisher);
}
@Override
+ public ICameraStatusWatcher getCameraStatusWatcher()
+ {
+ return (statusChecker);
+ }
+
+ @Override
public ICameraStatusUpdateNotify getStatusListener()
{
return (statusListener);
}
@Override
- public ICameraStatus getCameraStatus()
+ public ICameraStatus getCameraStatusListHolder()
{
return (statusChecker);
}
--- /dev/null
+package net.osdn.gokigen.a01d.camera.fujix.wrapper;
+
+import android.util.Log;
+
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.status.IFujiXRunModeHolder;
+import net.osdn.gokigen.a01d.camera.olympus.wrapper.ICameraRunMode;
+
+public class FujiXRunMode implements ICameraRunMode, IFujiXRunModeHolder
+{
+ private final String TAG = toString();
+ private boolean isChanging = false;
+ private boolean isRecordingMode = false;
+
+ FujiXRunMode()
+ {
+ //
+ }
+
+ @Override
+ public void changeRunMode(boolean isRecording)
+ {
+ // 何もしない
+ Log.v(TAG, "changeRunMode() : " + isRecording);
+ }
+
+ @Override
+ public boolean isRecordingMode()
+ {
+ Log.v(TAG, "isRecordingMode() : " + isRecordingMode + " (" + isChanging + ")");
+
+ if (isChanging)
+ {
+ // モード変更中の場合は、かならず false を応答する
+ return (false);
+ }
+ return (isRecordingMode);
+ }
+
+ @Override
+ public void transitToRecordingMode(boolean isFinished)
+ {
+ isChanging = !isFinished;
+ isRecordingMode = true;
+ }
+
+ @Override
+ public void transitToPlaybackMode(boolean isFinished)
+ {
+ isChanging = !isFinished;
+ isRecordingMode = false;
+ }
+}
public interface IFujiXCommandCallback
{
void receivedMessage(int id, byte[] rx_body);
+ void onReceiveProgress(int currentBytes, int totalBytes, byte[] rx_body);
+ boolean isReceiveMulti();
}
int SEQ_CHANGE_TO_LIVEVIEW_4TH = 19;
int SEQ_CHANGE_TO_LIVEVIEW_5TH = 20;
+ int SEQ_SET_PROPERTY_VALUE = 21;
+ int SEQ_FOCUS_LOCK = 22;
+ int SEQ_FOCUS_UNLOCK = 23;
+ int SEQ_CAPTURE = 24;
+ int SEQ_IMAGE_INFO = 25;
+ int SEQ_THUMBNAIL = 26;
+ int SEQ_FULL_IMAGE = 27;
}
@Override
public int getId()
{
- return (0);
+ return (FujiXCameraConnectSequence.SEQ_CAPTURE);
}
@Override
import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.IFujiXCommandCallback;
import net.osdn.gokigen.a01d.camera.fujix.wrapper.connection.FujiXCameraConnectSequence;
-import static net.osdn.gokigen.a01d.camera.fujix.operation.FujiXFocusingControl.FOCUS_LOCK;
-
public class FocusLock extends FujiXCommandBase
{
private final IFujiXCommandCallback callback;
@Override
public int getId()
{
- return (FOCUS_LOCK);
+ return (FujiXCameraConnectSequence.SEQ_FOCUS_LOCK);
}
@Override
import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.IFujiXCommandCallback;
import net.osdn.gokigen.a01d.camera.fujix.wrapper.connection.FujiXCameraConnectSequence;
-import static net.osdn.gokigen.a01d.camera.fujix.operation.FujiXFocusingControl.FOCUS_UNLOCK;
-
public class FocusUnlock extends FujiXCommandBase
{
private final IFujiXCommandCallback callback;
@Override
public int getId()
{
- return (FOCUS_UNLOCK);
+ return (FujiXCameraConnectSequence.SEQ_FOCUS_UNLOCK);
}
@Override
--- /dev/null
+package net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages;
+
+import androidx.annotation.NonNull;
+
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.IFujiXCommandCallback;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.connection.FujiXCameraConnectSequence;
+
+public class GetFullImage extends FujiXCommandBase
+{
+ private final IFujiXCommandCallback callback;
+ private final byte lower;
+ private final byte upper;
+
+ public GetFullImage(int indexNumber, @NonNull IFujiXCommandCallback callback)
+ {
+ this.lower = ((byte) (0x000000ff & indexNumber));
+ this.upper = ((byte)((0x0000ff00 & indexNumber) >> 8));
+ this.callback = callback;
+ }
+
+ @Override
+ public IFujiXCommandCallback responseCallback()
+ {
+ return (callback);
+ }
+
+ @Override
+ public int getId()
+ {
+ return (FujiXCameraConnectSequence.SEQ_FULL_IMAGE);
+ }
+
+ @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 : full_image (0x101b)
+ (byte)0x1b, (byte)0x10,
+
+ // sequence number
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+
+ // data ... (index number)
+ lower, upper, (byte)0x00, (byte)0x00,
+
+ // 現物合わせ1 : 0~
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+ // 現物合わせ2 : ~0x01000000 bytes
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x01,
+ });
+ }
+ @Override
+ public boolean dumpLog()
+ {
+ return (false);
+ }
+}
--- /dev/null
+package net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages;
+
+import androidx.annotation.NonNull;
+
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.IFujiXCommandCallback;
+
+public class GetImageInfo extends FujiXCommandBase
+{
+ private final IFujiXCommandCallback callback;
+ private final int id;
+ private final byte lower;
+ private final byte upper;
+
+ public GetImageInfo(int id, int indexNumber, @NonNull IFujiXCommandCallback callback)
+ {
+ this.id = id;
+ this.lower = ((byte) (0x000000ff & indexNumber));
+ this.upper = ((byte)((0x0000ff00 & indexNumber) >> 8));
+ this.callback = callback;
+ }
+
+ @Override
+ public IFujiXCommandCallback responseCallback()
+ {
+ return (callback);
+ }
+
+ @Override
+ public int getId()
+ {
+ return (id);
+ }
+
+ @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 : image_info (0x1008)
+ (byte)0x08, (byte)0x10,
+
+ // sequence number
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+
+ // data ...
+ lower, upper, (byte)0x00, (byte)0x00,
+ });
+ }
+ @Override
+ public boolean dumpLog()
+ {
+ return (false);
+ }
+}
--- /dev/null
+package net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages;
+
+import androidx.annotation.NonNull;
+
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.IFujiXCommandCallback;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.connection.FujiXCameraConnectSequence;
+
+public class GetThumbNail extends FujiXCommandBase
+{
+ private final IFujiXCommandCallback callback;
+ private final byte lower;
+ private final byte upper;
+
+ public GetThumbNail(int indexNumber, @NonNull IFujiXCommandCallback callback)
+ {
+ this.lower = ((byte) (0x000000ff & indexNumber));
+ this.upper = ((byte)((0x0000ff00 & indexNumber) >> 8));
+ this.callback = callback;
+ }
+
+ @Override
+ public IFujiXCommandCallback responseCallback()
+ {
+ return (callback);
+ }
+
+ @Override
+ public int getId()
+ {
+ return (FujiXCameraConnectSequence.SEQ_THUMBNAIL);
+ }
+
+ @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 : ThumbNail (0x100a)
+ (byte)0x0a, (byte)0x10,
+
+ // sequence number
+ (byte)0x00, (byte)0x00, (byte)0x00, (byte)0x00,
+
+ // data ...
+ lower, upper, (byte)0x00, (byte)0x00,
+ });
+ }
+ @Override
+ public boolean dumpLog()
+ {
+ return (false);
+ }
+}
@Override
public int getId()
{
- return (FujiXCameraConnectSequence.SEQ_STATUS_REQUEST);
+ return (FujiXCameraConnectSequence.SEQ_SET_PROPERTY_VALUE);
}
@Override
}
@Override
+ public void onReceiveProgress(int currentBytes, int totalBytes, byte[] body)
+ {
+ Log.v(TAG, " " + currentBytes + "/" + totalBytes);
+ }
+
+ @Override
+ public boolean isReceiveMulti()
+ {
+ return (false);
+ }
+
+ @Override
public void receivedMessage(int id, byte[] rx_body)
{
//Log.v(TAG, "receivedMessage : " + id + "[" + rx_body.length + " bytes]");
switch (id)
{
case SEQ_REGISTRATION:
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting));
if (checkRegistrationMessage(rx_body))
{
commandIssuer.enqueueCommand(new StartMessage(this));
break;
case SEQ_START:
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting1));
commandIssuer.enqueueCommand(new StartMessage2nd(this));
break;
case SEQ_START_2ND:
- cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting));
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting2));
if (rx_body.length == (int)rx_body[0])
{
// なぜかもうちょっとデータが飛んでくるので待つ
break;
case SEQ_START_2ND_RECEIVE:
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting3));
commandIssuer.enqueueCommand(new StartMessage3rd(this));
break;
case SEQ_START_3RD:
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting4));
commandIssuer.enqueueCommand(new StartMessage4th(this));
break;
}
break;
case SEQ_START_5TH:
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting6));
commandIssuer.enqueueCommand(new StatusRequestMessage(this));
break;
case SEQ_STATUS_REQUEST:
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting8));
commandIssuer.enqueueCommand(new QueryCameraCapabilities(this));
break;
case SEQ_QUERY_CAMERA_CAPABILITIES:
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting10));
commandIssuer.enqueueCommand(new CameraRemoteMessage(this));
break;
case SEQ_CAMERA_REMOTE:
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting12));
connectFinished();
break;
{
// ちょっと待つ
Thread.sleep(1000);
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connected));
interfaceProvider.getAsyncEventCommunication().connect();
- interfaceProvider.getStatusWatcher().startStatusWatch(interfaceProvider.getStatusListener());
+ interfaceProvider.getCameraStatusWatcher().startStatusWatch(interfaceProvider.getStatusListener());
onConnectNotify();
}
catch (Exception e)
--- /dev/null
+package net.osdn.gokigen.a01d.camera.fujix.wrapper.connection;
+
+import android.app.Activity;
+import android.content.SharedPreferences;
+import android.util.Log;
+
+import androidx.annotation.NonNull;
+import androidx.preference.PreferenceManager;
+
+import net.osdn.gokigen.a01d.R;
+import net.osdn.gokigen.a01d.camera.ICameraConnection;
+import net.osdn.gokigen.a01d.camera.ICameraStatusReceiver;
+import net.osdn.gokigen.a01d.camera.fujix.IFujiXInterfaceProvider;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.IFujiXCommandCallback;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.IFujiXCommandPublisher;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.IFujiXMessages;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.QueryCameraCapabilities;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.StatusRequestMessage;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.changemode.ChangeToPlayback1st;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.changemode.ChangeToPlayback2nd;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.changemode.ChangeToPlayback3rd;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.changemode.ChangeToPlayback4th;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.start.CameraRemoteMessage;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.start.RegistrationMessage;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.start.StartMessage;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.start.StartMessage2ndRead;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.start.StartMessage3rd;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.start.StartMessage4th;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.start.StartMessage5th;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.status.IFujiXRunModeHolder;
+import net.osdn.gokigen.a01d.preference.IPreferencePropertyAccessor;
+
+public class FujiXCameraConnectSequenceForPlayback implements Runnable, IFujiXCommandCallback, IFujiXMessages
+{
+ private final String TAG = this.toString();
+
+ private final Activity context;
+ private final ICameraConnection cameraConnection;
+ private final ICameraStatusReceiver cameraStatusReceiver;
+ private final IFujiXInterfaceProvider interfaceProvider;
+ private final IFujiXCommandPublisher commandIssuer;
+ private boolean isBothLiveView = false;
+
+ FujiXCameraConnectSequenceForPlayback(@NonNull Activity context, @NonNull ICameraStatusReceiver statusReceiver, @NonNull final ICameraConnection cameraConnection, @NonNull IFujiXInterfaceProvider interfaceProvider)
+ {
+ Log.v(TAG, " FujiXCameraConnectSequenceForPlayback");
+ this.context = context;
+ this.cameraConnection = cameraConnection;
+ this.cameraStatusReceiver = statusReceiver;
+ this.interfaceProvider = interfaceProvider;
+ this.commandIssuer = interfaceProvider.getCommandPublisher();
+ }
+
+ @Override
+ public void run()
+ {
+ try
+ {
+ try
+ {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
+ isBothLiveView = preferences.getBoolean(IPreferencePropertyAccessor.FUJIX_DISPLAY_CAMERA_VIEW, false);
+ }
+ catch (Exception e)
+ {
+ //isBothLiveView = false;
+ e.printStackTrace();
+ }
+
+ // カメラとTCP接続
+ IFujiXCommandPublisher issuer = interfaceProvider.getCommandPublisher();
+ if (!issuer.isConnected())
+ {
+ if (!interfaceProvider.getCommandCommunication().connect())
+ {
+ // 接続失敗...
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.dialog_title_connect_failed));
+ }
+ onConnectError(context.getString(R.string.dialog_title_connect_failed));
+ return;
+ }
+ }
+ else
+ {
+ Log.v(TAG, "SOCKET IS ALREADY CONNECTED...");
+ }
+ // コマンドタスクの実行開始
+ issuer.start();
+
+ // 接続シーケンスの開始
+ sendRegistrationMessage();
+
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.dialog_title_connect_failed));
+ }
+ onConnectError(e.getLocalizedMessage());
+ }
+ }
+
+ private void onConnectError(String reason)
+ {
+ cameraConnection.alertConnectingFailed(reason);
+ }
+
+ @Override
+ public void onReceiveProgress(int currentBytes, int totalBytes, byte[] body)
+ {
+ Log.v(TAG, " " + currentBytes + "/" + totalBytes);
+ }
+
+ @Override
+ public boolean isReceiveMulti()
+ {
+ return (false);
+ }
+
+ @Override
+ public void receivedMessage(int id, byte[] rx_body)
+ {
+ //Log.v(TAG, "receivedMessage : " + id + "[" + rx_body.length + " bytes]");
+ //int bodyLength = 0;
+ IFujiXRunModeHolder runModeHolder;
+ switch (id)
+ {
+ case SEQ_REGISTRATION:
+ if (checkRegistrationMessage(rx_body))
+ {
+ commandIssuer.enqueueCommand(new StartMessage(this));
+ }
+ else
+ {
+ onConnectError(context.getString(R.string.connect_error_message));
+ }
+ break;
+
+ case SEQ_START:
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting1));
+ }
+ commandIssuer.enqueueCommand(new StartMessage2ndRead(this));
+ break;
+
+ case SEQ_START_2ND_READ:
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting2));
+ }
+ if (rx_body.length == (int)rx_body[0])
+ {
+ // なぜかもうちょっとデータが飛んでくるので待つ
+ //commandIssuer.enqueueCommand(new ReceiveOnly(this));
+
+ commandIssuer.enqueueCommand(new StartMessage3rd(this));
+ }
+ else
+ {
+ commandIssuer.enqueueCommand(new StartMessage3rd(this));
+ }
+ break;
+
+ case SEQ_START_2ND_RECEIVE:
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting3));
+ }
+ commandIssuer.enqueueCommand(new StartMessage3rd(this));
+ break;
+
+ case SEQ_START_3RD:
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting4));
+ }
+ commandIssuer.enqueueCommand(new StartMessage4th(this));
+ break;
+
+ case SEQ_START_4TH:
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting5));
+ }
+ if (isBothLiveView)
+ {
+ // カメラのLCDと遠隔のライブビューを同時に表示する場合...
+ commandIssuer.enqueueCommand(new CameraRemoteMessage(this));
+ }
+ else
+ {
+ commandIssuer.enqueueCommand(new StartMessage5th(this));
+ }
+ break;
+
+ case SEQ_START_5TH:
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting6));
+ }
+ commandIssuer.enqueueCommand(new QueryCameraCapabilities(this));
+ //commandIssuer.enqueueCommand(new StatusRequestMessage(this));
+ break;
+
+ case SEQ_QUERY_CAMERA_CAPABILITIES:
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting7));
+ }
+ commandIssuer.enqueueCommand(new CameraRemoteMessage(this));
+ break;
+
+ case SEQ_CAMERA_REMOTE:
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting8));
+ }
+ commandIssuer.enqueueCommand(new ChangeToPlayback1st(this));
+ runModeHolder = interfaceProvider.getRunModeHolder();
+ if (runModeHolder != null)
+ {
+ runModeHolder.transitToPlaybackMode(false);
+ }
+ //connectFinished();
+ break;
+
+ case SEQ_CHANGE_TO_PLAYBACK_1ST:
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting9));
+ }
+ commandIssuer.enqueueCommand(new ChangeToPlayback2nd(this));
+ break;
+
+ case SEQ_CHANGE_TO_PLAYBACK_2ND:
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting10));
+ }
+ commandIssuer.enqueueCommand(new ChangeToPlayback3rd(this));
+ break;
+
+ case SEQ_CHANGE_TO_PLAYBACK_3RD:
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting11));
+ }
+ commandIssuer.enqueueCommand(new ChangeToPlayback4th(this));
+ break;
+
+ case SEQ_CHANGE_TO_PLAYBACK_4TH:
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting12));
+ }
+ commandIssuer.enqueueCommand(new StatusRequestMessage(this));
+ break;
+
+ case SEQ_STATUS_REQUEST:
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connect_finished));
+ }
+ IFujiXCommandCallback callback = interfaceProvider.getStatusHolder();
+ if (callback != null)
+ {
+ callback.receivedMessage(id, rx_body);
+ }
+ runModeHolder = interfaceProvider.getRunModeHolder();
+ if (runModeHolder != null)
+ {
+ runModeHolder.transitToPlaybackMode(true);
+ }
+ connectFinished();
+ Log.v(TAG, "CHANGED PLAYBACK MODE : DONE.");
+ break;
+
+ default:
+ Log.v(TAG, "RECEIVED UNKNOWN ID : " + id);
+ onConnectError(context.getString(R.string.connect_receive_unknown_message));
+ break;
+ }
+ }
+
+ private void sendRegistrationMessage()
+ {
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_start));
+ }
+ commandIssuer.enqueueCommand(new RegistrationMessage(this));
+ }
+
+ private boolean checkRegistrationMessage(byte[] receiveData)
+ {
+ // データがないときにはエラー
+ if ((receiveData == null)||(receiveData.length < 8))
+ {
+ return (false);
+ }
+
+ // 応答エラーかどうかをチェックする
+ if (receiveData.length == 8)
+ {
+ if ((receiveData[0] == 0x05) && (receiveData[1] == 0x00) && (receiveData[2] == 0x00) && (receiveData[3] == 0x00) &&
+ (receiveData[4] == 0x19) && (receiveData[5] == 0x20) && (receiveData[6] == 0x00) && (receiveData[7] == 0x00)) {
+ // 応答エラー...
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.error_reply_from_camera));
+ }
+ return (false);
+ }
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.other_error_reply_from_camera));
+ }
+ return (false);
+ }
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.registration_reply_from_camera));
+ }
+ return (true);
+ }
+
+
+ private void connectFinished()
+ {
+ try
+ {
+ // 接続成功のメッセージを出す
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connected));
+ }
+
+ // ちょっと待つ
+ Thread.sleep(1000);
+
+ interfaceProvider.getAsyncEventCommunication().connect();
+ //interfaceProvider.getCameraStatusWatcher().startStatusWatch(interfaceProvider.getStatusListener()); ステータスの定期確認は実施しない
+
+ // 接続成功!のメッセージを出す
+ if (cameraStatusReceiver != null)
+ {
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connected));
+ }
+
+ onConnectNotify();
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+ private void onConnectNotify()
+ {
+ try
+ {
+ final Thread thread = new Thread(new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ // カメラとの接続確立を通知する
+ cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connected));
+ cameraStatusReceiver.onCameraConnected();
+ Log.v(TAG, "onConnectNotify()");
+ }
+ });
+ thread.start();
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+
+}
}
@Override
+ public void onReceiveProgress(int currentBytes, int totalBytes, byte[] body)
+ {
+ Log.v(TAG, " " + currentBytes + "/" + totalBytes);
+ }
+
+ @Override
+ public boolean isReceiveMulti()
+ {
+ return (false);
+ }
+
+ @Override
public void receivedMessage(int id, byte[] rx_body)
{
//Log.v(TAG, "receivedMessage : " + id + "[" + rx_body.length + " bytes]");
// ちょっと待つ
Thread.sleep(1000);
interfaceProvider.getAsyncEventCommunication().connect();
- //interfaceProvider.getStatusWatcher().startStatusWatch(interfaceProvider.getStatusListener()); ステータスの定期確認は実施しない
+ //interfaceProvider.getCameraStatusWatcher().startStatusWatch(interfaceProvider.getStatusListener()); ステータスの定期確認は実施しない
onConnectNotify();
}
catch (Exception e)
import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.changemode.ChangeToLiveView3rd;
import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.changemode.ChangeToLiveView4th;
import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.changemode.ChangeToLiveView5th;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.status.IFujiXRunModeHolder;
public class FujiXCameraModeChangeToLiveView implements View.OnClickListener, IFujiXCommandCallback, IFujiXMessages
private final String TAG = toString();
private final IFujiXCommandPublisher publisher;
private final IFujiXCommandCallback callback;
+ private IFujiXRunModeHolder runModeHolder = null;
public FujiXCameraModeChangeToLiveView(@NonNull IFujiXCommandPublisher publisher, @Nullable IFujiXCommandCallback callback)
{
this.callback = callback;
}
- @Override
- public void onClick(View v)
+ public void startModeChange(IFujiXRunModeHolder runModeHolder)
{
Log.v(TAG, "onClick");
try
{
+ if (runModeHolder != null)
+ {
+ this.runModeHolder = runModeHolder;
+ this.runModeHolder.transitToRecordingMode(false);
+ }
publisher.enqueueCommand(new ChangeToLiveView1st(this));
}
catch (Exception e)
}
@Override
+ public void onClick(View v)
+ {
+ Log.v(TAG, "onClick");
+ startModeChange(null);
+ }
+
+ @Override
+ public void onReceiveProgress(int currentBytes, int totalBytes, byte[] body)
+ {
+ Log.v(TAG, " " + currentBytes + "/" + totalBytes);
+ }
+
+ @Override
+ public boolean isReceiveMulti()
+ {
+ return (false);
+ }
+
+ @Override
public void receivedMessage(int id, byte[] rx_body)
{
//Log.v(TAG, "receivedMessage : " + id + "[" + rx_body.length + " bytes]");
{
callback.receivedMessage(id, rx_body);
}
+ if (runModeHolder != null)
+ {
+ runModeHolder.transitToRecordingMode(true);
+ }
Log.v(TAG, "CHANGED LIVEVIEW MODE : DONE.");
break;
import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.changemode.ChangeToPlayback2nd;
import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.changemode.ChangeToPlayback3rd;
import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.changemode.ChangeToPlayback4th;
+import net.osdn.gokigen.a01d.camera.fujix.wrapper.status.IFujiXRunModeHolder;
public class FujiXCameraModeChangeToPlayback implements View.OnClickListener, IFujiXCommandCallback, IFujiXMessages
{
private final String TAG = toString();
private final IFujiXCommandPublisher publisher;
private final IFujiXCommandCallback callback;
+ private IFujiXRunModeHolder runModeHolder = null;
public FujiXCameraModeChangeToPlayback(@NonNull IFujiXCommandPublisher publisher, @Nullable IFujiXCommandCallback callback)
{
this.callback = callback;
}
- @Override
- public void onClick(View v)
+ public void startModeChange(IFujiXRunModeHolder runModeHolder)
{
Log.v(TAG, "onClick");
try
{
+ if (runModeHolder != null)
+ {
+ this.runModeHolder = runModeHolder;
+ this.runModeHolder.transitToPlaybackMode(false);
+ }
publisher.enqueueCommand(new ChangeToPlayback1st(this));
}
catch (Exception e)
}
}
+
+ @Override
+ public void onClick(View v)
+ {
+ Log.v(TAG, "onClick");
+ startModeChange(null);
+ }
+
+ @Override
+ public void onReceiveProgress(int currentBytes, int totalBytes, byte[] body)
+ {
+ Log.v(TAG, " " + currentBytes + "/" + totalBytes);
+ }
+
+ @Override
+ public boolean isReceiveMulti()
+ {
+ return (false);
+ }
+
@Override
public void receivedMessage(int id, byte[] rx_body)
{
{
callback.receivedMessage(id, rx_body);
}
+ if (runModeHolder != null)
+ {
+ runModeHolder.transitToPlaybackMode(true);
+ }
Log.v(TAG, "CHANGED PLAYBACK MODE : DONE.");
break;
private void onReceiveBroadcastOfConnection(Context context, Intent intent)
{
statusReceiver.onStatusNotify(context.getString(R.string.connect_check_wifi));
+
Log.v(TAG, context.getString(R.string.connect_check_wifi));
String action = intent.getAction();
public void startWatchWifiStatus(Context context)
{
Log.v(TAG, "startWatchWifiStatus()");
- statusReceiver.onStatusNotify("prepare");
+ statusReceiver.onStatusNotify(context.getString(R.string.connect_prepare));
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
@Override
public void onClick(DialogInterface dialog, int which)
{
+ disconnect(false);
connect();
}
})
}
@Override
+ public void onReceiveProgress(int currentBytes, int totalBytes, byte[] body)
+ {
+ Log.v(TAG, " " + currentBytes + "/" + totalBytes);
+ }
+
+ @Override
+ public boolean isReceiveMulti()
+ {
+ return (false);
+ }
+
+ @Override
public void receivedMessage(int id, byte[] data)
{
try
try
{
int strIndex = key.indexOf("x");
- if (strIndex > 1)
+ Log.v(TAG, "getItemStatus() : " + key + " [" + strIndex + "]");
+ if (strIndex >= 1)
{
key = key.substring(strIndex + 1);
try
--- /dev/null
+package net.osdn.gokigen.a01d.camera.fujix.wrapper.status;
+
+public interface IFujiXRunModeHolder
+{
+ void transitToRecordingMode(boolean isFinished);
+ void transitToPlaybackMode(boolean isFinished);
+}
@Override
public void updateCameraStatus(String message)
{
- Log.v(TAG, "updateCameraStatus() : " + message);
+ try
+ {
+ updateStatusView(message);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
}
@Override
--- /dev/null
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="24dp"
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FF000000"
+ android:pathData="M21,5v6.59l-3,-3.01 -4,4.01 -4,-4 -4,4 -3,-3.01L3,5c0,-1.1 0.9,-2 2,-2h14c1.1,0 2,0.9 2,2zM18,11.42l3,3.01L21,19c0,1.1 -0.9,2 -2,2L5,21c-1.1,0 -2,-0.9 -2,-2v-6.58l3,2.99 4,-4 4,4 4,-3.99z"/>
+</vector>
<string name="dialog_service_hint">(service)</string>
<string name="panasonic_service_string">cam.cgi</string>
+ <string name="error_reply_from_camera">カメラからエラー応答…</string>
+ <string name="other_error_reply_from_camera">カメラから不明なエラー応答…</string>
+ <string name="registration_reply_from_camera">接続要求</string>
+ <string name="connect_connected2">接続完了!</string>
+ <string name="connect_prepare">準備中…</string>
+ <string name="connect_connecting1">接続中…(1/12)</string>
+ <string name="connect_connecting2">接続中…(2/12)</string>
+ <string name="connect_connecting3">接続中…(3/12)</string>
+ <string name="connect_connecting4">接続中…(4/12)</string>
+ <string name="connect_connecting5">接続中…(5/12)</string>
+ <string name="connect_connecting6">接続中…(6/12)</string>
+ <string name="connect_connecting7">接続中…(7/12)</string>
+ <string name="connect_connecting8">接続中…(8/12)</string>
+ <string name="connect_connecting9">接続中…(9/12)</string>
+ <string name="connect_connecting10">接続中…(10/12)</string>
+ <string name="connect_connecting11">接続中…(11/12)</string>
+ <string name="connect_connecting12">接続中…(12/12)</string>
+ <string name="connect_connect_finished">カメラと接続</string>
+ <string name="connect_error_message">接続失敗</string>
+
</resources>
<string name="dialog_service_hint">(service)</string>
<string name="panasonic_service_string">cam.cgi</string>
-</resources>
+ <string name="error_reply_from_camera">The camera replies a errror…</string>
+ <string name="other_error_reply_from_camera">The camera replies a unknown errror…</string>
+ <string name="registration_reply_from_camera">Start a registration…</string>
+ <string name="connect_connected2">Connected.</string>
+ <string name="connect_prepare">Preparing…</string>
+ <string name="connect_connecting1">Connecting…(1/12)</string>
+ <string name="connect_connecting2">Connecting…(2/12)</string>
+ <string name="connect_connecting3">Connecting…(3/12)</string>
+ <string name="connect_connecting4">Connecting…(4/12)</string>
+ <string name="connect_connecting5">Connecting…(5/12)</string>
+ <string name="connect_connecting6">Connecting…(6/12)</string>
+ <string name="connect_connecting7">Connecting…(7/12)</string>
+ <string name="connect_connecting8">Connecting…(8/12)</string>
+ <string name="connect_connecting9">Connecting…(9/12)</string>
+ <string name="connect_connecting10">Connecting…(10/12)</string>
+ <string name="connect_connecting11">Connecting…(11/12)</string>
+ <string name="connect_connecting12">Connecting…(12/12)</string>
+ <string name="connect_connect_finished">Connect Finished.</string>
+ <string name="connect_error_message">CONNECTION ERROR</string>
+</resources>