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