OSDN Git Service

FUJIX用の接続処理をA01DLからフィードバック。
authorMRSa <mrsa@myad.jp>
Sat, 27 Jul 2019 14:35:56 +0000 (23:35 +0900)
committerMRSa <mrsa@myad.jp>
Sat, 27 Jul 2019 14:35:56 +0000 (23:35 +0900)
31 files changed:
app/src/main/java/net/osdn/gokigen/a01d/A01dMain.java
app/src/main/java/net/osdn/gokigen/a01d/camera/CameraStatusListener.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/IFujiXInterfaceProvider.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/cameraproperty/FujiXCameraCommandResponse.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/cameraproperty/FujiXCameraStatusDialog.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/operation/FujiXCaptureControl.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/operation/FujiXFocusingControl.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/FujiXInterfaceProvider.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/FujiXRunMode.java [new file with mode: 0644]
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/IFujiXCommandCallback.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/IFujiXMessages.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/messages/CaptureCommand.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/messages/FocusLock.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/messages/FocusUnlock.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/messages/GetFullImage.java [new file with mode: 0644]
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/messages/GetImageInfo.java [new file with mode: 0644]
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/messages/GetThumbNail.java [new file with mode: 0644]
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/messages/SetPropertyValue.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/connection/FujiXCameraConnectSequence.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/connection/FujiXCameraConnectSequenceForPlayback.java [new file with mode: 0644]
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/connection/FujiXCameraConnectSequenceForRead.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/connection/FujiXCameraModeChangeToLiveView.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/connection/FujiXCameraModeChangeToPlayback.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/connection/FujiXConnection.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/status/FujiXStatusChecker.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/status/FujiXStatusHolder.java
app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/status/IFujiXRunModeHolder.java [new file with mode: 0644]
app/src/main/java/net/osdn/gokigen/a01d/liveview/LiveViewFragment.java
app/src/main/res/drawable/ic_broken_image_black_24dp.xml [new file with mode: 0644]
app/src/main/res/values-ja/strings.xml
app/src/main/res/values/strings.xml

index 4c8352f..42ee323 100644 (file)
@@ -1,40 +1,40 @@
 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 ;
index 744a669..daf2804 100644 (file)
@@ -63,7 +63,18 @@ public class CameraStatusListener extends CameraChangeListerTemplate implements
     @Override
     public void updateCameraStatus(String message)
     {
-
+        //Log.v(TAG, "updateCameraStatus() : " + message);
+        try
+        {
+            if (updateReceiver != null)
+            {
+                updateReceiver.updateCameraStatus(message);
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
     }
 
     @Override
index 3894c22..49eddc6 100644 (file)
@@ -14,6 +14,7 @@ import net.osdn.gokigen.a01d.camera.IZoomLensControl;
 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;
 
@@ -28,12 +29,17 @@ public interface IFujiXInterfaceProvider
     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);
 }
index 4edb005..a550af4 100644 (file)
@@ -1,6 +1,7 @@
 package net.osdn.gokigen.a01d.camera.fujix.cameraproperty;
 
 import android.app.Activity;
+import android.util.Log;
 import android.widget.TextView;
 
 import androidx.annotation.NonNull;
@@ -9,6 +10,7 @@ import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.IFujiXCommandCallback;
 
 class FujiXCameraCommandResponse  implements IFujiXCommandCallback
 {
+    private final String TAG = toString();
     private final Activity activity;
     private final TextView field;
 
@@ -35,6 +37,17 @@ class FujiXCameraCommandResponse  implements IFujiXCommandCallback
         }
     }
 
