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
29 private final String TAG = toString();
30 private static final boolean logcat = true;
31 private SparseIntArray statusHolder;
32 private SparseArrayCompat<String> statusNameArray;
36 statusHolder = new SparseIntArray();
39 statusNameArray = new SparseArrayCompat<>();
40 prepareStatusNameArray();
43 private void prepareStatusNameArray()
45 statusNameArray.clear();
46 statusNameArray.append(IFujiXCameraProperties.BATTERY_LEVEL, IFujiXCameraProperties.BATTERY_LEVEL_STR);
47 statusNameArray.append(IFujiXCameraProperties.WHITE_BALANCE, IFujiXCameraProperties.WHITE_BALANCE_STR);
48 statusNameArray.append(IFujiXCameraProperties.APERTURE, IFujiXCameraProperties.APERTURE_STR);
49 statusNameArray.append(IFujiXCameraProperties.FOCUS_MODE, IFujiXCameraProperties.FOCUS_MODE_STR);
50 statusNameArray.append(IFujiXCameraProperties.SHOOTING_MODE, IFujiXCameraProperties.SHOOTING_MODE_STR);
51 statusNameArray.append(IFujiXCameraProperties.FLASH, IFujiXCameraProperties.FLASH_STR);
52 statusNameArray.append(IFujiXCameraProperties.EXPOSURE_COMPENSATION, IFujiXCameraProperties.EXPOSURE_COMPENSATION_STR);
53 statusNameArray.append(IFujiXCameraProperties.SELF_TIMER, IFujiXCameraProperties.SELF_TIMER_STR);
54 statusNameArray.append(IFujiXCameraProperties.FILM_SIMULATION, IFujiXCameraProperties.FILM_SIMULATION_STR);
55 statusNameArray.append(IFujiXCameraProperties.IMAGE_FORMAT, IFujiXCameraProperties.IMAGE_FORMAT_STR);
56 statusNameArray.append(IFujiXCameraProperties.RECMODE_ENABLE, IFujiXCameraProperties.RECMODE_ENABLE_STR);
57 statusNameArray.append(IFujiXCameraProperties.F_SS_CONTROL, IFujiXCameraProperties.F_SS_CONTROL_STR);
58 statusNameArray.append(IFujiXCameraProperties.ISO, IFujiXCameraProperties.ISO_STR);
59 statusNameArray.append(IFujiXCameraProperties.MOVIE_ISO, IFujiXCameraProperties.MOVIE_ISO_STR);
60 statusNameArray.append(IFujiXCameraProperties.FOCUS_POINT, IFujiXCameraProperties.FOCUS_POINT_STR);
61 statusNameArray.append(IFujiXCameraProperties.DEVICE_ERROR, IFujiXCameraProperties.DEVICE_ERROR_STR);
62 statusNameArray.append(IFujiXCameraProperties.IMAGE_FILE_COUNT, IFujiXCameraProperties.IMAGE_FILE_COUNT_STR);
63 statusNameArray.append(IFujiXCameraProperties.SDCARD_REMAIN_SIZE, IFujiXCameraProperties.SDCARD_REMAIN_SIZE_STR);
64 statusNameArray.append(IFujiXCameraProperties.FOCUS_LOCK, IFujiXCameraProperties.FOCUS_LOCK_STR);
65 statusNameArray.append(IFujiXCameraProperties.MOVIE_REMAINING_TIME, IFujiXCameraProperties.MOVIE_REMAINING_TIME_STR);
66 statusNameArray.append(IFujiXCameraProperties.SHUTTER_SPEED, IFujiXCameraProperties.SHUTTER_SPEED_STR);
67 statusNameArray.append(IFujiXCameraProperties.IMAGE_ASPECT, IFujiXCameraProperties.IMAGE_ASPECT_STR);
68 statusNameArray.append(IFujiXCameraProperties.BATTERY_LEVEL_2, IFujiXCameraProperties.BATTERY_LEVEL_2_STR);
69 statusNameArray.append(IFujiXCameraProperties.UNKNOWN_DF00, IFujiXCameraProperties.UNKNOWN_DF00_STR);
70 statusNameArray.append(IFujiXCameraProperties.PICTURE_JPEG_COUNT, IFujiXCameraProperties.PICTURE_JPEG_COUNT_STR);
71 statusNameArray.append(IFujiXCameraProperties.UNKNOWN_D400, IFujiXCameraProperties.UNKNOWN_D400_STR);
72 statusNameArray.append(IFujiXCameraProperties.UNKNOWN_D401, IFujiXCameraProperties.UNKNOWN_D401_STR);
73 statusNameArray.append(IFujiXCameraProperties.UNKNOWN_D52F, IFujiXCameraProperties.UNKNOWN_D52F_STR);
74 statusNameArray.append(IFujiXCameraProperties.UNKNOWN_D245, IFujiXCameraProperties.UNKNOWN_D245_STR);
75 statusNameArray.append(IFujiXCameraProperties.UNKNOWN_DF41, IFujiXCameraProperties.UNKNOWN_DF41_STR);
76 statusNameArray.append(IFujiXCameraProperties.UNKNOWN_DF26, IFujiXCameraProperties.UNKNOWN_DF26_STR);
77 statusNameArray.append(IFujiXCameraProperties.UNKNOWN_DF27, IFujiXCameraProperties.UNKNOWN_DF27_STR);
80 void updateValue(@Nullable ICameraStatusUpdateNotify notifier, int id, byte data0, byte data1, byte data2, byte data3)
84 int value = ((((int) data3) & 0xff) << 24) + ((((int) data2) & 0xff) << 16) + ((((int) data1) & 0xff) << 8) + (((int) data0) & 0xff);
85 int currentValue = statusHolder.get(id, -1);
86 //logcat(String.format(Locale.US, " STATUS [id: 0x%04x] 0x%08x(%d) -> 0x%08x(%d)", id, currentValue, currentValue, value, value));
87 if ((notifier != null) && (currentValue != value))
89 statusHolder.put(id, value);
90 //logcat(String.format(Locale.US," STATUS UPDATE [id: 0x%04x] 0x%08x(%d) -> 0x%08x(%d)", id, currentValue, currentValue, value, value));
91 updateDetected(notifier, id, currentValue, value);
100 private void updateDetected(@NonNull ICameraStatusUpdateNotify notifier, int id, int previous, int current)
104 //String idName = statusNameArray.get(id, "Unknown");
105 //logcat(String.format(Locale.US, " << UPDATE STATUS >> id: 0x%04x[%s] 0x%08x(%d) -> 0x%08x(%d)", id, idName, previous, previous, current, current));
108 case IFujiXCameraProperties.FOCUS_LOCK:
109 updateFocusedStatus(notifier, previous, current);
111 case IFujiXCameraProperties.SHOOTING_MODE:
112 updatedTakeMode(notifier, previous, current);
114 case IFujiXCameraProperties.BATTERY_LEVEL:
115 case IFujiXCameraProperties.BATTERY_LEVEL_2:
116 updateBatteryLevel(notifier, previous, current);
118 case IFujiXCameraProperties.FOCUS_MODE:
119 updateFocusMode(notifier, previous, current);
121 case IFujiXCameraProperties.APERTURE:
122 updateAperture(notifier, previous, current);
124 case IFujiXCameraProperties.SHUTTER_SPEED:
125 updateShutterSpeed(notifier, previous, current);
127 case IFujiXCameraProperties.WHITE_BALANCE:
128 updateWhiteBalance(notifier, previous, current);
130 case IFujiXCameraProperties.EXPOSURE_COMPENSATION:
131 updateExposureCompensation(notifier, previous, current);
133 case IFujiXCameraProperties.ISO:
134 updateIsoSensitivity(notifier, previous, current);
136 case IFujiXCameraProperties.DEVICE_ERROR:
137 updateDeviceError(notifier, previous, current);
139 case IFujiXCameraProperties.SELF_TIMER:
140 updateSelfTimer(notifier, previous, current);
142 case IFujiXCameraProperties.SDCARD_REMAIN_SIZE:
143 updateSdCardRemainSize(notifier, previous, current);
145 case IFujiXCameraProperties.MOVIE_REMAINING_TIME:
146 updateMovieRemainTime(notifier, previous, current);
148 case IFujiXCameraProperties.FOCUS_POINT:
149 updateFocusPoint(notifier, previous, current);
151 case IFujiXCameraProperties.F_SS_CONTROL:
152 updateFSSControl(notifier, previous, current);
154 case IFujiXCameraProperties.IMAGE_ASPECT:
155 updateImageAspect(notifier, previous, current);
157 case IFujiXCameraProperties.FILM_SIMULATION:
158 updateFilmSimulation(notifier, previous, current);
160 case IFujiXCameraProperties.FLASH:
161 updateFlashMode(notifier, previous, current);
163 case IFujiXCameraProperties.IMAGE_FORMAT:
164 updateImageFormat(notifier, previous, current);
166 case IFujiXCameraProperties.UNKNOWN_D245:
167 case IFujiXCameraProperties.UNKNOWN_DF41:
168 case IFujiXCameraProperties.UNKNOWN_DF26:
169 case IFujiXCameraProperties.UNKNOWN_DF27:
170 updateUnknownValue(id, previous, current);
180 private void updateImageFormat(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
185 case IFujiXImageFormatMode.IMAGE_FORMAT_RAW:
188 case IFujiXImageFormatMode.IMAGE_FORMAT_FINE:
191 case IFujiXImageFormatMode.IMAGE_FORMAT_NORMAL:
194 case IFujiXImageFormatMode.IMAGE_FORMAT_FINE_RAW:
197 case IFujiXImageFormatMode.IMAGE_FORMAT_NORMAL_RAW:
201 value = "UNKNOWN : " + current;
204 logcat(" Image Format : " + value);
207 private void updateFlashMode(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
212 case IFujiXFlashMode.FLASH_AUTO:
215 case IFujiXFlashMode.FLASH_OFF:
218 case IFujiXFlashMode.FLASH_FILL:
221 case IFujiXFlashMode.FLASH_REDEYE_AUTO:
222 value = "REDEYE_AUTO";
224 case IFujiXFlashMode.FLASH_REDEYE_FILL:
225 value = "REDEYE_FILL";
227 case IFujiXFlashMode.FLASH_EXTERNAL_SYNC:
228 value = "EXTERNAL_SYNC";
230 case IFujiXFlashMode.FLASH_ON:
233 case IFujiXFlashMode.FLASH_REDEYE:
236 case IFujiXFlashMode.FLASH_REDEYE_ON:
239 case IFujiXFlashMode.FLASH_REDEYE_SYNC:
240 value = "REDEYE_SYNC";
242 case IFujiXFlashMode.FLASH_REDEYE_REAR:
243 value = "REDEYE_REAR";
245 case IFujiXFlashMode.FLASH_SLOW_SYNC:
248 case IFujiXFlashMode.FLASH_REAR_SYNC:
251 case IFujiXFlashMode.FLASH_COMMANDER:
254 case IFujiXFlashMode.FLASH_DISABLE:
257 case IFujiXFlashMode.FLASH_ENABLE:
261 value = " UNKNOWN : " + current;
264 logcat(" FLASH MODE : " + value);
267 private void updateFilmSimulation(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
272 case IFujiXFilmSimulation.FILM_SIMULATION_PROVIA:
275 case IFujiXFilmSimulation.FILM_SIMULATION_VELVIA:
278 case IFujiXFilmSimulation.FILM_SIMULATION_ASTIA:
281 case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME:
284 case IFujiXFilmSimulation.FILM_SIMULATION_SEPIA:
287 case IFujiXFilmSimulation.FILM_SIMULATION_PRO_NEG_HI:
290 case IFujiXFilmSimulation.FILM_SIMULATION_PRO_NEG_STD:
293 case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_Y_FILTER:
296 case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_R_FILTER:
299 case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_G_FILTER:
302 case IFujiXFilmSimulation.FILM_SIMULATION_CLASSIC_CHROME:
303 value = "CLASSIC CHROME";
305 case IFujiXFilmSimulation.FILM_SIMULATION_ACROS:
308 case IFujiXFilmSimulation.FILM_SIMULATION_ACROS_Y:
311 case IFujiXFilmSimulation.FILM_SIMULATION_ACROS_R:
314 case IFujiXFilmSimulation.FILM_SIMULATION_ACROS_G:
317 case IFujiXFilmSimulation.FILM_SIMULATION_ETERNA:
320 case IFujiXFilmSimulation.FILM_SIMULATION_CLASSIC_NEGATIVE:
321 value = "CLASSIC NEGATIVE";
324 value = "??? " + current;
327 logcat(" FILM SIMULATION : " + value);
330 private void updateImageAspect(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
335 case IFujiXImageAspectMode.IMAGE_ASPECT_S_3x2:
338 case IFujiXImageAspectMode.IMAGE_ASPECT_S_16x9:
341 case IFujiXImageAspectMode.IMAGE_ASPECT_S_1x1:
344 case IFujiXImageAspectMode.IMAGE_ASPECT_M_3x2:
347 case IFujiXImageAspectMode.IMAGE_ASPECT_M_16x9:
350 case IFujiXImageAspectMode.IMAGE_ASPECT_M_1x1:
353 case IFujiXImageAspectMode.IMAGE_ASPECT_L_3x2:
356 case IFujiXImageAspectMode.IMAGE_ASPECT_L_16x9:
359 case IFujiXImageAspectMode.IMAGE_ASPECT_L_1x1:
363 value = "? " + current;
366 logcat(" Image Aspect : " + value);
370 private void updateFSSControl(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
375 case IFujiXFSSControl.F_SS_CTRL_BOTH:
378 case IFujiXFSSControl.F_SS_CTRL_F:
381 case IFujiXFSSControl.F_SS_CTRL_SS:
384 case IFujiXFSSControl.F_SS_CTRL_NONE:
388 value = "? " + current;
391 logcat(" F_SS : " + value);
394 private void updateUnknownValue(int id, int previous, int current)
396 logcat(String.format(Locale.US,"<< UPDATE UNKNOWN STATUS >> id: 0x%04x 0x%08x(%d) -> 0x%08x(%d)", id, previous, previous, current, current));
399 private void updateFocusPoint(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
401 logcat(String.format(Locale.ENGLISH, " Focus Point : %x ", current));
404 private void updateMovieRemainTime(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
406 logcat(" MOVIE REMAIN : " + current);
409 private void updateSdCardRemainSize(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
411 logcat(" SDCARD REMAIN : " + current);
414 private void updateSelfTimer(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
421 case IFujiXTimerMode.TIMER_OFF:
425 case IFujiXTimerMode.TIMER_1SEC:
429 case IFujiXTimerMode.TIMER_2SEC:
433 case IFujiXTimerMode.TIMER_5SEC:
437 case IFujiXTimerMode.TIMER_10SEC:
451 logcat(" SELF TIMER IS OFF (" + value + ")");
455 logcat(" SELF TIMER IS " + value + " sec.");
459 private void updateDeviceError(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
463 notifier.updateWarning("ERROR " + current);
467 private void updateIsoSensitivity(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
472 iso = "" + (0x0000ffff & current);
478 notifier.updateIsoSensitivity(iso);
481 private void updateExposureCompensation(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
483 String exposureCompensation = "";
486 float value = ((float) current / 1000.0f);
487 exposureCompensation = String.format(Locale.ENGLISH, "%+1.1f", value);
493 notifier.updatedExposureCompensation(exposureCompensation);
496 private void updateWhiteBalance(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
503 case IFujiXWhiteBalanceMode.WHITE_BALANCE_AUTO:
506 case IFujiXWhiteBalanceMode.WHITE_BALANCE_FINE:
509 case IFujiXWhiteBalanceMode.WHITE_BALANCE_INCANDESCENT:
510 value = "Incandescent";
512 case IFujiXWhiteBalanceMode.WHITE_BALANCE_FLUORESCENT_1:
513 value = "Fluorescent 1";
515 case IFujiXWhiteBalanceMode.WHITE_BALANCE_FLUORESCENT_2:
516 value = "Fluorescent 2";
518 case IFujiXWhiteBalanceMode.WHITE_BALANCE_FLUORESCENT_3:
519 value = "Fluorescent 3";
521 case IFujiXWhiteBalanceMode.WHITE_BALANCE_SHADE:
524 case IFujiXWhiteBalanceMode.WHITE_BALANCE_UNDERWATER:
525 value = "Underwater";
527 case IFujiXWhiteBalanceMode.WHITE_BALANCE_TEMPERATURE:
530 case IFujiXWhiteBalanceMode.WHITE_BALANCE_CUSTOM:
542 notifier.updatedWBMode(value);
545 private void updateShutterSpeed(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
547 String shutterSpeed = "--";
550 if ((0x80000000 & current) != 0)
552 int value = 0x0fffffff & current;
553 shutterSpeed = ("1/" + (value / 1000));
557 shutterSpeed = (current + "");
564 notifier.updatedShutterSpeed(shutterSpeed);
567 private void updateAperture(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
569 String aperature = "---";
572 float value = ((float) current / 100.0f);
573 aperature = String.format(Locale.ENGLISH, "%1.1f", value);
579 notifier.updatedAperture(aperature);
582 private void updateFocusMode(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
587 if (current == IFujiXFocusingMode.FOCUS_MANUAL)
591 else if (current == IFujiXFocusingMode.FOCUS_CONTINUOUS_AUTO)
595 else if (current == IFujiXFocusingMode.FOCUS_SINGLE_AUTO)
601 mode = mode + current;
603 logcat(" Focus Mode : " + mode);
606 private void updateFocusedStatus(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
611 notifier.updateFocusedStatus(true, true);
616 notifier.updateFocusedStatus(false, false);
620 private void updatedTakeMode(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
625 case IFujiXShootingMode.SHOOTING_MANUAL:
628 case IFujiXShootingMode.SHOOTING_PROGRAM:
631 case IFujiXShootingMode.SHOOTING_APERTURE:
634 case IFujiXShootingMode.SHOOTING_SHUTTER:
637 case IFujiXShootingMode.SHOOTING_CUSTOM:
640 case IFujiXShootingMode.SHOOTING_AUTO:
644 mode = mode + current;
647 notifier.updatedTakeMode(mode);
650 private void updateBatteryLevel(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
653 if ((current == IFujiXBatteryMode.BATTERY_CRITICAL) || (current == IFujiXBatteryMode.BATTERY_126S_CRITICAL))
657 else if (current == IFujiXBatteryMode.BATTERY_126S_ONE_BAR)
661 else if ((current == IFujiXBatteryMode.BATTERY_ONE_BAR) || (current == IFujiXBatteryMode.BATTERY_126S_TWO_BAR))
665 else if (current == IFujiXBatteryMode.BATTERY_126S_THREE_BAR)
669 else if ((current == IFujiXBatteryMode.BATTERY_TWO_BAR) || (current == IFujiXBatteryMode.BATTERY_126S_FOUR_BAR))
673 else // if ((current == IFujiXBatteryMode.BATTERY_FULL) || (current == IFujiXBatteryMode.BATTERY_126S_FULL))
677 notifier.updateRemainBattery(level);
682 * 認識したカメラのステータス名称のリストを応答する
685 private List<String> getAvailableStatusNameList()
687 ArrayList<String> selection = new ArrayList<>();
690 for (int index = 0; index < statusHolder.size(); index++)
692 int key = statusHolder.keyAt(index);
693 selection.add(statusNameArray.get(key, String.format(Locale.US, "0x%04x", key)));
704 List<String> getAvailableItemList(String listKey)
706 if ((listKey == null)||(listKey.isEmpty()))
709 return (getAvailableStatusNameList());
712 ///// 選択可能なステータスの一覧を取得する : でも以下はアイテム名の一覧... /////
713 ArrayList<String> selection = new ArrayList<>();
716 for (int index = 0; index < statusHolder.size(); index++)
718 int key = statusHolder.keyAt(index);
719 selection.add(statusNameArray.get(key));
729 String getItemStatus(String key)
733 int strIndex = key.indexOf("x");
734 Log.v(TAG, "getItemStatus() : " + key + " [" + strIndex + "]");
737 key = key.substring(strIndex + 1);
740 int id = Integer.parseInt(key, 16);
741 int value = statusHolder.get(id);
742 logcat("getItemStatus() value : " + value + " key : " + key + " [" + id + "]");
752 for (int index = 0; index < statusNameArray.size(); index++)
754 int id = statusNameArray.keyAt(index);
755 String strKey = statusNameArray.valueAt(index);
756 if (key.contentEquals(strKey))
758 int value = statusHolder.get(id);
767 return ("? [" + key + "]");
770 private void dumpStatus()
774 Log.v(TAG, " - - - status - - - ");
775 for (int index = 0; index < statusHolder.size(); index++)
777 int key = statusHolder.keyAt(index);
778 int value = statusHolder.get(key);
779 Log.v(TAG, String.format("id : 0x%x value : %d (0x%x) ", key, value, value));
781 Log.v(TAG, " - - - status - - - ");
789 private void logcat(String message)