OSDN Git Service

FUJI用のコマンド送信ダイアログを搭載。
[gokigen/Gr2Control.git] / app / src / main / java / net / osdn / gokigen / gr2control / camera / fuji_x / wrapper / FujiXStatusHolder.java
1 package net.osdn.gokigen.gr2control.camera.fuji_x.wrapper;
2
3 import android.util.Log;
4 import android.util.SparseIntArray;
5
6 import androidx.annotation.NonNull;
7 import androidx.annotation.Nullable;
8 import androidx.collection.SparseArrayCompat;
9
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;
22
23 import java.util.ArrayList;
24 import java.util.List;
25 import java.util.Locale;
26
27 class FujiXStatusHolder
28 {
29     private final String TAG = toString();
30     private static final boolean logcat = true;
31     private SparseIntArray statusHolder;
32     private SparseArrayCompat<String> statusNameArray;
33
34     FujiXStatusHolder()
35     {
36         statusHolder = new SparseIntArray();
37         statusHolder.clear();
38
39         statusNameArray = new SparseArrayCompat<>();
40         prepareStatusNameArray();
41     }
42
43     private void prepareStatusNameArray()
44     {
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);
78     }
79
80     void updateValue(@Nullable ICameraStatusUpdateNotify notifier, int id, byte data0, byte data1, byte data2, byte data3)
81     {
82         try
83         {
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))
88             {
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);
92             }
93         }
94         catch (Exception e)
95         {
96             e.printStackTrace();
97         }
98     }
99
100     private void updateDetected(@NonNull ICameraStatusUpdateNotify notifier, int id, int previous, int current)
101     {
102         try
103         {
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));
106             switch (id)
107             {
108                 case IFujiXCameraProperties.FOCUS_LOCK:
109                     updateFocusedStatus(notifier, previous, current);
110                     break;
111                 case IFujiXCameraProperties.SHOOTING_MODE:
112                     updatedTakeMode(notifier, previous, current);
113                     break;
114                 case IFujiXCameraProperties.BATTERY_LEVEL:
115                 case IFujiXCameraProperties.BATTERY_LEVEL_2:
116                     updateBatteryLevel(notifier, previous, current);
117                     break;
118                 case IFujiXCameraProperties.FOCUS_MODE:
119                     updateFocusMode(notifier, previous, current);
120                     break;
121                 case IFujiXCameraProperties.APERTURE:
122                     updateAperture(notifier, previous, current);
123                     break;
124                 case IFujiXCameraProperties.SHUTTER_SPEED:
125                     updateShutterSpeed(notifier, previous, current);
126                     break;
127                 case IFujiXCameraProperties.WHITE_BALANCE:
128                     updateWhiteBalance(notifier, previous, current);
129                     break;
130                 case IFujiXCameraProperties.EXPOSURE_COMPENSATION:
131                     updateExposureCompensation(notifier, previous, current);
132                     break;
133                 case IFujiXCameraProperties.ISO:
134                     updateIsoSensitivity(notifier, previous, current);
135                     break;
136                 case IFujiXCameraProperties.DEVICE_ERROR:
137                     updateDeviceError(notifier, previous, current);
138                     break;
139                 case IFujiXCameraProperties.SELF_TIMER:
140                     updateSelfTimer(notifier, previous, current);
141                     break;
142                 case IFujiXCameraProperties.SDCARD_REMAIN_SIZE:
143                     updateSdCardRemainSize(notifier, previous, current);
144                     break;
145                 case IFujiXCameraProperties.MOVIE_REMAINING_TIME:
146                     updateMovieRemainTime(notifier, previous, current);
147                     break;
148                 case IFujiXCameraProperties.FOCUS_POINT:
149                     updateFocusPoint(notifier, previous, current);
150                     break;
151                 case IFujiXCameraProperties.F_SS_CONTROL:
152                     updateFSSControl(notifier, previous, current);
153                     break;
154                 case IFujiXCameraProperties.IMAGE_ASPECT:
155                     updateImageAspect(notifier, previous, current);
156                     break;
157                 case IFujiXCameraProperties.FILM_SIMULATION:
158                     updateFilmSimulation(notifier, previous, current);
159                     break;
160                 case IFujiXCameraProperties.FLASH:
161                     updateFlashMode(notifier, previous, current);
162                     break;
163                 case IFujiXCameraProperties.IMAGE_FORMAT:
164                     updateImageFormat(notifier, previous, current);
165                     break;
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);
171                     break;
172             }
173         }
174         catch (Exception e)
175         {
176             e.printStackTrace();
177         }
178     }
179
180     private void updateImageFormat(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
181     {
182         String value;
183         switch (current)
184         {
185             case IFujiXImageFormatMode.IMAGE_FORMAT_RAW:
186                 value = "RAW";
187                 break;
188             case IFujiXImageFormatMode.IMAGE_FORMAT_FINE:
189                 value = "FINE";
190                 break;
191             case IFujiXImageFormatMode.IMAGE_FORMAT_NORMAL:
192                 value = "NORMAL";
193                 break;
194             case IFujiXImageFormatMode.IMAGE_FORMAT_FINE_RAW:
195                 value = "RAW+F";
196                 break;
197             case IFujiXImageFormatMode.IMAGE_FORMAT_NORMAL_RAW:
198                 value = "RAW+N";
199                 break;
200             default:
201                 value = "UNKNOWN : " + current;
202                 break;
203         }
204         logcat(" Image Format : " + value);
205     }
206
207     private void updateFlashMode(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
208     {
209         String value;
210         switch (current)
211         {
212             case IFujiXFlashMode.FLASH_AUTO:
213                 value = "AUTO";
214                 break;
215             case IFujiXFlashMode.FLASH_OFF:
216                 value = "OFF";
217                 break;
218             case IFujiXFlashMode.FLASH_FILL:
219                 value = "FILL";
220                 break;
221             case IFujiXFlashMode.FLASH_REDEYE_AUTO:
222                 value = "REDEYE_AUTO";
223                 break;
224             case IFujiXFlashMode.FLASH_REDEYE_FILL:
225                 value = "REDEYE_FILL";
226                 break;
227             case IFujiXFlashMode.FLASH_EXTERNAL_SYNC:
228                 value = "EXTERNAL_SYNC";
229                 break;
230             case IFujiXFlashMode.FLASH_ON:
231                 value = "ON";
232                 break;
233             case IFujiXFlashMode.FLASH_REDEYE:
234                 value = "REDEYE";
235                 break;
236             case IFujiXFlashMode.FLASH_REDEYE_ON:
237                 value = "REDEYE_ON";
238                 break;
239             case IFujiXFlashMode.FLASH_REDEYE_SYNC:
240                 value = "REDEYE_SYNC";
241                 break;
242             case IFujiXFlashMode.FLASH_REDEYE_REAR:
243                 value = "REDEYE_REAR";
244                 break;
245             case IFujiXFlashMode.FLASH_SLOW_SYNC:
246                 value = "SLOW_SYNC";
247                 break;
248             case IFujiXFlashMode.FLASH_REAR_SYNC:
249                 value = "REAR_SYNC";
250                 break;
251             case IFujiXFlashMode.FLASH_COMMANDER:
252                 value = "COMMANDER";
253                 break;
254             case IFujiXFlashMode.FLASH_DISABLE:
255                 value = "DISABLE";
256                 break;
257             case IFujiXFlashMode.FLASH_ENABLE:
258                 value = "ENABLE";
259                 break;
260             default:
261                 value = " UNKNOWN : " + current;
262                 break;
263         }
264         logcat(" FLASH MODE : " + value);
265     }
266
267     private void updateFilmSimulation(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
268     {
269         String value;
270         switch (current)
271         {
272             case IFujiXFilmSimulation.FILM_SIMULATION_PROVIA:
273                 value = "PROVIA";
274                 break;
275             case IFujiXFilmSimulation.FILM_SIMULATION_VELVIA:
276                 value = "VELVIA";
277                 break;
278             case IFujiXFilmSimulation.FILM_SIMULATION_ASTIA:
279                 value = "ASTIA";
280                 break;
281             case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME:
282                 value = "MONO";
283                 break;
284             case IFujiXFilmSimulation.FILM_SIMULATION_SEPIA:
285                 value = "SEPIA";
286                 break;
287             case IFujiXFilmSimulation.FILM_SIMULATION_PRO_NEG_HI:
288                 value = "NEG_HI";
289                 break;
290             case IFujiXFilmSimulation.FILM_SIMULATION_PRO_NEG_STD:
291                 value = "NEG_STD";
292                 break;
293             case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_Y_FILTER:
294                 value = "MONO_Y";
295                 break;
296             case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_R_FILTER:
297                 value = "MONO_R";
298                 break;
299             case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_G_FILTER:
300                 value = "MONO_G";
301                 break;
302             case IFujiXFilmSimulation.FILM_SIMULATION_CLASSIC_CHROME:
303                 value = "CLASSIC CHROME";
304                 break;
305             case IFujiXFilmSimulation.FILM_SIMULATION_ACROS:
306                 value = "ACROS";
307                 break;
308             case IFujiXFilmSimulation.FILM_SIMULATION_ACROS_Y:
309                 value = "ACROS_Y";
310                 break;
311             case IFujiXFilmSimulation.FILM_SIMULATION_ACROS_R:
312                 value = "ACROS_R";
313                 break;
314             case IFujiXFilmSimulation.FILM_SIMULATION_ACROS_G:
315                 value = "ACROS_G";
316                 break;
317             case IFujiXFilmSimulation.FILM_SIMULATION_ETERNA:
318                 value = "ETERNA";
319                 break;
320             case IFujiXFilmSimulation.FILM_SIMULATION_CLASSIC_NEGATIVE:
321                 value = "CLASSIC NEGATIVE";
322                 break;
323             default:
324                 value = "??? " + current;
325                 break;
326         }
327         logcat(" FILM SIMULATION : " + value);
328     }
329
330     private void updateImageAspect(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
331     {
332         String value;
333         switch (current)
334         {
335             case IFujiXImageAspectMode.IMAGE_ASPECT_S_3x2:
336               value = "S:3x2";
337               break;
338             case IFujiXImageAspectMode.IMAGE_ASPECT_S_16x9:
339               value = "S:16x9";
340               break;
341             case IFujiXImageAspectMode.IMAGE_ASPECT_S_1x1:
342               value = "S:1x1";
343               break;
344             case IFujiXImageAspectMode.IMAGE_ASPECT_M_3x2:
345                 value = "M:3x2";
346                 break;
347             case IFujiXImageAspectMode.IMAGE_ASPECT_M_16x9:
348                 value = "M:16x9";
349                 break;
350             case IFujiXImageAspectMode.IMAGE_ASPECT_M_1x1:
351                 value = "M:1x1";
352                 break;
353             case IFujiXImageAspectMode.IMAGE_ASPECT_L_3x2:
354                 value = "L:3x2";
355                 break;
356             case IFujiXImageAspectMode.IMAGE_ASPECT_L_16x9:
357                 value = "L:16x9";
358                 break;
359             case IFujiXImageAspectMode.IMAGE_ASPECT_L_1x1:
360                 value = "L:1x1";
361                 break;
362             default:
363                 value = "? " + current;
364                 break;
365         }
366         logcat("  Image Aspect : " + value);
367     }
368
369
370     private void updateFSSControl(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
371     {
372         String value;
373         switch (current)
374         {
375             case IFujiXFSSControl.F_SS_CTRL_BOTH:
376                 value = "BOTH";
377                 break;
378             case IFujiXFSSControl.F_SS_CTRL_F:
379                 value = "F";
380                 break;
381             case IFujiXFSSControl.F_SS_CTRL_SS:
382                 value = "SS";
383                 break;
384             case IFujiXFSSControl.F_SS_CTRL_NONE:
385                 value = "NONE";
386                 break;
387             default:
388                 value = "? " + current;
389                 break;
390         }
391         logcat(" F_SS : " + value);
392     }
393
394     private void updateUnknownValue(int id, int previous, int current)
395     {
396         logcat(String.format(Locale.US,"<< UPDATE UNKNOWN STATUS >> id: 0x%04x 0x%08x(%d) -> 0x%08x(%d)", id, previous, previous, current, current));
397     }
398
399     private void updateFocusPoint(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
400     {
401         logcat(String.format(Locale.ENGLISH, " Focus Point : %x ", current));
402     }
403
404     private void updateMovieRemainTime(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
405     {
406         logcat(" MOVIE REMAIN : " + current);
407     }
408
409     private void updateSdCardRemainSize(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
410     {
411         logcat(" SDCARD REMAIN : " + current);
412     }
413
414     private void updateSelfTimer(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
415     {
416         int value = -1;
417         try
418         {
419             switch (current)
420             {
421                 case IFujiXTimerMode.TIMER_OFF:
422                     value = 0;
423                     break;
424
425                 case IFujiXTimerMode.TIMER_1SEC:
426                     value = 1;
427                     break;
428
429                 case IFujiXTimerMode.TIMER_2SEC:
430                     value = 2;
431                     break;
432
433                 case IFujiXTimerMode.TIMER_5SEC:
434                     value = 5;
435                     break;
436
437                 case IFujiXTimerMode.TIMER_10SEC:
438                     value = 10;
439                     break;
440
441                 default:
442                     break;
443             }
444         }
445         catch (Exception e)
446         {
447             e.printStackTrace();
448         }
449         if (value <= 0)
450         {
451             logcat(" SELF TIMER IS OFF (" + value + ")");
452         }
453         else
454         {
455             logcat(" SELF TIMER IS " + value + " sec.");
456         }
457     }
458
459     private void updateDeviceError(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
460     {
461         if (current != 0)
462         {
463             notifier.updateWarning("ERROR " + current);
464         }
465     }
466
467     private void updateIsoSensitivity(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
468     {
469         String iso = "";
470         try
471         {
472             iso = "" + (0x0000ffff & current);
473         }
474         catch (Exception e)
475         {
476             e.printStackTrace();
477         }
478         notifier.updateIsoSensitivity(iso);
479     }
480
481     private void updateExposureCompensation(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
482     {
483         String exposureCompensation = "";
484         try
485         {
486             float value = ((float) current / 1000.0f);
487             exposureCompensation = String.format(Locale.ENGLISH, "%+1.1f", value);
488         }
489         catch (Exception e)
490         {
491             e.printStackTrace();
492         }
493         notifier.updatedExposureCompensation(exposureCompensation);
494     }
495
496     private void updateWhiteBalance(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
497     {
498         String value = "";
499         try
500         {
501             switch (current)
502             {
503                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_AUTO:
504                     value = "Auto";
505                     break;
506                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_FINE:
507                     value = "Fine";
508                     break;
509                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_INCANDESCENT:
510                     value = "Incandescent";
511                     break;
512                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_FLUORESCENT_1:
513                     value = "Fluorescent 1";
514                     break;
515                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_FLUORESCENT_2:
516                     value = "Fluorescent 2";
517                     break;
518                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_FLUORESCENT_3:
519                     value = "Fluorescent 3";
520                     break;
521                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_SHADE:
522                     value = "Shade";
523                     break;
524                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_UNDERWATER:
525                     value = "Underwater";
526                     break;
527                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_TEMPERATURE:
528                     value = "Kelvin";
529                     break;
530                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_CUSTOM:
531                     value = "Custom";
532                     break;
533                 default:
534                     value = "Unknown";
535                     break;
536             }
537         }
538         catch (Exception e)
539         {
540             e.printStackTrace();
541         }
542         notifier.updatedWBMode(value);
543     }
544
545     private void updateShutterSpeed(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
546     {
547         String shutterSpeed = "--";
548         try
549         {
550             if ((0x80000000 & current) != 0)
551             {
552                 int value = 0x0fffffff & current;
553                 shutterSpeed = ("1/" + (value / 1000));
554             }
555             else
556             {
557                 shutterSpeed = (current + "");
558             }
559         }
560         catch (Exception e)
561         {
562             e.printStackTrace();
563         }
564         notifier.updatedShutterSpeed(shutterSpeed);
565     }
566
567     private void updateAperture(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
568     {
569         String aperature = "---";
570         try
571         {
572             float value = ((float) current / 100.0f);
573             aperature = String.format(Locale.ENGLISH, "%1.1f", value);
574         }
575         catch (Exception e)
576         {
577             e.printStackTrace();
578         }
579         notifier.updatedAperture(aperature);
580     }
581
582     private void updateFocusMode(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
583     {
584         String mode = "";
585
586         // Focus Mode
587         if (current == IFujiXFocusingMode.FOCUS_MANUAL)
588         {
589             mode = "MF";
590         }
591         else if (current == IFujiXFocusingMode.FOCUS_CONTINUOUS_AUTO)
592         {
593             mode = "AF-C";
594         }
595         else if (current == IFujiXFocusingMode.FOCUS_SINGLE_AUTO)
596         {
597             mode = "AF-S";
598         }
599         else
600         {
601             mode = mode + current;
602         }
603         logcat("  Focus Mode : " + mode);
604     }
605
606     private void updateFocusedStatus(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
607     {
608         if (current == 1)
609         {
610             // focus Lock
611             notifier.updateFocusedStatus(true, true);
612         }
613         else
614         {
615             // focus unlock
616             notifier.updateFocusedStatus(false, false);
617         }
618     }
619
620     private void updatedTakeMode(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
621     {
622         String mode = "";
623         switch (current)
624         {
625             case IFujiXShootingMode.SHOOTING_MANUAL:
626                 mode = "M";
627                 break;
628             case IFujiXShootingMode.SHOOTING_PROGRAM:
629                 mode = "P";
630                 break;
631             case IFujiXShootingMode.SHOOTING_APERTURE:
632                 mode = "A";
633                 break;
634             case IFujiXShootingMode.SHOOTING_SHUTTER:
635                 mode = "S";
636                 break;
637             case IFujiXShootingMode.SHOOTING_CUSTOM:
638                 mode = "C";
639                 break;
640             case IFujiXShootingMode.SHOOTING_AUTO:
641                 mode = "a";
642                 break;
643             default:
644                 mode = mode + current;
645                 break;
646         }
647         notifier.updatedTakeMode(mode);
648     }
649
650     private void updateBatteryLevel(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
651     {
652         int level;
653         if ((current == IFujiXBatteryMode.BATTERY_CRITICAL) || (current == IFujiXBatteryMode.BATTERY_126S_CRITICAL))
654         {
655             level = 0;
656         }
657         else if (current == IFujiXBatteryMode.BATTERY_126S_ONE_BAR)
658         {
659             level = 20;
660         }
661         else if ((current == IFujiXBatteryMode.BATTERY_ONE_BAR) || (current == IFujiXBatteryMode.BATTERY_126S_TWO_BAR))
662         {
663             level = 40;
664         }
665         else if (current == IFujiXBatteryMode.BATTERY_126S_THREE_BAR)
666         {
667             level = 60;
668         }
669         else if ((current == IFujiXBatteryMode.BATTERY_TWO_BAR) || (current == IFujiXBatteryMode.BATTERY_126S_FOUR_BAR))
670         {
671             level = 80;
672         }
673         else // if ((current == IFujiXBatteryMode.BATTERY_FULL) || (current == IFujiXBatteryMode.BATTERY_126S_FULL))
674         {
675             level = 100;
676         }
677         notifier.updateRemainBattery(level);
678     }
679
680
681     /**
682      *   認識したカメラのステータス名称のリストを応答する
683      *
684      */
685     private List<String> getAvailableStatusNameList()
686     {
687         ArrayList<String> selection = new ArrayList<>();
688         try
689         {
690             for (int index = 0; index < statusHolder.size(); index++)
691             {
692                 int key = statusHolder.keyAt(index);
693                 selection.add(statusNameArray.get(key, String.format(Locale.US, "0x%04x", key)));
694             }
695         }
696         catch (Exception e)
697         {
698             e.printStackTrace();
699         }
700         return (selection);
701
702     }
703
704     List<String> getAvailableItemList(String listKey)
705     {
706         if ((listKey == null)||(listKey.isEmpty()))
707         {
708             // アイテム名の一覧を応答する
709             return (getAvailableStatusNameList());
710         }
711
712         /////  選択可能なステータスの一覧を取得する : でも以下はアイテム名の一覧... /////
713         ArrayList<String> selection = new ArrayList<>();
714         try
715         {
716             for (int index = 0; index < statusHolder.size(); index++)
717             {
718                 int key = statusHolder.keyAt(index);
719                 selection.add(statusNameArray.get(key));
720             }
721         }
722         catch (Exception e)
723         {
724             e.printStackTrace();
725         }
726         return (selection);
727     }
728
729     String getItemStatus(String key)
730     {
731         try
732         {
733             int strIndex = key.indexOf("x");
734             Log.v(TAG, "getItemStatus() : " + key + " [" + strIndex + "]");
735             if (strIndex >= 1)
736             {
737                 key = key.substring(strIndex + 1);
738                 try
739                 {
740                     int id = Integer.parseInt(key, 16);
741                     int value = statusHolder.get(id);
742                     logcat("getItemStatus() value : " + value + " key : " + key + " [" + id + "]");
743                     // dumpStatus();
744                     return (value + "");
745                 }
746                 catch (Exception e)
747                 {
748                     e.printStackTrace();
749                 }
750             }
751
752             for (int index = 0; index < statusNameArray.size(); index++)
753             {
754                 int id = statusNameArray.keyAt(index);
755                 String strKey = statusNameArray.valueAt(index);
756                 if (key.contentEquals(strKey))
757                 {
758                     int value = statusHolder.get(id);
759                     return (value + "");
760                 }
761             }
762         }
763         catch (Exception e)
764         {
765             e.printStackTrace();
766         }
767         return ("? [" + key + "]");
768     }
769
770     private void dumpStatus()
771     {
772         try
773         {
774             Log.v(TAG, " - - - status - - - ");
775             for (int index = 0; index < statusHolder.size(); index++)
776             {
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));
780             }
781             Log.v(TAG, " - - - status - - - ");
782         }
783         catch (Exception e)
784         {
785             e.printStackTrace();
786         }
787     }
788
789     private void logcat(String message)
790     {
791         if (logcat)
792         {
793             Log.v(TAG, message);
794         }
795     }
796 }