1 package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper;
3 import android.util.Log;
4 import android.util.SparseIntArray;
6 import androidx.annotation.NonNull;
7 import androidx.annotation.Nullable;
8 import androidx.collection.SparseArrayCompat;
10 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXBatteryMode;
11 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXCameraProperties;
12 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXFSSControl;
13 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXFilmSimulation;
14 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXFlashMode;
15 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXFocusingMode;
16 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXImageAspectMode;
17 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXImageFormatMode;
18 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXShootingMode;
19 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXTimerMode;
20 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXWhiteBalanceMode;
21 import net.osdn.gokigen.gr2control.liveview.ICameraStatusUpdateNotify;
23 import java.util.ArrayList;
24 import java.util.List;
25 import java.util.Locale;
27 class FujiXStatusHolder {
28 private final String TAG = toString();
29 private static final boolean logcat = true;
30 private SparseIntArray statusHolder;
31 private SparseArrayCompat<String> statusNameArray;
34 statusHolder = new SparseIntArray();
37 statusNameArray = new SparseArrayCompat<>();
38 prepareStatusNameArray();
41 private void prepareStatusNameArray()
43 statusNameArray.clear();
44 statusNameArray.append(IFujiXCameraProperties.BATTERY_LEVEL, IFujiXCameraProperties.BATTERY_LEVEL_STR);
45 statusNameArray.append(IFujiXCameraProperties.WHITE_BALANCE, IFujiXCameraProperties.WHITE_BALANCE_STR);
46 statusNameArray.append(IFujiXCameraProperties.APERTURE, IFujiXCameraProperties.APERTURE_STR);
47 statusNameArray.append(IFujiXCameraProperties.FOCUS_MODE, IFujiXCameraProperties.FOCUS_MODE_STR);
48 statusNameArray.append(IFujiXCameraProperties.SHOOTING_MODE, IFujiXCameraProperties.SHOOTING_MODE_STR);
49 statusNameArray.append(IFujiXCameraProperties.FLASH, IFujiXCameraProperties.FLASH_STR);
50 statusNameArray.append(IFujiXCameraProperties.EXPOSURE_COMPENSATION, IFujiXCameraProperties.EXPOSURE_COMPENSATION_STR);
51 statusNameArray.append(IFujiXCameraProperties.SELF_TIMER, IFujiXCameraProperties.SELF_TIMER_STR);
52 statusNameArray.append(IFujiXCameraProperties.FILM_SIMULATION, IFujiXCameraProperties.FILM_SIMULATION_STR);
53 statusNameArray.append(IFujiXCameraProperties.IMAGE_FORMAT, IFujiXCameraProperties.IMAGE_FORMAT_STR);
54 statusNameArray.append(IFujiXCameraProperties.RECMODE_ENABLE, IFujiXCameraProperties.RECMODE_ENABLE_STR);
55 statusNameArray.append(IFujiXCameraProperties.F_SS_CONTROL, IFujiXCameraProperties.F_SS_CONTROL_STR);
56 statusNameArray.append(IFujiXCameraProperties.ISO, IFujiXCameraProperties.ISO_STR);
57 statusNameArray.append(IFujiXCameraProperties.MOVIE_ISO, IFujiXCameraProperties.MOVIE_ISO_STR);
58 statusNameArray.append(IFujiXCameraProperties.FOCUS_POINT, IFujiXCameraProperties.FOCUS_POINT_STR);
59 statusNameArray.append(IFujiXCameraProperties.DEVICE_ERROR, IFujiXCameraProperties.DEVICE_ERROR_STR);
60 statusNameArray.append(IFujiXCameraProperties.IMAGE_FILE_COUNT, IFujiXCameraProperties.IMAGE_FILE_COUNT_STR);
61 statusNameArray.append(IFujiXCameraProperties.SDCARD_REMAIN_SIZE, IFujiXCameraProperties.SDCARD_REMAIN_SIZE_STR);
62 statusNameArray.append(IFujiXCameraProperties.FOCUS_LOCK, IFujiXCameraProperties.FOCUS_LOCK_STR);
63 statusNameArray.append(IFujiXCameraProperties.MOVIE_REMAINING_TIME, IFujiXCameraProperties.MOVIE_REMAINING_TIME_STR);
64 statusNameArray.append(IFujiXCameraProperties.SHUTTER_SPEED, IFujiXCameraProperties.SHUTTER_SPEED_STR);
65 statusNameArray.append(IFujiXCameraProperties.IMAGE_ASPECT, IFujiXCameraProperties.IMAGE_ASPECT_STR);
66 statusNameArray.append(IFujiXCameraProperties.BATTERY_LEVEL_2, IFujiXCameraProperties.BATTERY_LEVEL_2_STR);
67 statusNameArray.append(IFujiXCameraProperties.UNKNOWN_DF00, IFujiXCameraProperties.UNKNOWN_DF00_STR);
68 statusNameArray.append(IFujiXCameraProperties.PICTURE_JPEG_COUNT, IFujiXCameraProperties.PICTURE_JPEG_COUNT_STR);
69 statusNameArray.append(IFujiXCameraProperties.UNKNOWN_D400, IFujiXCameraProperties.UNKNOWN_D400_STR);
70 statusNameArray.append(IFujiXCameraProperties.UNKNOWN_D401, IFujiXCameraProperties.UNKNOWN_D401_STR);
71 statusNameArray.append(IFujiXCameraProperties.UNKNOWN_D52F, IFujiXCameraProperties.UNKNOWN_D52F_STR);
72 statusNameArray.append(IFujiXCameraProperties.UNKNOWN_D245, IFujiXCameraProperties.UNKNOWN_D245_STR);
73 statusNameArray.append(IFujiXCameraProperties.UNKNOWN_DF41, IFujiXCameraProperties.UNKNOWN_DF41_STR);
74 statusNameArray.append(IFujiXCameraProperties.UNKNOWN_DF26, IFujiXCameraProperties.UNKNOWN_DF26_STR);
75 statusNameArray.append(IFujiXCameraProperties.UNKNOWN_DF27, IFujiXCameraProperties.UNKNOWN_DF27_STR);
78 void updateValue(@Nullable ICameraStatusUpdateNotify notifier, int id, byte data0, byte data1, byte data2, byte data3) {
81 int value = ((((int) data3) & 0xff) << 24) + ((((int) data2) & 0xff) << 16) + ((((int) data1) & 0xff) << 8) + (((int) data0) & 0xff);
82 int currentValue = statusHolder.get(id, -1);
83 //logcat(String.format(Locale.US, " STATUS [id: 0x%04x] 0x%08x(%d) -> 0x%08x(%d)", id, currentValue, currentValue, value, value));
84 if ((notifier != null) && (currentValue != value))
86 statusHolder.put(id, value);
87 //logcat(String.format(Locale.US," STATUS UPDATE [id: 0x%04x] 0x%08x(%d) -> 0x%08x(%d)", id, currentValue, currentValue, value, value));
88 updateDetected(notifier, id, currentValue, value);
97 private void updateDetected(@NonNull ICameraStatusUpdateNotify notifier, int id, int previous, int current)
101 //String idName = statusNameArray.get(id, "Unknown");
102 //logcat(String.format(Locale.US, " << UPDATE STATUS >> id: 0x%04x[%s] 0x%08x(%d) -> 0x%08x(%d)", id, idName, previous, previous, current, current));
105 case IFujiXCameraProperties.FOCUS_LOCK:
106 updateFocusedStatus(notifier, previous, current);
108 case IFujiXCameraProperties.SHOOTING_MODE:
109 updatedTakeMode(notifier, previous, current);
111 case IFujiXCameraProperties.BATTERY_LEVEL:
112 case IFujiXCameraProperties.BATTERY_LEVEL_2:
113 updateBatteryLevel(notifier, previous, current);
115 case IFujiXCameraProperties.FOCUS_MODE:
116 updateFocusMode(notifier, previous, current);
118 case IFujiXCameraProperties.APERTURE:
119 updateAperture(notifier, previous, current);
121 case IFujiXCameraProperties.SHUTTER_SPEED:
122 updateShutterSpeed(notifier, previous, current);
124 case IFujiXCameraProperties.WHITE_BALANCE:
125 updateWhiteBalance(notifier, previous, current);
127 case IFujiXCameraProperties.EXPOSURE_COMPENSATION:
128 updateExposureCompensation(notifier, previous, current);
130 case IFujiXCameraProperties.ISO:
131 updateIsoSensitivity(notifier, previous, current);
133 case IFujiXCameraProperties.DEVICE_ERROR:
134 updateDeviceError(notifier, previous, current);
136 case IFujiXCameraProperties.SELF_TIMER:
137 updateSelfTimer(notifier, previous, current);
139 case IFujiXCameraProperties.SDCARD_REMAIN_SIZE:
140 updateSdCardRemainSize(notifier, previous, current);
142 case IFujiXCameraProperties.MOVIE_REMAINING_TIME:
143 updateMovieRemainTime(notifier, previous, current);
145 case IFujiXCameraProperties.FOCUS_POINT:
146 updateFocusPoint(notifier, previous, current);
148 case IFujiXCameraProperties.F_SS_CONTROL:
149 updateFSSControl(notifier, previous, current);
151 case IFujiXCameraProperties.IMAGE_ASPECT:
152 updateImageAspect(notifier, previous, current);
154 case IFujiXCameraProperties.FILM_SIMULATION:
155 updateFilmSimulation(notifier, previous, current);
157 case IFujiXCameraProperties.FLASH:
158 updateFlashMode(notifier, previous, current);
160 case IFujiXCameraProperties.IMAGE_FORMAT:
161 updateImageFormat(notifier, previous, current);
163 case IFujiXCameraProperties.UNKNOWN_D245:
164 case IFujiXCameraProperties.UNKNOWN_DF41:
165 case IFujiXCameraProperties.UNKNOWN_DF26:
166 case IFujiXCameraProperties.UNKNOWN_DF27:
167 updateUnknownValue(id, previous, current);
177 private void updateImageFormat(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
182 case IFujiXImageFormatMode.IMAGE_FORMAT_RAW:
185 case IFujiXImageFormatMode.IMAGE_FORMAT_FINE:
188 case IFujiXImageFormatMode.IMAGE_FORMAT_NORMAL:
191 case IFujiXImageFormatMode.IMAGE_FORMAT_FINE_RAW:
194 case IFujiXImageFormatMode.IMAGE_FORMAT_NORMAL_RAW:
198 value = "UNKNOWN : " + current;
201 logcat(" Image Format : " + value);
204 private void updateFlashMode(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
209 case IFujiXFlashMode.FLASH_AUTO:
212 case IFujiXFlashMode.FLASH_OFF:
215 case IFujiXFlashMode.FLASH_FILL:
218 case IFujiXFlashMode.FLASH_REDEYE_AUTO:
219 value = "REDEYE_AUTO";
221 case IFujiXFlashMode.FLASH_REDEYE_FILL:
222 value = "REDEYE_FILL";
224 case IFujiXFlashMode.FLASH_EXTERNAL_SYNC:
225 value = "EXTERNAL_SYNC";
227 case IFujiXFlashMode.FLASH_ON:
230 case IFujiXFlashMode.FLASH_REDEYE:
233 case IFujiXFlashMode.FLASH_REDEYE_ON:
236 case IFujiXFlashMode.FLASH_REDEYE_SYNC:
237 value = "REDEYE_SYNC";
239 case IFujiXFlashMode.FLASH_REDEYE_REAR:
240 value = "REDEYE_REAR";
242 case IFujiXFlashMode.FLASH_SLOW_SYNC:
245 case IFujiXFlashMode.FLASH_REAR_SYNC:
248 case IFujiXFlashMode.FLASH_COMMANDER:
251 case IFujiXFlashMode.FLASH_DISABLE:
254 case IFujiXFlashMode.FLASH_ENABLE:
258 value = " UNKNOWN : " + current;
261 logcat(" FLASH MODE : " + value);
264 private void updateFilmSimulation(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
269 case IFujiXFilmSimulation.FILM_SIMULATION_PROVIA:
272 case IFujiXFilmSimulation.FILM_SIMULATION_VELVIA:
275 case IFujiXFilmSimulation.FILM_SIMULATION_ASTIA:
278 case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME:
281 case IFujiXFilmSimulation.FILM_SIMULATION_SEPIA:
284 case IFujiXFilmSimulation.FILM_SIMULATION_PRO_NEG_HI:
287 case IFujiXFilmSimulation.FILM_SIMULATION_PRO_NEG_STD:
290 case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_Y_FILTER:
293 case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_R_FILTER:
296 case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_G_FILTER:
299 case IFujiXFilmSimulation.FILM_SIMULATION_CLASSIC_CHROME:
300 value = "CLASSIC CHROME";
302 case IFujiXFilmSimulation.FILM_SIMULATION_ACROS:
305 case IFujiXFilmSimulation.FILM_SIMULATION_ACROS_Y:
308 case IFujiXFilmSimulation.FILM_SIMULATION_ACROS_R:
311 case IFujiXFilmSimulation.FILM_SIMULATION_ACROS_G:
314 case IFujiXFilmSimulation.FILM_SIMULATION_ETERNA:
318 value = "??? " + current;
321 logcat(" FILM SIMULATION : " + value);
324 private void updateImageAspect(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
329 case IFujiXImageAspectMode.IMAGE_ASPECT_S_3x2:
332 case IFujiXImageAspectMode.IMAGE_ASPECT_S_16x9:
335 case IFujiXImageAspectMode.IMAGE_ASPECT_S_1x1:
338 case IFujiXImageAspectMode.IMAGE_ASPECT_M_3x2:
341 case IFujiXImageAspectMode.IMAGE_ASPECT_M_16x9:
344 case IFujiXImageAspectMode.IMAGE_ASPECT_M_1x1:
347 case IFujiXImageAspectMode.IMAGE_ASPECT_L_3x2:
350 case IFujiXImageAspectMode.IMAGE_ASPECT_L_16x9:
353 case IFujiXImageAspectMode.IMAGE_ASPECT_L_1x1:
357 value = "? " + current;
360 logcat(" Image Aspect : " + value);
364 private void updateFSSControl(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
369 case IFujiXFSSControl.F_SS_CTRL_BOTH:
372 case IFujiXFSSControl.F_SS_CTRL_F:
375 case IFujiXFSSControl.F_SS_CTRL_SS:
378 case IFujiXFSSControl.F_SS_CTRL_NONE:
382 value = "? " + current;
385 logcat(" F_SS : " + value);
388 private void updateUnknownValue(int id, int previous, int current)
390 logcat(String.format(Locale.US,"<< UPDATE UNKNOWN STATUS >> id: 0x%04x 0x%08x(%d) -> 0x%08x(%d)", id, previous, previous, current, current));
393 private void updateFocusPoint(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
395 logcat(String.format(Locale.ENGLISH, " Focus Point : %x ", current));
398 private void updateMovieRemainTime(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
400 logcat(" MOVIE REMAIN : " + current);
403 private void updateSdCardRemainSize(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
405 logcat(" SDCARD REMAIN : " + current);
408 private void updateSelfTimer(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
415 case IFujiXTimerMode.TIMER_OFF:
419 case IFujiXTimerMode.TIMER_1SEC:
423 case IFujiXTimerMode.TIMER_2SEC:
427 case IFujiXTimerMode.TIMER_5SEC:
431 case IFujiXTimerMode.TIMER_10SEC:
445 logcat(" SELF TIMER IS OFF (" + value + ")");
449 logcat(" SELF TIMER IS " + value + " sec.");
453 private void updateDeviceError(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
457 notifier.updateWarning("ERROR " + current);
461 private void updateIsoSensitivity(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
466 iso = "" + (0x0000ffff & current);
472 notifier.updateIsoSensitivity(iso);
475 private void updateExposureCompensation(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
477 String exposureCompensation = "";
480 float value = ((float) current / 1000.0f);
481 exposureCompensation = String.format(Locale.ENGLISH, "%+1.1f", value);
487 notifier.updatedExposureCompensation(exposureCompensation);
490 private void updateWhiteBalance(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
497 case IFujiXWhiteBalanceMode.WHITE_BALANCE_AUTO:
500 case IFujiXWhiteBalanceMode.WHITE_BALANCE_FINE:
503 case IFujiXWhiteBalanceMode.WHITE_BALANCE_INCANDESCENT:
504 value = "Incandescent";
506 case IFujiXWhiteBalanceMode.WHITE_BALANCE_FLUORESCENT_1:
507 value = "Fluorescent 1";
509 case IFujiXWhiteBalanceMode.WHITE_BALANCE_FLUORESCENT_2:
510 value = "Fluorescent 2";
512 case IFujiXWhiteBalanceMode.WHITE_BALANCE_FLUORESCENT_3:
513 value = "Fluorescent 3";
515 case IFujiXWhiteBalanceMode.WHITE_BALANCE_SHADE:
518 case IFujiXWhiteBalanceMode.WHITE_BALANCE_UNDERWATER:
519 value = "Underwater";
521 case IFujiXWhiteBalanceMode.WHITE_BALANCE_TEMPERATURE:
524 case IFujiXWhiteBalanceMode.WHITE_BALANCE_CUSTOM:
536 notifier.updatedWBMode(value);
539 private void updateShutterSpeed(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
541 String shutterSpeed = "--";
544 if ((0x80000000 & current) != 0)
546 int value = 0x0fffffff & current;
547 shutterSpeed = ("1/" + (value / 1000));
551 shutterSpeed = (current + "");
558 notifier.updatedShutterSpeed(shutterSpeed);
561 private void updateAperture(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
563 String aperature = "---";
566 float value = ((float) current / 100.0f);
567 aperature = String.format(Locale.ENGLISH, "%1.1f", value);
573 notifier.updatedAperture(aperature);
576 private void updateFocusMode(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
581 if (current == IFujiXFocusingMode.FOCUS_MANUAL)
585 else if (current == IFujiXFocusingMode.FOCUS_CONTINUOUS_AUTO)
589 else if (current == IFujiXFocusingMode.FOCUS_SINGLE_AUTO)
595 mode = mode + current;
597 logcat(" Focus Mode : " + mode);
600 private void updateFocusedStatus(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
605 notifier.updateFocusedStatus(true, true);
610 notifier.updateFocusedStatus(false, false);
614 private void updatedTakeMode(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
619 case IFujiXShootingMode.SHOOTING_MANUAL:
622 case IFujiXShootingMode.SHOOTING_PROGRAM:
625 case IFujiXShootingMode.SHOOTING_APERTURE:
628 case IFujiXShootingMode.SHOOTING_SHUTTER:
631 case IFujiXShootingMode.SHOOTING_CUSTOM:
634 case IFujiXShootingMode.SHOOTING_AUTO:
638 mode = mode + current;
641 notifier.updatedTakeMode(mode);
644 private void updateBatteryLevel(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
647 if ((current == IFujiXBatteryMode.BATTERY_CRITICAL) || (current == IFujiXBatteryMode.BATTERY_126S_CRITICAL))
651 else if (current == IFujiXBatteryMode.BATTERY_126S_ONE_BAR)
655 else if ((current == IFujiXBatteryMode.BATTERY_ONE_BAR) || (current == IFujiXBatteryMode.BATTERY_126S_TWO_BAR))
659 else if (current == IFujiXBatteryMode.BATTERY_126S_THREE_BAR)
663 else if ((current == IFujiXBatteryMode.BATTERY_TWO_BAR) || (current == IFujiXBatteryMode.BATTERY_126S_FOUR_BAR))
667 else // if ((current == IFujiXBatteryMode.BATTERY_FULL) || (current == IFujiXBatteryMode.BATTERY_126S_FULL))
671 notifier.updateRemainBattery(level);
676 * 認識したカメラのステータス名称のリストを応答する
679 private List<String> getAvailableStatusNameList()
681 ArrayList<String> selection = new ArrayList<>();
684 for (int index = 0; index < statusHolder.size(); index++)
686 int key = statusHolder.keyAt(index);
687 selection.add(statusNameArray.get(key, String.format(Locale.US, "0x%04x", key)));
698 List<String> getAvailableItemList(String listKey)
703 return (getAvailableStatusNameList());
706 ///// 選択可能なステータスの一覧を取得する : でも以下はアイテム名の一覧... /////
707 ArrayList<String> selection = new ArrayList<>();
710 for (int index = 0; index < statusHolder.size(); index++)
712 int key = statusHolder.keyAt(index);
713 selection.add(statusNameArray.get(key));
723 String getItemStatus(String key)
727 int strIndex = key.indexOf("x");
728 Log.v(TAG, "getItemStatus() : " + key + " [" + strIndex + "]");
731 key = key.substring(strIndex + 1);
734 int id = Integer.parseInt(key, 16);
735 int value = statusHolder.get(id);
736 logcat("getItemStatus() value : " + value + " key : " + key + " [" + id + "]");
746 for (int index = 0; index < statusNameArray.size(); index++)
748 int id = statusNameArray.keyAt(index);
749 String strKey = statusNameArray.valueAt(index);
750 if (key.contentEquals(strKey))
752 int value = statusHolder.get(id);
761 return ("? [" + key + "]");
764 private void dumpStatus()
768 Log.v(TAG, " - - - status - - - ");
769 for (int index = 0; index < statusHolder.size(); index++)
771 int key = statusHolder.keyAt(index);
772 int value = statusHolder.get(key);
773 Log.v(TAG, String.format("id : 0x%x value : %d (0x%x) ", key, value, value));
775 Log.v(TAG, " - - - status - - - ");
783 private void logcat(String message)