OSDN Git Service

フラッシュモードとセルフタイマーの設定を変更できるようにする。
[gokigen/Gr2Control.git] / app / src / main / java / net / osdn / gokigen / gr2control / camera / fuji_x / wrapper / FujiXStatusHolder.java
index 6e3785c..3ce1723 100644 (file)
@@ -4,28 +4,48 @@ import android.util.Log;
 import android.util.SparseIntArray;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.collection.SparseArrayCompat;
+import androidx.fragment.app.FragmentActivity;
 
+import net.osdn.gokigen.gr2control.R;
+import net.osdn.gokigen.gr2control.camera.ICameraStatus;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.FujiXReplyMessageReceiver;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandPublisher;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.SetPropertyValue;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXBatteryMode;
 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXCameraProperties;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXFSSControl;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXFilmSimulation;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXFlashMode;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXFocusingMode;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXImageAspectMode;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXImageFormatMode;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXShootingMode;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXTimerMode;
+import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXWhiteBalanceMode;
 import net.osdn.gokigen.gr2control.liveview.ICameraStatusUpdateNotify;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
 
-import static net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXCameraProperties.FOCUS_LOCK;
-
 class FujiXStatusHolder
 {
     private final String TAG = toString();
+    private final FragmentActivity activity;
+    private final IFujiXCommandPublisher publisher;
+    private static final boolean logcat = true;
     private SparseIntArray statusHolder;
     private SparseArrayCompat<String> statusNameArray;
 
-    FujiXStatusHolder()
+    FujiXStatusHolder(@NonNull FragmentActivity activity, @NonNull IFujiXCommandPublisher publisher)
     {
         statusHolder = new SparseIntArray();
         statusHolder.clear();
 
+        this.activity = activity;
+        this.publisher = publisher;
         statusNameArray = new SparseArrayCompat<>();
         prepareStatusNameArray();
     }
@@ -51,37 +71,34 @@ class FujiXStatusHolder
         statusNameArray.append(IFujiXCameraProperties.DEVICE_ERROR, IFujiXCameraProperties.DEVICE_ERROR_STR);
         statusNameArray.append(IFujiXCameraProperties.IMAGE_FILE_COUNT, IFujiXCameraProperties.IMAGE_FILE_COUNT_STR);
         statusNameArray.append(IFujiXCameraProperties.SDCARD_REMAIN_SIZE, IFujiXCameraProperties.SDCARD_REMAIN_SIZE_STR);
-        statusNameArray.append(FOCUS_LOCK, IFujiXCameraProperties.FOCUS_LOCK_STR);
+        statusNameArray.append(IFujiXCameraProperties.FOCUS_LOCK, IFujiXCameraProperties.FOCUS_LOCK_STR);
         statusNameArray.append(IFujiXCameraProperties.MOVIE_REMAINING_TIME, IFujiXCameraProperties.MOVIE_REMAINING_TIME_STR);
         statusNameArray.append(IFujiXCameraProperties.SHUTTER_SPEED, IFujiXCameraProperties.SHUTTER_SPEED_STR);
-        statusNameArray.append(IFujiXCameraProperties.IMAGE_ASPECT,IFujiXCameraProperties.IMAGE_ASPECT_STR);
+        statusNameArray.append(IFujiXCameraProperties.IMAGE_ASPECT, IFujiXCameraProperties.IMAGE_ASPECT_STR);
         statusNameArray.append(IFujiXCameraProperties.BATTERY_LEVEL_2, IFujiXCameraProperties.BATTERY_LEVEL_2_STR);
-
         statusNameArray.append(IFujiXCameraProperties.UNKNOWN_DF00, IFujiXCameraProperties.UNKNOWN_DF00_STR);
         statusNameArray.append(IFujiXCameraProperties.PICTURE_JPEG_COUNT, IFujiXCameraProperties.PICTURE_JPEG_COUNT_STR);
         statusNameArray.append(IFujiXCameraProperties.UNKNOWN_D400, IFujiXCameraProperties.UNKNOWN_D400_STR);
         statusNameArray.append(IFujiXCameraProperties.UNKNOWN_D401, IFujiXCameraProperties.UNKNOWN_D401_STR);
         statusNameArray.append(IFujiXCameraProperties.UNKNOWN_D52F, IFujiXCameraProperties.UNKNOWN_D52F_STR);
-
-
+        statusNameArray.append(IFujiXCameraProperties.UNKNOWN_D245, IFujiXCameraProperties.UNKNOWN_D245_STR);
+        statusNameArray.append(IFujiXCameraProperties.UNKNOWN_DF41, IFujiXCameraProperties.UNKNOWN_DF41_STR);
+        statusNameArray.append(IFujiXCameraProperties.UNKNOWN_DF26, IFujiXCameraProperties.UNKNOWN_DF26_STR);
+        statusNameArray.append(IFujiXCameraProperties.UNKNOWN_DF27, IFujiXCameraProperties.UNKNOWN_DF27_STR);
     }
 