+    @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)
index 8f56232..d32203d 100644 (file)
@@ -42,7 +42,7 @@ public class FujiXCameraStatusDialog extends DialogFragment
 
     private void prepare(@NonNull IFujiXInterfaceProvider interfaceProvider)
     {
-        this.cameraStatus = interfaceProvider.getCameraStatus();
+        this.cameraStatus = interfaceProvider.getCameraStatusListHolder();
     }
 
     /**
index b3c21f7..1414aa7 100644 (file)
@@ -47,4 +47,16 @@ public class FujiXCaptureControl implements ICaptureControl, IFujiXCommandCallba
         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);
+    }
 }
index b47beaa..fb27019 100644 (file)
@@ -185,6 +185,17 @@ public class FujiXFocusingControl implements IFocusingControl, IFujiXCommandCall
         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)
index 9d4c362..53cd0ff 100644 (file)
@@ -28,6 +28,7 @@ import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.IFujiXCommunication;
 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;
@@ -52,6 +53,8 @@ public class FujiXInterfaceProvider implements IFujiXInterfaceProvider, IDisplay
     private FujiXFocusingControl focusingControl;
     private FujiXStatusChecker statusChecker;
     private ICameraStatusUpdateNotify statusListener;
+    private FujiXRunMode runmode;
+
 
     public FujiXInterfaceProvider(@NonNull Activity context, @NonNull ICameraStatusReceiver provider, @NonNull ICameraStatusUpdateNotify statusListener)
     {
@@ -62,6 +65,7 @@ public class FujiXInterfaceProvider implements IFujiXInterfaceProvider, IDisplay
         fujiXConnection = new FujiXConnection(context, provider, this);
         zoomControl = new FujiXZoomControl();
         statusChecker = new FujiXStatusChecker(activity, commandPublisher);
+        this.runmode = new FujiXRunMode();
         this.statusListener = statusListener;
     }
 
@@ -122,6 +126,17 @@ public class FujiXInterfaceProvider implements IFujiXInterfaceProvider, IDisplay
     }
 
     @Override
+    public IFujiXRunModeHolder getRunModeHolder()
+    {
+        return (runmode);
+    }
+
+    @Override
+    public IFujiXCommandCallback getStatusHolder() {
+        return (statusChecker);
+    }
+
+    @Override
     public IFujiXCommandPublisher getCommandPublisher()
     {
         return (commandPublisher);
@@ -152,13 +167,19 @@ public class FujiXInterfaceProvider implements IFujiXInterfaceProvider, IDisplay
     }
 
     @Override
+    public ICameraStatusWatcher getCameraStatusWatcher()
+    {
+        return (statusChecker);
+    }
+
+    @Override
     public ICameraStatusUpdateNotify getStatusListener()
     {
         return (statusListener);
     }
 
     @Override
-    public ICameraStatus getCameraStatus()
+    public ICameraStatus getCameraStatusListHolder()
     {
         return (statusChecker);
     }
diff --git a/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/FujiXRunMode.java b/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/FujiXRunMode.java
new file mode 100644 (file)
index 0000000..fb4ecf8
--- /dev/null
@@ -0,0 +1,52 @@
+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;
+    }
+}
index cf8e883..217ab50 100644 (file)
@@ -3,4 +3,6 @@ package net.osdn.gokigen.a01d.camera.fujix.wrapper.command;
 public interface IFujiXCommandCallback
 {
     void receivedMessage(int id, byte[] rx_body);
+    void onReceiveProgress(int currentBytes, int totalBytes, byte[] rx_body);
+    boolean isReceiveMulti();
 }
index 7cbbeea..260832f 100644 (file)
@@ -26,5 +26,12 @@ public interface IFujiXMessages
     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;
 }
index 53c576f..a1b4525 100644 (file)
@@ -23,7 +23,7 @@ public class CaptureCommand extends FujiXCommandBase
     @Override
     public int getId()
     {
-        return (0);
+        return (FujiXCameraConnectSequence.SEQ_CAPTURE);
     }
 
     @Override
index 300145f..58ca042 100644 (file)
@@ -5,8 +5,6 @@ import androidx.annotation.NonNull;
 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;
@@ -29,7 +27,7 @@ public class FocusLock extends FujiXCommandBase
     @Override
     public int getId()
     {
-        return (FOCUS_LOCK);
+        return (FujiXCameraConnectSequence.SEQ_FOCUS_LOCK);
     }
 
     @Override
index b46cd21..3628058 100644 (file)
@@ -5,8 +5,6 @@ import androidx.annotation.NonNull;
 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;
@@ -25,7 +23,7 @@ public class FocusUnlock extends FujiXCommandBase
     @Override
     public int getId()
     {
-        return (FOCUS_UNLOCK);
+        return (FujiXCameraConnectSequence.SEQ_FOCUS_UNLOCK);
     }
 
     @Override
diff --git a/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/messages/GetFullImage.java b/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/messages/GetFullImage.java
new file mode 100644 (file)
index 0000000..54e1706
--- /dev/null
@@ -0,0 +1,61 @@
+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);
+    }
+}
diff --git a/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/messages/GetImageInfo.java b/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/messages/GetImageInfo.java
new file mode 100644 (file)
index 0000000..bb4dd96
--- /dev/null
@@ -0,0 +1,57 @@
+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);
+    }
+}
diff --git a/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/messages/GetThumbNail.java b/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/command/messages/GetThumbNail.java
new file mode 100644 (file)
index 0000000..2cb3e15
--- /dev/null
@@ -0,0 +1,56 @@
+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);
+    }
+}
index 2056340..52cef79 100644 (file)
@@ -87,7 +87,7 @@ public class SetPropertyValue extends FujiXCommandBase
     @Override
     public int getId()
     {
-        return (FujiXCameraConnectSequence.SEQ_STATUS_REQUEST);
+        return (FujiXCameraConnectSequence.SEQ_SET_PROPERTY_VALUE);
     }
 
     @Override
index 9c72059..a4ceb9e 100644 (file)
@@ -94,6 +94,18 @@ public class FujiXCameraConnectSequence implements Runnable, IFujiXCommandCallba
     }
 
     @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]");
@@ -101,6 +113,7 @@ public class FujiXCameraConnectSequence implements Runnable, IFujiXCommandCallba
         switch (id)
         {
             case SEQ_REGISTRATION:
+                cameraStatusReceiver.onStatusNotify(context.getString(R.string.connect_connecting));
                 if (checkRegistrationMessage(rx_body))
                 {
                     commandIssuer.enqueueCommand(new StartMessage(this));
@@ -108,11 +121,12 @@ public class FujiXCameraConnectSequence implements Runnable, IFujiXCommandCallba
                 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])
                 {
                     // なぜかもうちょっとデータが飛んでくるので待つ
@@ -127,10 +141,12 @@ public class FujiXCameraConnectSequence implements Runnable, IFujiXCommandCallba
                 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;
 
@@ -146,18 +162,22 @@ public class FujiXCameraConnectSequence implements Runnable, IFujiXCommandCallba
                 }
                 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;
 
@@ -196,8 +216,9 @@ public class FujiXCameraConnectSequence implements Runnable, IFujiXCommandCallba
         {
             // ちょっと待つ
             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)
diff --git a/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/connection/FujiXCameraConnectSequenceForPlayback.java b/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/connection/FujiXCameraConnectSequenceForPlayback.java
new file mode 100644 (file)
index 0000000..cffcce3
--- /dev/null
@@ -0,0 +1,386 @@
+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();
+        }
+    }
+
+}
index 53e4142..bdbc574 100644 (file)
@@ -93,6 +93,18 @@ public class FujiXCameraConnectSequenceForRead implements Runnable, IFujiXComman
     }
 
     @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]");
@@ -196,7 +208,7 @@ public class FujiXCameraConnectSequenceForRead implements Runnable, IFujiXComman
             // ちょっと待つ
             Thread.sleep(1000);
             interfaceProvider.getAsyncEventCommunication().connect();
-            //interfaceProvider.getStatusWatcher().startStatusWatch(interfaceProvider.getStatusListener());  ステータスの定期確認は実施しない
+            //interfaceProvider.getCameraStatusWatcher().startStatusWatch(interfaceProvider.getStatusListener());  ステータスの定期確認は実施しない
             onConnectNotify();
         }
         catch (Exception e)
index 6f92515..926041a 100644 (file)
@@ -15,6 +15,7 @@ import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.changemode.Ch
 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
@@ -22,6 +23,7 @@ public class FujiXCameraModeChangeToLiveView implements View.OnClickListener, IF
     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)
     {
@@ -29,12 +31,16 @@ public class FujiXCameraModeChangeToLiveView implements View.OnClickListener, IF
         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)
@@ -44,6 +50,25 @@ public class FujiXCameraModeChangeToLiveView implements View.OnClickListener, IF
     }
 
     @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]");
@@ -76,6 +101,10 @@ public class FujiXCameraModeChangeToLiveView implements View.OnClickListener, IF
                     {
                         callback.receivedMessage(id, rx_body);
                     }
+                    if (runModeHolder != null)
+                    {
+                        runModeHolder.transitToRecordingMode(true);
+                    }
                     Log.v(TAG, "CHANGED LIVEVIEW MODE : DONE.");
                     break;
 
index 00d7ce9..dcf590f 100644 (file)
@@ -14,12 +14,14 @@ import net.osdn.gokigen.a01d.camera.fujix.wrapper.command.messages.changemode.Ch
 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)
     {
@@ -27,12 +29,16 @@ public class FujiXCameraModeChangeToPlayback implements View.OnClickListener, IF
         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)
@@ -41,6 +47,26 @@ public class FujiXCameraModeChangeToPlayback implements View.OnClickListener, IF
         }
     }
 
+
+    @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)
     {
@@ -71,6 +97,10 @@ public class FujiXCameraModeChangeToPlayback implements View.OnClickListener, IF
                     {
                         callback.receivedMessage(id, rx_body);
                     }
+                    if (runModeHolder != null)
+                    {
+                        runModeHolder.transitToPlaybackMode(true);
+                    }
                     Log.v(TAG, "CHANGED PLAYBACK MODE : DONE.");
                     break;
 
index 0805107..47b66d4 100644 (file)
@@ -59,6 +59,7 @@ public class FujiXConnection implements ICameraConnection
     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();
@@ -102,7 +103,7 @@ public class FujiXConnection implements ICameraConnection
     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);
@@ -145,6 +146,7 @@ public class FujiXConnection implements ICameraConnection
                     @Override
                     public void onClick(DialogInterface dialog, int which)
                     {
+                        disconnect(false);
                         connect();
                     }
                 })
index ea79cb3..8eddf21 100644 (file)
@@ -49,6 +49,18 @@ public class FujiXStatusChecker implements IFujiXCommandCallback, ICameraStatusW
     }
 
     @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
index 6e990b8..f9e9be0 100644 (file)
@@ -168,7 +168,8 @@ class FujiXStatusHolder implements IFujiXCameraProperties
         try
         {
             int strIndex = key.indexOf("x");
-            if (strIndex > 1)
+            Log.v(TAG, "getItemStatus() : " + key + " [" + strIndex + "]");
+            if (strIndex >= 1)
             {
                 key = key.substring(strIndex + 1);
                 try
diff --git a/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/status/IFujiXRunModeHolder.java b/app/src/main/java/net/osdn/gokigen/a01d/camera/fujix/wrapper/status/IFujiXRunModeHolder.java
new file mode 100644 (file)
index 0000000..62002ed
--- /dev/null
@@ -0,0 +1,7 @@
+package net.osdn.gokigen.a01d.camera.fujix.wrapper.status;
+
+public interface IFujiXRunModeHolder
+{
+    void transitToRecordingMode(boolean isFinished);
+    void transitToPlaybackMode(boolean isFinished);
+}
index 3025ae0..79a3827 100644 (file)
@@ -822,7 +822,14 @@ public class LiveViewFragment extends Fragment implements IStatusViewDrawer, IFo
     @Override
     public void updateCameraStatus(String message)
     {
-        Log.v(TAG, "updateCameraStatus() : " + message);
+        try
+        {
+            updateStatusView(message);
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
     }
 
     @Override
diff --git a/app/src/main/res/drawable/ic_broken_image_black_24dp.xml b/app/src/main/res/drawable/ic_broken_image_black_24dp.xml
new file mode 100644 (file)
index 0000000..8d563a9
--- /dev/null
@@ -0,0 +1,9 @@
+<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>
index dc989cc..3595ac7 100644 (file)
     <string name="dialog_service_hint">(service)</string>
     <string name="panasonic_service_string">cam.cgi</string>
 
+    <string name="error_reply_from_camera">カメラからエラー応答&#8230;</string>
+    <string name="other_error_reply_from_camera">カメラから不明なエラー応答&#8230;</string>
+    <string name="registration_reply_from_camera">接続要求</string>
+    <string name="connect_connected2">接続完了!</string>
+    <string name="connect_prepare">準備中&#8230;</string>
+    <string name="connect_connecting1">接続中&#8230;(1/12)</string>
+    <string name="connect_connecting2">接続中&#8230;(2/12)</string>
+    <string name="connect_connecting3">接続中&#8230;(3/12)</string>
+    <string name="connect_connecting4">接続中&#8230;(4/12)</string>
+    <string name="connect_connecting5">接続中&#8230;(5/12)</string>
+    <string name="connect_connecting6">接続中&#8230;(6/12)</string>
+    <string name="connect_connecting7">接続中&#8230;(7/12)</string>
+    <string name="connect_connecting8">接続中&#8230;(8/12)</string>
+    <string name="connect_connecting9">接続中&#8230;(9/12)</string>
+    <string name="connect_connecting10">接続中&#8230;(10/12)</string>
+    <string name="connect_connecting11">接続中&#8230;(11/12)</string>
+    <string name="connect_connecting12">接続中&#8230;(12/12)</string>
+    <string name="connect_connect_finished">カメラと接続</string>
+    <string name="connect_error_message">接続失敗</string>
+
 </resources>
index 0585f41..6a1cc3a 100644 (file)
     <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&#8230;</string>
+    <string name="other_error_reply_from_camera">The camera replies a unknown errror&#8230;</string>
+    <string name="registration_reply_from_camera">Start a registration&#8230;</string>
+    <string name="connect_connected2">Connected.</string>
+    <string name="connect_prepare">Preparing&#8230;</string>
+    <string name="connect_connecting1">Connecting&#8230;(1/12)</string>
+    <string name="connect_connecting2">Connecting&#8230;(2/12)</string>
+    <string name="connect_connecting3">Connecting&#8230;(3/12)</string>
+    <string name="connect_connecting4">Connecting&#8230;(4/12)</string>
+    <string name="connect_connecting5">Connecting&#8230;(5/12)</string>
+    <string name="connect_connecting6">Connecting&#8230;(6/12)</string>
+    <string name="connect_connecting7">Connecting&#8230;(7/12)</string>
+    <string name="connect_connecting8">Connecting&#8230;(8/12)</string>
+    <string name="connect_connecting9">Connecting&#8230;(9/12)</string>
+    <string name="connect_connecting10">Connecting&#8230;(10/12)</string>
+    <string name="connect_connecting11">Connecting&#8230;(11/12)</string>
+    <string name="connect_connecting12">Connecting&#8230;(12/12)</string>
+    <string name="connect_connect_finished">Connect Finished.</string>
+    <string name="connect_error_message">CONNECTION ERROR</string>
 
+</resources>