-
-    void updateValue(ICameraStatusUpdateNotify notifier, int id, byte data0, byte data1, byte data2, byte data3)
+    void updateValue(@Nullable ICameraStatusUpdateNotify notifier, int id, byte data0, byte data1, byte data2, byte data3)
     {
         try
         {
             int value = ((((int) data3) & 0xff) << 24) + ((((int) data2) & 0xff) << 16) + ((((int) data1) & 0xff) << 8) + (((int) data0) & 0xff);
             int currentValue = statusHolder.get(id, -1);
-            //Log.v(TAG, "STATUS  ID: " + id + "  value : " + value + " (" + currentValue + ")");
-            statusHolder.put(id, value);
-            if (currentValue != value)
+            //logcat(String.format(Locale.US, " STATUS [id: 0x%04x] 0x%08x(%d) -> 0x%08x(%d)", id, currentValue, currentValue, value, value));
+            if ((notifier != null) && (currentValue != value))
             {
-                //Log.v(TAG, "STATUS  ID: " + id + " value : " + currentValue + " -> " + value);
-                if (notifier != null)
-                {
-                    updateDetected(notifier, id, currentValue, value);
-                }
+                statusHolder.put(id, value);
+                //logcat(String.format(Locale.US," STATUS UPDATE [id: 0x%04x] 0x%08x(%d) -> 0x%08x(%d)", id, currentValue, currentValue, value, value));
+                updateDetected(notifier, id, currentValue, value);
             }
         }
         catch (Exception e)
@@ -94,30 +111,605 @@ class FujiXStatusHolder
     {
         try
         {
-            String idName = statusNameArray.get(id, "Unknown");
-            Log.v(TAG, String.format(Locale.US,"<< UPDATE STATUS >> id: 0x%04x[%s] 0x%08x(%d) -> 0x%08x(%d)", id, idName, previous, previous, current, current));
-            //Log.v(TAG, "updateDetected(ID: " + id + " [" + idName + "] " + previous + " -> " + current + " )");
+            //String idName = statusNameArray.get(id, "Unknown");
+            //logcat(String.format(Locale.US, " << UPDATE STATUS >> id: 0x%04x[%s] 0x%08x(%d) -> 0x%08x(%d)", id, idName, previous, previous, current, current));
+            switch (id)
+            {
+                case IFujiXCameraProperties.FOCUS_LOCK:
+                    updateFocusedStatus(notifier, previous, current);
+                    break;
+                case IFujiXCameraProperties.SHOOTING_MODE:
+                    updatedTakeMode(notifier, previous, current);
+                    break;
+                case IFujiXCameraProperties.BATTERY_LEVEL:
+                case IFujiXCameraProperties.BATTERY_LEVEL_2:
+                    updateBatteryLevel(notifier, previous, current);
+                    break;
+                case IFujiXCameraProperties.FOCUS_MODE:
+                    updateFocusMode(notifier, previous, current);
+                    break;
+                case IFujiXCameraProperties.APERTURE:
+                    updateAperture(notifier, previous, current);
+                    break;
+                case IFujiXCameraProperties.SHUTTER_SPEED:
+                    updateShutterSpeed(notifier, previous, current);
+                    break;
+                case IFujiXCameraProperties.WHITE_BALANCE:
+                    updateWhiteBalance(notifier, previous, current);
+                    break;
+                case IFujiXCameraProperties.EXPOSURE_COMPENSATION:
+                    updateExposureCompensation(notifier, previous, current);
+                    break;
+                case IFujiXCameraProperties.ISO:
+                    updateIsoSensitivity(notifier, previous, current);
+                    break;
+                case IFujiXCameraProperties.DEVICE_ERROR:
+                    updateDeviceError(notifier, previous, current);
+                    break;
+                case IFujiXCameraProperties.SELF_TIMER:
+                    updateSelfTimer(notifier, previous, current);
+                    break;
+                case IFujiXCameraProperties.SDCARD_REMAIN_SIZE:
+                    updateSdCardRemainSize(notifier, previous, current);
+                    break;
+                case IFujiXCameraProperties.MOVIE_REMAINING_TIME:
+                    updateMovieRemainTime(notifier, previous, current);
+                    break;
+                case IFujiXCameraProperties.FOCUS_POINT:
+                    updateFocusPoint(notifier, previous, current);
+                    break;
+                case IFujiXCameraProperties.F_SS_CONTROL:
+                    updateFSSControl(notifier, previous, current);
+                    break;
+                case IFujiXCameraProperties.IMAGE_ASPECT:
+                    updateImageAspect(notifier, previous, current);
+                    break;
+                case IFujiXCameraProperties.FILM_SIMULATION:
+                    updateFilmSimulation(notifier, previous, current);
+                    break;
+                case IFujiXCameraProperties.FLASH:
+                    updateFlashMode(notifier, previous, current);
+                    break;
+                case IFujiXCameraProperties.IMAGE_FORMAT:
+                    updateImageFormat(notifier, previous, current);
+                    break;
+                case IFujiXCameraProperties.UNKNOWN_D245:
+                case IFujiXCameraProperties.UNKNOWN_DF41:
+                case IFujiXCameraProperties.UNKNOWN_DF26:
+                case IFujiXCameraProperties.UNKNOWN_DF27:
+                default:
+                    updateUnknownValue(id, previous, current);
+                    break;
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    private void updateImageFormat(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
+    {
+        String value;
+        switch (current)
+        {
+            case IFujiXImageFormatMode.IMAGE_FORMAT_RAW:
+                value = "RAW";
+                break;
+            case IFujiXImageFormatMode.IMAGE_FORMAT_FINE:
+                value = "FINE";
+                break;
+            case IFujiXImageFormatMode.IMAGE_FORMAT_NORMAL:
+                value = "NORMAL";
+                break;
+            case IFujiXImageFormatMode.IMAGE_FORMAT_FINE_RAW:
+                value = "RAW+F";
+                break;
+            case IFujiXImageFormatMode.IMAGE_FORMAT_NORMAL_RAW:
+                value = "RAW+N";
+                break;
+            default:
+                value = "UNKNOWN : " + current;
+                break;
+        }
+        logcat(" Image Format : " + value);
+    }
+
+    private void updateFlashMode(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
+    {
+        String value;
+        switch (current)
+        {
+            case IFujiXFlashMode.FLASH_AUTO:
+                value = "AUTO";
+                break;
+            case IFujiXFlashMode.FLASH_OFF:
+                value = "OFF";
+                break;
+            case IFujiXFlashMode.FLASH_FILL:
+                value = "FILL";
+                break;
+            case IFujiXFlashMode.FLASH_REDEYE_AUTO:
+                value = "REDEYE_AUTO";
+                break;
+            case IFujiXFlashMode.FLASH_REDEYE_FILL:
+                value = "REDEYE_FILL";
+                break;
+            case IFujiXFlashMode.FLASH_EXTERNAL_SYNC:
+                value = "EXTERNAL_SYNC";
+                break;
+            case IFujiXFlashMode.FLASH_ON:
+                value = "ON";
+                break;
+            case IFujiXFlashMode.FLASH_REDEYE:
+                value = "REDEYE";
+                break;
+            case IFujiXFlashMode.FLASH_REDEYE_ON:
+                value = "REDEYE_ON";
+                break;
+            case IFujiXFlashMode.FLASH_REDEYE_SYNC:
+                value = "REDEYE_SYNC";
+                break;
+            case IFujiXFlashMode.FLASH_REDEYE_REAR:
+                value = "REDEYE_REAR";
+                break;
+            case IFujiXFlashMode.FLASH_SLOW_SYNC:
+                value = "SLOW_SYNC";
+                break;
+            case IFujiXFlashMode.FLASH_REAR_SYNC:
+                value = "REAR_SYNC";
+                break;
+            case IFujiXFlashMode.FLASH_COMMANDER:
+                value = "COMMANDER";
+                break;
+            case IFujiXFlashMode.FLASH_DISABLE:
+                value = "DISABLE";
+                break;
+            case IFujiXFlashMode.FLASH_ENABLE:
+                value = "ENABLE";
+                break;
+            default:
+                value = " UNKNOWN : " + current;
+                break;
+        }
+        logcat(" FLASH MODE : " + value);
+    }
+
+    private void updateFilmSimulation(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
+    {
+        String value;
+        switch (current)
+        {
+            case IFujiXFilmSimulation.FILM_SIMULATION_PROVIA:
+                value = IFujiXFilmSimulation.FILM_SIMULATION_PROVIA_STR;
+                break;
+            case IFujiXFilmSimulation.FILM_SIMULATION_VELVIA:
+                value = IFujiXFilmSimulation.FILM_SIMULATION_VELVIA_STR;
+                break;
+            case IFujiXFilmSimulation.FILM_SIMULATION_ASTIA:
+                value = IFujiXFilmSimulation.FILM_SIMULATION_ASTIA_STR;
+                break;
+            case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME:
+                value = IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_STR;
+                break;
+            case IFujiXFilmSimulation.FILM_SIMULATION_SEPIA:
+                value = IFujiXFilmSimulation.FILM_SIMULATION_SEPIA_STR;
+                break;
+            case IFujiXFilmSimulation.FILM_SIMULATION_PRO_NEG_HI:
+                value = IFujiXFilmSimulation.FILM_SIMULATION_PRO_NEG_HI_STR;
+                break;
+            case IFujiXFilmSimulation.FILM_SIMULATION_PRO_NEG_STD:
+                value = IFujiXFilmSimulation.FILM_SIMULATION_PRO_NEG_STD_STR;
+                break;
+            case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_Y_FILTER:
+                value = IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_Y_FILTER_STR;
+                break;
+            case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_R_FILTER:
+                value = IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_R_FILTER_STR;
+                break;
+            case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_G_FILTER:
+                value = IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_G_FILTER_STR;
+                break;
+            case IFujiXFilmSimulation.FILM_SIMULATION_CLASSIC_CHROME:
+                value = IFujiXFilmSimulation.FILM_SIMULATION_CLASSIC_CHROME_STR;
+                break;
+            case IFujiXFilmSimulation.FILM_SIMULATION_ACROS:
+                value = IFujiXFilmSimulation.FILM_SIMULATION_ACROS_STR;
+                break;
+            case IFujiXFilmSimulation.FILM_SIMULATION_ACROS_Y:
+                value = IFujiXFilmSimulation.FILM_SIMULATION_ACROS_Y_STR;
+                break;
+            case IFujiXFilmSimulation.FILM_SIMULATION_ACROS_R:
+                value = IFujiXFilmSimulation.FILM_SIMULATION_ACROS_R_STR;
+                break;
+            case IFujiXFilmSimulation.FILM_SIMULATION_ACROS_G:
+                value = IFujiXFilmSimulation.FILM_SIMULATION_ACROS_G_STR;
+                break;
+            case IFujiXFilmSimulation.FILM_SIMULATION_ETERNA:
+                value = IFujiXFilmSimulation.FILM_SIMULATION_ETERNA_STR;
+                break;
+            case IFujiXFilmSimulation.FILM_SIMULATION_CLASSIC_NEGATIVE:
+                value = IFujiXFilmSimulation.FILM_SIMULATION_CLASSIC_NEGATIVE_STR;
+                break;
+            case IFujiXFilmSimulation.FILM_SIMULATION_ETERNA_BLEACH_BYPASS:
+                value = IFujiXFilmSimulation.FILM_SIMULATION_ETERNA_BLEACH_BYPASS_STR;
+                break;
+            default:
+                value = "??? " + current;
+                break;
+        }
+        logcat(" FILM SIMULATION : " + value);
+    }
+
+    private void updateImageAspect(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
+    {
+        String value;
+        switch (current)
+        {
+            case IFujiXImageAspectMode.IMAGE_ASPECT_S_3x2:
+              value = "S:3x2";
+              break;
+            case IFujiXImageAspectMode.IMAGE_ASPECT_S_16x9:
+              value = "S:16x9";
+              break;
+            case IFujiXImageAspectMode.IMAGE_ASPECT_S_1x1:
+              value = "S:1x1";
+              break;
+            case IFujiXImageAspectMode.IMAGE_ASPECT_M_3x2:
+                value = "M:3x2";
+                break;
+            case IFujiXImageAspectMode.IMAGE_ASPECT_M_16x9:
+                value = "M:16x9";
+                break;
+            case IFujiXImageAspectMode.IMAGE_ASPECT_M_1x1:
+                value = "M:1x1";
+                break;
+            case IFujiXImageAspectMode.IMAGE_ASPECT_L_3x2:
+                value = "L:3x2";
+                break;
+            case IFujiXImageAspectMode.IMAGE_ASPECT_L_16x9:
+                value = "L:16x9";
+                break;
+            case IFujiXImageAspectMode.IMAGE_ASPECT_L_1x1:
+                value = "L:1x1";
+                break;
+            default:
+                value = "? " + current;
+                break;
+        }
+        logcat(" Image Aspect : " + value);
+    }
+
+
+    private void updateFSSControl(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
+    {
+        String value;
+        switch (current)
+        {
+            case IFujiXFSSControl.F_SS_CTRL_BOTH:
+                value = "BOTH";
+                break;
+            case IFujiXFSSControl.F_SS_CTRL_F:
+                value = "F";
+                break;
+            case IFujiXFSSControl.F_SS_CTRL_SS:
+                value = "SS";
+                break;
+            case IFujiXFSSControl.F_SS_CTRL_NONE:
+                value = "NONE";
+                break;
+            default:
+                value = "? " + current;
+                break;
+        }
+        logcat(" F_SS : " + value);
+    }
+
+    private void updateUnknownValue(int id, int previous, int current)
+    {
+        logcat(String.format(Locale.US,"<< UPDATE UNKNOWN STATUS >> id: 0x%04x 0x%08x(%d) -> 0x%08x(%d)", id, previous, previous, current, current));
+    }
+
+    private void updateFocusPoint(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
+    {
+        logcat(String.format(Locale.ENGLISH, " Focus Point : %x ", current));
+    }
+
+    private void updateMovieRemainTime(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
+    {
+        logcat(" MOVIE REMAIN : " + current);
+    }
+
+    private void updateSdCardRemainSize(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
+    {
+        logcat(" SDCARD REMAIN : " + current);
+    }
+
+    private void updateSelfTimer(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
+    {
+        int value = -1;
+        try
+        {
+            switch (current)
+            {
+                case IFujiXTimerMode.TIMER_OFF:
+                    value = 0;
+                    break;
+
+                case IFujiXTimerMode.TIMER_1SEC:
+                    value = 1;
+                    break;
+
+                case IFujiXTimerMode.TIMER_2SEC:
+                    value = 2;
+                    break;
+
+                case IFujiXTimerMode.TIMER_5SEC:
+                    value = 5;
+                    break;
+
+                case IFujiXTimerMode.TIMER_10SEC:
+                    value = 10;
+                    break;
+
+                default:
+                    break;
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        if (value <= 0)
+        {
+            logcat(" SELF TIMER IS OFF (" + value + ")");
+        }
+        else
+        {
+            logcat(" SELF TIMER IS " + value + " sec.");
+        }
+    }
+
+    private void updateDeviceError(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
+    {
+        if (current != 0)
+        {
+            notifier.updateWarning("ERROR " + current);
+        }
+    }
+
+    private void updateIsoSensitivity(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
+    {
+        String iso = "";
+        try
+        {
+            int isoValue = (0x0000ffff & current);
+            if ((0xffff0000 & current) != 0)
+            {
+                iso = "AUTO_" + isoValue;
+            }
+            else if (isoValue > 12800)
+            {
+                iso = "H" + isoValue;
 
-            if (id == FOCUS_LOCK)
+            }
+            else if (isoValue < 200)
             {
-                if (current == 1)
-                {
-                    // focus Lock
-                    notifier.updateFocusedStatus(true, true);
-                }
-                else
-                {
-                    // focus unlock
-                    notifier.updateFocusedStatus(false, false);
-                }
+                iso = "L" + isoValue;
+            }
+            else
+            {
+                iso = "" + isoValue;
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        logcat(" ISO SENSITIVITY : " + iso);
+        notifier.updateIsoSensitivity(iso);
+    }
+
+    private void updateExposureCompensation(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
+    {
+        String exposureCompensation = "";
+        try
+        {
+            float value = ((float) current / 1000.0f);
+            exposureCompensation = String.format(Locale.ENGLISH, "%+1.1f", value);
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        notifier.updatedExposureCompensation(exposureCompensation);
+    }
+
+    private void updateWhiteBalance(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
+    {
+        String value = "";
+        try
+        {
+            switch (current)
+            {
+                case IFujiXWhiteBalanceMode.WHITE_BALANCE_AUTO:
+                    value = "Auto";
+                    break;
+                case IFujiXWhiteBalanceMode.WHITE_BALANCE_FINE:
+                    value = "Fine";
+                    break;
+                case IFujiXWhiteBalanceMode.WHITE_BALANCE_INCANDESCENT:
+                    value = "Incandescent";
+                    break;
+                case IFujiXWhiteBalanceMode.WHITE_BALANCE_FLUORESCENT_1:
+                    value = "Fluorescent 1";
+                    break;
+                case IFujiXWhiteBalanceMode.WHITE_BALANCE_FLUORESCENT_2:
+                    value = "Fluorescent 2";
+                    break;
+                case IFujiXWhiteBalanceMode.WHITE_BALANCE_FLUORESCENT_3:
+                    value = "Fluorescent 3";
+                    break;
+                case IFujiXWhiteBalanceMode.WHITE_BALANCE_SHADE:
+                    value = "Shade";
+                    break;
+                case IFujiXWhiteBalanceMode.WHITE_BALANCE_UNDERWATER:
+                    value = "Underwater";
+                    break;
+                case IFujiXWhiteBalanceMode.WHITE_BALANCE_TEMPERATURE:
+                    value = "Kelvin";
+                    break;
+                case IFujiXWhiteBalanceMode.WHITE_BALANCE_CUSTOM:
+                    value = "Custom";
+                    break;
+                default:
+                    value = "Unknown";
+                    break;
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        notifier.updatedWBMode(value);
+    }
+
+    private void updateShutterSpeed(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
+    {
+        String shutterSpeed = "--";
+        try
+        {
+            if ((0x80000000 & current) != 0)
+            {
+                int value = 0x0fffffff & current;
+                shutterSpeed = ("1/" + (value / 1000));
+            }
+            else
+            {
+                shutterSpeed = (current + "");
             }
         }
         catch (Exception e)
         {
             e.printStackTrace();
         }
+        notifier.updatedShutterSpeed(shutterSpeed);
+    }
+
+    private void updateAperture(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
+    {
+        String aperature = "---";
+        try
+        {
+            float value = ((float) current / 100.0f);
+            aperature = String.format(Locale.ENGLISH, "%1.1f", value);
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        notifier.updatedAperture(aperature);
+    }
+
+    private void updateFocusMode(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
+    {
+        String mode = "";
+
+        // Focus Mode
+        if (current == IFujiXFocusingMode.FOCUS_MANUAL)
+        {
+            mode = "MF";
+        }
+        else if (current == IFujiXFocusingMode.FOCUS_CONTINUOUS_AUTO)
+        {
+            mode = "AF-C";
+        }
+        else if (current == IFujiXFocusingMode.FOCUS_SINGLE_AUTO)
+        {
+            mode = "AF-S";
+        }
+        else
+        {
+            mode = mode + current;
+        }
+        logcat(" Focus Mode : " + mode);
+    }
+
+    private void updateFocusedStatus(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
+    {
+        if (current == 1)
+        {
+            // focus Lock
+            notifier.updateFocusedStatus(true, true);
+        }
+        else
+        {
+            // focus unlock
+            notifier.updateFocusedStatus(false, false);
+        }
+    }
+
+    private void updatedTakeMode(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
+    {
+        String mode = "";
+        switch (current)
+        {
+            case IFujiXShootingMode.SHOOTING_MANUAL:
+                mode = "M";
+                break;
+            case IFujiXShootingMode.SHOOTING_PROGRAM:
+                mode = "P";
+                break;
+            case IFujiXShootingMode.SHOOTING_APERTURE:
+                mode = "A";
+                break;
+            case IFujiXShootingMode.SHOOTING_SHUTTER:
+                mode = "S";
+                break;
+            case IFujiXShootingMode.SHOOTING_CUSTOM:
+                mode = "C";
+                break;
+            case IFujiXShootingMode.SHOOTING_AUTO:
+                mode = "a";
+                break;
+            default:
+                mode = mode + current;
+                break;
+        }
+        notifier.updatedTakeMode(mode);
+    }
+
+    private void updateBatteryLevel(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
+    {
+        int level;
+        if ((current == IFujiXBatteryMode.BATTERY_CRITICAL) || (current == IFujiXBatteryMode.BATTERY_126S_CRITICAL))
+        {
+            level = 0;
+        }
+        else if (current == IFujiXBatteryMode.BATTERY_126S_ONE_BAR)
+        {
+            level = 20;
+        }
+        else if ((current == IFujiXBatteryMode.BATTERY_ONE_BAR) || (current == IFujiXBatteryMode.BATTERY_126S_TWO_BAR))
+        {
+            level = 40;
+        }
+        else if (current == IFujiXBatteryMode.BATTERY_126S_THREE_BAR)
+        {
+            level = 60;
+        }
+        else if ((current == IFujiXBatteryMode.BATTERY_TWO_BAR) || (current == IFujiXBatteryMode.BATTERY_126S_FOUR_BAR))
+        {
+            level = 80;
+        }
+        else // if ((current == IFujiXBatteryMode.BATTERY_FULL) || (current == IFujiXBatteryMode.BATTERY_126S_FULL))
+        {
+            level = 100;
+        }
+        notifier.updateRemainBattery(level);
     }
 
+
     /**
      *   認識したカメラのステータス名称のリストを応答する
      *
@@ -143,13 +735,38 @@ class FujiXStatusHolder
 
     List<String> getAvailableItemList(String listKey)
     {
-        if (listKey == null)
+        if ((listKey == null)||(listKey.isEmpty()))
         {
             // アイテム名の一覧を応答する
             return (getAvailableStatusNameList());
         }
+        if (listKey.matches(ICameraStatus.EFFECT))
+        {
+            return (getAvailableEffectItemList());
+        }
+        if (listKey.matches(ICameraStatus.AE))
+        {
+            return (new ArrayList<>());
+        }
+        if (listKey.matches(ICameraStatus.WHITE_BALANCE))
+        {
+            return (getAvailableResourceArrayItemList(R.array.fuji_x_white_balance));
+        }
+        if (listKey.matches(ICameraStatus.ISO_SENSITIVITY))
+        {
+            return (getAvailableResourceArrayItemList(R.array.fuji_x_iso_sensitivity));
+        }
+        if (listKey.matches(ICameraStatus.FLASH_XV))
+        {
+            return (getAvailableResourceArrayItemList(R.array.fuji_x_flash_control));
+        }
+        if (listKey.matches(ICameraStatus.SELF_TIMER))
+        {
+            return (getAvailableResourceArrayItemList(R.array.fuji_x_timer_control));
+        }
 
         /////  選択可能なステータスの一覧を取得する : でも以下はアイテム名の一覧... /////
+        /*
         ArrayList<String> selection = new ArrayList<>();
         try
         {
@@ -163,11 +780,342 @@ class FujiXStatusHolder
         {
             e.printStackTrace();
         }
+        */
+        return (new ArrayList<>());
+    }
+
+    private List<String> getAvailableEffectItemList()
+    {
+        // EFFECTの選択肢をリストにして返す  : Film Simulation にした。
+        ArrayList<String> selection = new ArrayList<>();
+        selection.add(IFujiXFilmSimulation.FILM_SIMULATION_PROVIA_STR);
+        selection.add(IFujiXFilmSimulation.FILM_SIMULATION_VELVIA_STR);
+        selection.add(IFujiXFilmSimulation.FILM_SIMULATION_ASTIA_STR);
+        selection.add(IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_STR);
+        selection.add(IFujiXFilmSimulation.FILM_SIMULATION_SEPIA_STR);
+        selection.add(IFujiXFilmSimulation.FILM_SIMULATION_PRO_NEG_HI_STR);
+        selection.add(IFujiXFilmSimulation.FILM_SIMULATION_PRO_NEG_STD_STR);
+        selection.add(IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_Y_FILTER_STR);
+        selection.add(IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_R_FILTER_STR);
+        selection.add(IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_G_FILTER_STR);
+        selection.add(IFujiXFilmSimulation.FILM_SIMULATION_CLASSIC_CHROME_STR);
+        selection.add(IFujiXFilmSimulation.FILM_SIMULATION_ACROS_STR);
+        selection.add(IFujiXFilmSimulation.FILM_SIMULATION_ACROS_Y_STR);
+        selection.add(IFujiXFilmSimulation.FILM_SIMULATION_ACROS_R_STR);
+        selection.add(IFujiXFilmSimulation.FILM_SIMULATION_ACROS_G_STR);
+        selection.add(IFujiXFilmSimulation.FILM_SIMULATION_ETERNA_STR);
+        selection.add(IFujiXFilmSimulation.FILM_SIMULATION_CLASSIC_NEGATIVE_STR);
+        selection.add(IFujiXFilmSimulation.FILM_SIMULATION_ETERNA_BLEACH_BYPASS_STR);
+        return(selection);
+    }
+
+    private List<String> getAvailableResourceArrayItemList(int id)
+    {
+        // リソースのの選択肢をリストにして返す
+        ArrayList<String> selection = new ArrayList<>();
+
+        String[] items = activity.getResources().getStringArray(id);
+        for (String item : items)
+        {
+            Log.v(TAG, " SELECTION : " + item);
+            selection.add(item);
+        }
         return (selection);
     }
 
+    private String getCurrentEffectStatus()
+    {
+        // EFFECTの現在状態を応答する : FILM Simulationにした
+        try
+        {
+            int value = statusHolder.get(IFujiXCameraProperties.FILM_SIMULATION);
+            List<String> itemList = getAvailableEffectItemList();
+            if ((value >= IFujiXFilmSimulation.FILM_SIMULATION_MIN)&&(value < itemList.size()))
+            {
+                return (itemList.get(value - 1));
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        return ("");
+    }
+
+    private String getCurrentWhiteBalanceStatus()
+    {
+        // White Balanceの現在状態を取得する
+        try
+        {
+            int value = statusHolder.get(IFujiXCameraProperties.WHITE_BALANCE);
+            String[] items = activity.getResources().getStringArray(R.array.fuji_x_white_balance);
+            String[] itemValues = activity.getResources().getStringArray(R.array.fuji_x_white_balance_value);
+            int index = 0;
+            for (String itemValue : itemValues)
+            {
+                int itemValueInt = Integer.parseInt(itemValue);
+                if (itemValueInt == value)
+                {
+                    return (items[index]);
+                }
+                index++;
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        return ("");
+    }
+
+    private String getCurrentIsoSensitivityStatus()
+    {
+        String iso = "";
+        try
+        {
+            int current = statusHolder.get(IFujiXCameraProperties.ISO);
+            int isoValue = (0x0000ffff & current);
+            if ((0xffff0000 & current) != 0)
+            {
+                iso = "AUTO_" + isoValue;
+            }
+            else if (isoValue > 12800)
+            {
+                iso = "H" + isoValue;
+
+            }
+            else if (isoValue < 200)
+            {
+                iso = "L" + isoValue;
+            }
+            else
+            {
+                iso = "" + isoValue;
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        logcat(" ISO SENSITIVITY : " + iso);
+        return (iso);
+    }
+
+    private String getCurrentFlashStatus()
+    {
+        String flash = "";
+        try
+        {
+            int current = statusHolder.get(IFujiXCameraProperties.FLASH);
+            String[] items = activity.getResources().getStringArray(R.array.fuji_x_flash_control);
+            String[] itemValues = activity.getResources().getStringArray(R.array.fuji_x_flash_control_value);
+            int index = 0;
+            for (String itemValue : itemValues)
+            {
+                int itemValueInt = Integer.parseInt(itemValue, 16);
+                if (itemValueInt == current)
+                {
+                    return (items[index]);
+                }
+                index++;
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        return (flash);
+    }
+
+    private String getCurrentSelfTimerStatus()
+    {
+        String selfTimer = "";
+        try
+        {
+            int current = statusHolder.get(IFujiXCameraProperties.SELF_TIMER);
+            String[] items = activity.getResources().getStringArray(R.array.fuji_x_timer_control);
+            String[] itemValues = activity.getResources().getStringArray(R.array.fuji_x_timer_control_value);
+            int index = 0;
+            for (String itemValue : itemValues)
+            {
+                int itemValueInt = Integer.parseInt(itemValue, 16);
+                if (itemValueInt == current)
+                {
+                    return (items[index]);
+                }
+                index++;
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+        return (selfTimer);
+    }
+
+    private void setEffectItem(String value)
+    {
+        try
+        {
+            int index = 1;
+            List<String> itemList = getAvailableEffectItemList();
+            for (String item : itemList)
+            {
+                if (item.matches(value))
+                {
+                    //  見つかった! この値に設定する
+                    publisher.enqueueCommand(new SetPropertyValue(new FujiXReplyMessageReceiver(" Set Film Simulation", true), IFujiXCameraProperties.FILM_SIMULATION, 4, index));
+                    return;
+                }
+                index++;
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    private void setCurrentWhiteBalanceStatus(String value)
+    {
+        // White Balanceを設定する
+        try
+        {
+            String[] items = activity.getResources().getStringArray(R.array.fuji_x_white_balance);
+            String[] itemValues = activity.getResources().getStringArray(R.array.fuji_x_white_balance_value);
+            int index = 0;
+            for (String item : items)
+            {
+                if (item.matches(value))
+                {
+                    // 見つかった! この値を設定する
+                    String itemValue = itemValues[index];
+                    int itemValueInt = Integer.parseInt(itemValue);
+                    publisher.enqueueCommand(new SetPropertyValue(new FujiXReplyMessageReceiver(" Set White Balance", true), IFujiXCameraProperties.WHITE_BALANCE, 4, itemValueInt));
+                    return;
+                }
+                index++;
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    private void setCurrentIsoSensitivityStatus(String value)
+    {
+        // ISO感度を設定する
+        try
+        {
+            String[] items = activity.getResources().getStringArray(R.array.fuji_x_iso_sensitivity);
+            String[] itemValues = activity.getResources().getStringArray(R.array.fuji_x_iso_sensitivity_value);
+            int index = 0;
+            for (String item : items)
+            {
+                //Log.v(TAG, " ===== ISO : " + value + " " + item + " ===== ");
+                if (item.matches(value))
+                {
+                    // 見つかった! この値を設定する
+                    String itemValue = itemValues[index];
+                    int itemValueInt = (int) Long.parseLong(itemValue,16);
+                    logcat(" SET ISO SENSITIVITY : " + value + " " + itemValueInt);
+                    publisher.enqueueCommand(new SetPropertyValue(new FujiXReplyMessageReceiver(" Set ISO", true), IFujiXCameraProperties.ISO, 4, itemValueInt));
+                    return;
+                }
+                index++;
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    private void setCurrentFlashStatus(String value)
+    {
+        // ISO感度を設定する
+        try
+        {
+            String[] items = activity.getResources().getStringArray(R.array.fuji_x_flash_control);
+            String[] itemValues = activity.getResources().getStringArray(R.array.fuji_x_flash_control_value);
+            int index = 0;
+            for (String item : items)
+            {
+                Log.v(TAG, " ===== FLASH : " + value + " " + item + " ===== ");
+                if (item.matches(value))
+                {
+                    // 見つかった! この値を設定する
+                    String itemValue = itemValues[index];
+                    int itemValueInt = (int) Long.parseLong(itemValue,16);
+                    logcat(" SET FLASH : " + value + " " + itemValueInt);
+                    publisher.enqueueCommand(new SetPropertyValue(new FujiXReplyMessageReceiver(" Set FLASH", true), IFujiXCameraProperties.FLASH, 4, itemValueInt));
+                    return;
+                }
+                index++;
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
+    private void setSelfTimerStatus(String value)
+    {
+        // セルフタイマーを設定する
+        try
+        {
+            String[] items = activity.getResources().getStringArray(R.array.fuji_x_timer_control);
+            String[] itemValues = activity.getResources().getStringArray(R.array.fuji_x_timer_control_value);
+            int index = 0;
+            for (String item : items)
+            {
+                Log.v(TAG, " ===== SELF-TIMER : " + value + " " + item + " ===== ");
+                if (item.matches(value))
+                {
+                    // 見つかった! この値を設定する
+                    String itemValue = itemValues[index];
+                    int itemValueInt = (int) Long.parseLong(itemValue,16);
+                    logcat(" SET SELF-TIMER : " + value + " " + itemValueInt);
+                    publisher.enqueueCommand(new SetPropertyValue(new FujiXReplyMessageReceiver(" Set SELF-TIMER", true), IFujiXCameraProperties.SELF_TIMER, 4, itemValueInt));
+                    return;
+                }
+                index++;
+            }
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
     String getItemStatus(String key)
     {
+        if (key.matches(ICameraStatus.EFFECT))
+        {
+            return (getCurrentEffectStatus());
+        }
+        if (key.matches(ICameraStatus.WHITE_BALANCE))
+        {
+            return (getCurrentWhiteBalanceStatus());
+        }
+        if (key.matches(ICameraStatus.ISO_SENSITIVITY))
+        {
+            return (getCurrentIsoSensitivityStatus());
+        }
+        if (key.matches(ICameraStatus.FLASH_XV))
+        {
+            return (getCurrentFlashStatus());
+        }
+        if (key.matches(ICameraStatus.SELF_TIMER))
+        {
+            return (getCurrentSelfTimerStatus());
+        }
+        if (key.matches(ICameraStatus.TAKE_MODE))
+        {
+            return ("");
+        }
         try
         {
             int strIndex = key.indexOf("x");
@@ -179,8 +1127,8 @@ class FujiXStatusHolder
                 {
                     int id = Integer.parseInt(key, 16);
                     int value = statusHolder.get(id);
-                    Log.v(TAG, "getItemStatus() value : " + value + " key : " + key + " [" + id + "]");
-                    dumpStatus();
+                    logcat("getItemStatus() value : " + value + " key : " + key + " [" + id + "]");
+                    // dumpStatus();
                     return (value + "");
                 }
                 catch (Exception e)
@@ -207,6 +1155,39 @@ class FujiXStatusHolder
         return ("? [" + key + "]");
     }
 
+    void setItemStatus(@NonNull String key, @NonNull String value)
+    {
+        try
+        {
+            logcat(" setStatus(" + key + ", " + value + ")");
+            if (key.matches(ICameraStatus.EFFECT))
+            {
+                setEffectItem(value);
+            }
+            else if (key.matches(ICameraStatus.WHITE_BALANCE))
+            {
+                setCurrentWhiteBalanceStatus(value);
+            }
+            else if (key.matches(ICameraStatus.ISO_SENSITIVITY))
+            {
+                setCurrentIsoSensitivityStatus(value);
+            }
+            else if (key.matches(ICameraStatus.FLASH_XV))
+            {
+                setCurrentFlashStatus(value);
+            }
+            else if (key.matches(ICameraStatus.SELF_TIMER))
+            {
+                setSelfTimerStatus(value);
+            }
+            // その他の設定...
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        }
+    }
+
     private void dumpStatus()
     {
         try
@@ -224,8 +1205,13 @@ class FujiXStatusHolder
         {
             e.printStackTrace();
         }
-
     }
 
-
+    private void logcat(String message)
+    {
+        if (logcat)
+        {
+            Log.v(TAG, message);
+        }
+    }
 }