OSDN Git Service

シャッターや絞り、露出補正を変更できるようにした。
[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 import androidx.fragment.app.FragmentActivity;
10
11 import net.osdn.gokigen.gr2control.R;
12 import net.osdn.gokigen.gr2control.camera.ICameraStatus;
13 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.FujiXReplyMessageReceiver;
14 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.IFujiXCommandPublisher;
15 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.command.messages.SetPropertyValue;
16 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXBatteryMode;
17 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXCameraProperties;
18 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXFSSControl;
19 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXFilmSimulation;
20 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXFlashMode;
21 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXFocusingMode;
22 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXImageAspectMode;
23 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXImageFormatMode;
24 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXShootingMode;
25 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXTimerMode;
26 import net.osdn.gokigen.gr2control.camera.fuji_x.wrapper.values.IFujiXWhiteBalanceMode;
27 import net.osdn.gokigen.gr2control.liveview.ICameraStatusUpdateNotify;
28
29 import java.util.ArrayList;
30 import java.util.List;
31 import java.util.Locale;
32
33 class FujiXStatusHolder
34 {
35     private final String TAG = toString();
36     private final FragmentActivity activity;
37     private final IFujiXCommandPublisher publisher;
38     private static final boolean logcat = true;
39     private SparseIntArray statusHolder;
40     private SparseArrayCompat<String> statusNameArray;
41
42     FujiXStatusHolder(@NonNull FragmentActivity activity, @NonNull IFujiXCommandPublisher publisher)
43     {
44         statusHolder = new SparseIntArray();
45         statusHolder.clear();
46
47         this.activity = activity;
48         this.publisher = publisher;
49         statusNameArray = new SparseArrayCompat<>();
50         prepareStatusNameArray();
51     }
52
53     private void prepareStatusNameArray()
54     {
55         statusNameArray.clear();
56         statusNameArray.append(IFujiXCameraProperties.BATTERY_LEVEL, IFujiXCameraProperties.BATTERY_LEVEL_STR);
57         statusNameArray.append(IFujiXCameraProperties.WHITE_BALANCE, IFujiXCameraProperties.WHITE_BALANCE_STR);
58         statusNameArray.append(IFujiXCameraProperties.APERTURE, IFujiXCameraProperties.APERTURE_STR);
59         statusNameArray.append(IFujiXCameraProperties.FOCUS_MODE, IFujiXCameraProperties.FOCUS_MODE_STR);
60         statusNameArray.append(IFujiXCameraProperties.SHOOTING_MODE, IFujiXCameraProperties.SHOOTING_MODE_STR);
61         statusNameArray.append(IFujiXCameraProperties.FLASH, IFujiXCameraProperties.FLASH_STR);
62         statusNameArray.append(IFujiXCameraProperties.EXPOSURE_COMPENSATION, IFujiXCameraProperties.EXPOSURE_COMPENSATION_STR);
63         statusNameArray.append(IFujiXCameraProperties.SELF_TIMER, IFujiXCameraProperties.SELF_TIMER_STR);
64         statusNameArray.append(IFujiXCameraProperties.FILM_SIMULATION, IFujiXCameraProperties.FILM_SIMULATION_STR);
65         statusNameArray.append(IFujiXCameraProperties.IMAGE_FORMAT, IFujiXCameraProperties.IMAGE_FORMAT_STR);
66         statusNameArray.append(IFujiXCameraProperties.RECMODE_ENABLE, IFujiXCameraProperties.RECMODE_ENABLE_STR);
67         statusNameArray.append(IFujiXCameraProperties.F_SS_CONTROL, IFujiXCameraProperties.F_SS_CONTROL_STR);
68         statusNameArray.append(IFujiXCameraProperties.ISO, IFujiXCameraProperties.ISO_STR);
69         statusNameArray.append(IFujiXCameraProperties.MOVIE_ISO, IFujiXCameraProperties.MOVIE_ISO_STR);
70         statusNameArray.append(IFujiXCameraProperties.FOCUS_POINT, IFujiXCameraProperties.FOCUS_POINT_STR);
71         statusNameArray.append(IFujiXCameraProperties.DEVICE_ERROR, IFujiXCameraProperties.DEVICE_ERROR_STR);
72         statusNameArray.append(IFujiXCameraProperties.IMAGE_FILE_COUNT, IFujiXCameraProperties.IMAGE_FILE_COUNT_STR);
73         statusNameArray.append(IFujiXCameraProperties.SDCARD_REMAIN_SIZE, IFujiXCameraProperties.SDCARD_REMAIN_SIZE_STR);
74         statusNameArray.append(IFujiXCameraProperties.FOCUS_LOCK, IFujiXCameraProperties.FOCUS_LOCK_STR);
75         statusNameArray.append(IFujiXCameraProperties.MOVIE_REMAINING_TIME, IFujiXCameraProperties.MOVIE_REMAINING_TIME_STR);
76         statusNameArray.append(IFujiXCameraProperties.SHUTTER_SPEED, IFujiXCameraProperties.SHUTTER_SPEED_STR);
77         statusNameArray.append(IFujiXCameraProperties.IMAGE_ASPECT, IFujiXCameraProperties.IMAGE_ASPECT_STR);
78         statusNameArray.append(IFujiXCameraProperties.BATTERY_LEVEL_2, IFujiXCameraProperties.BATTERY_LEVEL_2_STR);
79         statusNameArray.append(IFujiXCameraProperties.UNKNOWN_DF00, IFujiXCameraProperties.UNKNOWN_DF00_STR);
80         statusNameArray.append(IFujiXCameraProperties.PICTURE_JPEG_COUNT, IFujiXCameraProperties.PICTURE_JPEG_COUNT_STR);
81         statusNameArray.append(IFujiXCameraProperties.UNKNOWN_D400, IFujiXCameraProperties.UNKNOWN_D400_STR);
82         statusNameArray.append(IFujiXCameraProperties.UNKNOWN_D401, IFujiXCameraProperties.UNKNOWN_D401_STR);
83         statusNameArray.append(IFujiXCameraProperties.UNKNOWN_D52F, IFujiXCameraProperties.UNKNOWN_D52F_STR);
84         statusNameArray.append(IFujiXCameraProperties.UNKNOWN_D245, IFujiXCameraProperties.UNKNOWN_D245_STR);
85         statusNameArray.append(IFujiXCameraProperties.UNKNOWN_DF41, IFujiXCameraProperties.UNKNOWN_DF41_STR);
86         statusNameArray.append(IFujiXCameraProperties.UNKNOWN_DF26, IFujiXCameraProperties.UNKNOWN_DF26_STR);
87         statusNameArray.append(IFujiXCameraProperties.UNKNOWN_DF27, IFujiXCameraProperties.UNKNOWN_DF27_STR);
88     }
89
90     void updateValue(@Nullable ICameraStatusUpdateNotify notifier, int id, byte data0, byte data1, byte data2, byte data3)
91     {
92         try
93         {
94             int value = ((((int) data3) & 0xff) << 24) + ((((int) data2) & 0xff) << 16) + ((((int) data1) & 0xff) << 8) + (((int) data0) & 0xff);
95             int currentValue = statusHolder.get(id, -1);
96             //logcat(String.format(Locale.US, " STATUS [id: 0x%04x] 0x%08x(%d) -> 0x%08x(%d)", id, currentValue, currentValue, value, value));
97             if ((notifier != null) && (currentValue != value))
98             {
99                 statusHolder.put(id, value);
100                 //logcat(String.format(Locale.US," STATUS UPDATE [id: 0x%04x] 0x%08x(%d) -> 0x%08x(%d)", id, currentValue, currentValue, value, value));
101                 updateDetected(notifier, id, currentValue, value);
102             }
103         }
104         catch (Exception e)
105         {
106             e.printStackTrace();
107         }
108     }
109
110     private void updateDetected(@NonNull ICameraStatusUpdateNotify notifier, int id, int previous, int current)
111     {
112         try
113         {
114             //String idName = statusNameArray.get(id, "Unknown");
115             //logcat(String.format(Locale.US, " << UPDATE STATUS >> id: 0x%04x[%s] 0x%08x(%d) -> 0x%08x(%d)", id, idName, previous, previous, current, current));
116             switch (id)
117             {
118                 case IFujiXCameraProperties.FOCUS_LOCK:
119                     updateFocusedStatus(notifier, previous, current);
120                     break;
121                 case IFujiXCameraProperties.SHOOTING_MODE:
122                     updatedTakeMode(notifier, previous, current);
123                     break;
124                 case IFujiXCameraProperties.BATTERY_LEVEL:
125                 case IFujiXCameraProperties.BATTERY_LEVEL_2:
126                     updateBatteryLevel(notifier, previous, current);
127                     break;
128                 case IFujiXCameraProperties.FOCUS_MODE:
129                     updateFocusMode(notifier, previous, current);
130                     break;
131                 case IFujiXCameraProperties.APERTURE:
132                     updateAperture(notifier, previous, current);
133                     break;
134                 case IFujiXCameraProperties.SHUTTER_SPEED:
135                     updateShutterSpeed(notifier, previous, current);
136                     break;
137                 case IFujiXCameraProperties.WHITE_BALANCE:
138                     updateWhiteBalance(notifier, previous, current);
139                     break;
140                 case IFujiXCameraProperties.EXPOSURE_COMPENSATION:
141                     updateExposureCompensation(notifier, previous, current);
142                     break;
143                 case IFujiXCameraProperties.ISO:
144                     updateIsoSensitivity(notifier, previous, current);
145                     break;
146                 case IFujiXCameraProperties.DEVICE_ERROR:
147                     updateDeviceError(notifier, previous, current);
148                     break;
149                 case IFujiXCameraProperties.SELF_TIMER:
150                     updateSelfTimer(notifier, previous, current);
151                     break;
152                 case IFujiXCameraProperties.SDCARD_REMAIN_SIZE:
153                     updateSdCardRemainSize(notifier, previous, current);
154                     break;
155                 case IFujiXCameraProperties.MOVIE_REMAINING_TIME:
156                     updateMovieRemainTime(notifier, previous, current);
157                     break;
158                 case IFujiXCameraProperties.FOCUS_POINT:
159                     updateFocusPoint(notifier, previous, current);
160                     break;
161                 case IFujiXCameraProperties.F_SS_CONTROL:
162                     updateFSSControl(notifier, previous, current);
163                     break;
164                 case IFujiXCameraProperties.IMAGE_ASPECT:
165                     updateImageAspect(notifier, previous, current);
166                     break;
167                 case IFujiXCameraProperties.FILM_SIMULATION:
168                     updateFilmSimulation(notifier, previous, current);
169                     break;
170                 case IFujiXCameraProperties.FLASH:
171                     updateFlashMode(notifier, previous, current);
172                     break;
173                 case IFujiXCameraProperties.IMAGE_FORMAT:
174                     updateImageFormat(notifier, previous, current);
175                     break;
176                 case IFujiXCameraProperties.UNKNOWN_D245:
177                 case IFujiXCameraProperties.UNKNOWN_DF41:
178                 case IFujiXCameraProperties.UNKNOWN_DF26:
179                 case IFujiXCameraProperties.UNKNOWN_DF27:
180                 default:
181                     updateUnknownValue(id, previous, current);
182                     break;
183             }
184         }
185         catch (Exception e)
186         {
187             e.printStackTrace();
188         }
189     }
190
191     private void updateImageFormat(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
192     {
193         String value;
194         switch (current)
195         {
196             case IFujiXImageFormatMode.IMAGE_FORMAT_RAW:
197                 value = "RAW";
198                 break;
199             case IFujiXImageFormatMode.IMAGE_FORMAT_FINE:
200                 value = "FINE";
201                 break;
202             case IFujiXImageFormatMode.IMAGE_FORMAT_NORMAL:
203                 value = "NORMAL";
204                 break;
205             case IFujiXImageFormatMode.IMAGE_FORMAT_FINE_RAW:
206                 value = "RAW+F";
207                 break;
208             case IFujiXImageFormatMode.IMAGE_FORMAT_NORMAL_RAW:
209                 value = "RAW+N";
210                 break;
211             default:
212                 value = "UNKNOWN : " + current;
213                 break;
214         }
215         logcat(" Image Format : " + value);
216     }
217
218     private void updateFlashMode(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
219     {
220         String value;
221         switch (current)
222         {
223             case IFujiXFlashMode.FLASH_AUTO:
224                 value = "AUTO";
225                 break;
226             case IFujiXFlashMode.FLASH_OFF:
227                 value = "OFF";
228                 break;
229             case IFujiXFlashMode.FLASH_FILL:
230                 value = "FILL";
231                 break;
232             case IFujiXFlashMode.FLASH_REDEYE_AUTO:
233                 value = "REDEYE_AUTO";
234                 break;
235             case IFujiXFlashMode.FLASH_REDEYE_FILL:
236                 value = "REDEYE_FILL";
237                 break;
238             case IFujiXFlashMode.FLASH_EXTERNAL_SYNC:
239                 value = "EXTERNAL_SYNC";
240                 break;
241             case IFujiXFlashMode.FLASH_ON:
242                 value = "ON";
243                 break;
244             case IFujiXFlashMode.FLASH_REDEYE:
245                 value = "REDEYE";
246                 break;
247             case IFujiXFlashMode.FLASH_REDEYE_ON:
248                 value = "REDEYE_ON";
249                 break;
250             case IFujiXFlashMode.FLASH_REDEYE_SYNC:
251                 value = "REDEYE_SYNC";
252                 break;
253             case IFujiXFlashMode.FLASH_REDEYE_REAR:
254                 value = "REDEYE_REAR";
255                 break;
256             case IFujiXFlashMode.FLASH_SLOW_SYNC:
257                 value = "SLOW_SYNC";
258                 break;
259             case IFujiXFlashMode.FLASH_REAR_SYNC:
260                 value = "REAR_SYNC";
261                 break;
262             case IFujiXFlashMode.FLASH_COMMANDER:
263                 value = "COMMANDER";
264                 break;
265             case IFujiXFlashMode.FLASH_DISABLE:
266                 value = "DISABLE";
267                 break;
268             case IFujiXFlashMode.FLASH_ENABLE:
269                 value = "ENABLE";
270                 break;
271             default:
272                 value = " UNKNOWN : " + current;
273                 break;
274         }
275         logcat(" FLASH MODE : " + value);
276     }
277
278     private void updateFilmSimulation(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
279     {
280         String value;
281         switch (current)
282         {
283             case IFujiXFilmSimulation.FILM_SIMULATION_PROVIA:
284                 value = "PROVIA";
285                 break;
286             case IFujiXFilmSimulation.FILM_SIMULATION_VELVIA:
287                 value = "VELVIA";
288                 break;
289             case IFujiXFilmSimulation.FILM_SIMULATION_ASTIA:
290                 value = "ASTIA";
291                 break;
292             case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME:
293                 value = "MONO";
294                 break;
295             case IFujiXFilmSimulation.FILM_SIMULATION_SEPIA:
296                 value = "SEPIA";
297                 break;
298             case IFujiXFilmSimulation.FILM_SIMULATION_PRO_NEG_HI:
299                 value = "NEG_HI";
300                 break;
301             case IFujiXFilmSimulation.FILM_SIMULATION_PRO_NEG_STD:
302                 value = "NEG_STD";
303                 break;
304             case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_Y_FILTER:
305                 value = "MONO_Y";
306                 break;
307             case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_R_FILTER:
308                 value = "MONO_R";
309                 break;
310             case IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_G_FILTER:
311                 value = "MONO_G";
312                 break;
313             case IFujiXFilmSimulation.FILM_SIMULATION_CLASSIC_CHROME:
314                 value = "CLASSIC CHROME";
315                 break;
316             case IFujiXFilmSimulation.FILM_SIMULATION_ACROS:
317                 value = "ACROS";
318                 break;
319             case IFujiXFilmSimulation.FILM_SIMULATION_ACROS_Y:
320                 value = "ACROS_Y";
321                 break;
322             case IFujiXFilmSimulation.FILM_SIMULATION_ACROS_R:
323                 value = "ACROS_R";
324                 break;
325             case IFujiXFilmSimulation.FILM_SIMULATION_ACROS_G:
326                 value = "ACROS_G";
327                 break;
328             case IFujiXFilmSimulation.FILM_SIMULATION_ETERNA:
329                 value = "ETERNA";
330                 break;
331             case IFujiXFilmSimulation.FILM_SIMULATION_CLASSIC_NEGATIVE:
332                 value = "CLASSIC NEGATIVE";
333                 break;
334             default:
335                 value = "??? " + current;
336                 break;
337         }
338         logcat(" FILM SIMULATION : " + value);
339     }
340
341     private void updateImageAspect(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
342     {
343         String value;
344         switch (current)
345         {
346             case IFujiXImageAspectMode.IMAGE_ASPECT_S_3x2:
347               value = "S:3x2";
348               break;
349             case IFujiXImageAspectMode.IMAGE_ASPECT_S_16x9:
350               value = "S:16x9";
351               break;
352             case IFujiXImageAspectMode.IMAGE_ASPECT_S_1x1:
353               value = "S:1x1";
354               break;
355             case IFujiXImageAspectMode.IMAGE_ASPECT_M_3x2:
356                 value = "M:3x2";
357                 break;
358             case IFujiXImageAspectMode.IMAGE_ASPECT_M_16x9:
359                 value = "M:16x9";
360                 break;
361             case IFujiXImageAspectMode.IMAGE_ASPECT_M_1x1:
362                 value = "M:1x1";
363                 break;
364             case IFujiXImageAspectMode.IMAGE_ASPECT_L_3x2:
365                 value = "L:3x2";
366                 break;
367             case IFujiXImageAspectMode.IMAGE_ASPECT_L_16x9:
368                 value = "L:16x9";
369                 break;
370             case IFujiXImageAspectMode.IMAGE_ASPECT_L_1x1:
371                 value = "L:1x1";
372                 break;
373             default:
374                 value = "? " + current;
375                 break;
376         }
377         logcat("  Image Aspect : " + value);
378     }
379
380
381     private void updateFSSControl(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
382     {
383         String value;
384         switch (current)
385         {
386             case IFujiXFSSControl.F_SS_CTRL_BOTH:
387                 value = "BOTH";
388                 break;
389             case IFujiXFSSControl.F_SS_CTRL_F:
390                 value = "F";
391                 break;
392             case IFujiXFSSControl.F_SS_CTRL_SS:
393                 value = "SS";
394                 break;
395             case IFujiXFSSControl.F_SS_CTRL_NONE:
396                 value = "NONE";
397                 break;
398             default:
399                 value = "? " + current;
400                 break;
401         }
402         logcat(" F_SS : " + value);
403     }
404
405     private void updateUnknownValue(int id, int previous, int current)
406     {
407         logcat(String.format(Locale.US,"<< UPDATE UNKNOWN STATUS >> id: 0x%04x 0x%08x(%d) -> 0x%08x(%d)", id, previous, previous, current, current));
408     }
409
410     private void updateFocusPoint(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
411     {
412         logcat(String.format(Locale.ENGLISH, " Focus Point : %x ", current));
413     }
414
415     private void updateMovieRemainTime(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
416     {
417         logcat(" MOVIE REMAIN : " + current);
418     }
419
420     private void updateSdCardRemainSize(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
421     {
422         logcat(" SDCARD REMAIN : " + current);
423     }
424
425     private void updateSelfTimer(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
426     {
427         int value = -1;
428         try
429         {
430             switch (current)
431             {
432                 case IFujiXTimerMode.TIMER_OFF:
433                     value = 0;
434                     break;
435
436                 case IFujiXTimerMode.TIMER_1SEC:
437                     value = 1;
438                     break;
439
440                 case IFujiXTimerMode.TIMER_2SEC:
441                     value = 2;
442                     break;
443
444                 case IFujiXTimerMode.TIMER_5SEC:
445                     value = 5;
446                     break;
447
448                 case IFujiXTimerMode.TIMER_10SEC:
449                     value = 10;
450                     break;
451
452                 default:
453                     break;
454             }
455         }
456         catch (Exception e)
457         {
458             e.printStackTrace();
459         }
460         if (value <= 0)
461         {
462             logcat(" SELF TIMER IS OFF (" + value + ")");
463         }
464         else
465         {
466             logcat(" SELF TIMER IS " + value + " sec.");
467         }
468     }
469
470     private void updateDeviceError(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
471     {
472         if (current != 0)
473         {
474             notifier.updateWarning("ERROR " + current);
475         }
476     }
477
478     private void updateIsoSensitivity(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
479     {
480         String iso = "";
481         try
482         {
483             iso = "" + (0x0000ffff & current);
484         }
485         catch (Exception e)
486         {
487             e.printStackTrace();
488         }
489         notifier.updateIsoSensitivity(iso);
490     }
491
492     private void updateExposureCompensation(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
493     {
494         String exposureCompensation = "";
495         try
496         {
497             float value = ((float) current / 1000.0f);
498             exposureCompensation = String.format(Locale.ENGLISH, "%+1.1f", value);
499         }
500         catch (Exception e)
501         {
502             e.printStackTrace();
503         }
504         notifier.updatedExposureCompensation(exposureCompensation);
505     }
506
507     private void updateWhiteBalance(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
508     {
509         String value = "";
510         try
511         {
512             switch (current)
513             {
514                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_AUTO:
515                     value = "Auto";
516                     break;
517                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_FINE:
518                     value = "Fine";
519                     break;
520                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_INCANDESCENT:
521                     value = "Incandescent";
522                     break;
523                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_FLUORESCENT_1:
524                     value = "Fluorescent 1";
525                     break;
526                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_FLUORESCENT_2:
527                     value = "Fluorescent 2";
528                     break;
529                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_FLUORESCENT_3:
530                     value = "Fluorescent 3";
531                     break;
532                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_SHADE:
533                     value = "Shade";
534                     break;
535                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_UNDERWATER:
536                     value = "Underwater";
537                     break;
538                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_TEMPERATURE:
539                     value = "Kelvin";
540                     break;
541                 case IFujiXWhiteBalanceMode.WHITE_BALANCE_CUSTOM:
542                     value = "Custom";
543                     break;
544                 default:
545                     value = "Unknown";
546                     break;
547             }
548         }
549         catch (Exception e)
550         {
551             e.printStackTrace();
552         }
553         notifier.updatedWBMode(value);
554     }
555
556     private void updateShutterSpeed(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
557     {
558         String shutterSpeed = "--";
559         try
560         {
561             if ((0x80000000 & current) != 0)
562             {
563                 int value = 0x0fffffff & current;
564                 shutterSpeed = ("1/" + (value / 1000));
565             }
566             else
567             {
568                 shutterSpeed = (current + "");
569             }
570         }
571         catch (Exception e)
572         {
573             e.printStackTrace();
574         }
575         notifier.updatedShutterSpeed(shutterSpeed);
576     }
577
578     private void updateAperture(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
579     {
580         String aperature = "---";
581         try
582         {
583             float value = ((float) current / 100.0f);
584             aperature = String.format(Locale.ENGLISH, "%1.1f", value);
585         }
586         catch (Exception e)
587         {
588             e.printStackTrace();
589         }
590         notifier.updatedAperture(aperature);
591     }
592
593     private void updateFocusMode(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
594     {
595         String mode = "";
596
597         // Focus Mode
598         if (current == IFujiXFocusingMode.FOCUS_MANUAL)
599         {
600             mode = "MF";
601         }
602         else if (current == IFujiXFocusingMode.FOCUS_CONTINUOUS_AUTO)
603         {
604             mode = "AF-C";
605         }
606         else if (current == IFujiXFocusingMode.FOCUS_SINGLE_AUTO)
607         {
608             mode = "AF-S";
609         }
610         else
611         {
612             mode = mode + current;
613         }
614         logcat("  Focus Mode : " + mode);
615     }
616
617     private void updateFocusedStatus(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
618     {
619         if (current == 1)
620         {
621             // focus Lock
622             notifier.updateFocusedStatus(true, true);
623         }
624         else
625         {
626             // focus unlock
627             notifier.updateFocusedStatus(false, false);
628         }
629     }
630
631     private void updatedTakeMode(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
632     {
633         String mode = "";
634         switch (current)
635         {
636             case IFujiXShootingMode.SHOOTING_MANUAL:
637                 mode = "M";
638                 break;
639             case IFujiXShootingMode.SHOOTING_PROGRAM:
640                 mode = "P";
641                 break;
642             case IFujiXShootingMode.SHOOTING_APERTURE:
643                 mode = "A";
644                 break;
645             case IFujiXShootingMode.SHOOTING_SHUTTER:
646                 mode = "S";
647                 break;
648             case IFujiXShootingMode.SHOOTING_CUSTOM:
649                 mode = "C";
650                 break;
651             case IFujiXShootingMode.SHOOTING_AUTO:
652                 mode = "a";
653                 break;
654             default:
655                 mode = mode + current;
656                 break;
657         }
658         notifier.updatedTakeMode(mode);
659     }
660
661     private void updateBatteryLevel(@NonNull ICameraStatusUpdateNotify notifier, int previous, int current)
662     {
663         int level;
664         if ((current == IFujiXBatteryMode.BATTERY_CRITICAL) || (current == IFujiXBatteryMode.BATTERY_126S_CRITICAL))
665         {
666             level = 0;
667         }
668         else if (current == IFujiXBatteryMode.BATTERY_126S_ONE_BAR)
669         {
670             level = 20;
671         }
672         else if ((current == IFujiXBatteryMode.BATTERY_ONE_BAR) || (current == IFujiXBatteryMode.BATTERY_126S_TWO_BAR))
673         {
674             level = 40;
675         }
676         else if (current == IFujiXBatteryMode.BATTERY_126S_THREE_BAR)
677         {
678             level = 60;
679         }
680         else if ((current == IFujiXBatteryMode.BATTERY_TWO_BAR) || (current == IFujiXBatteryMode.BATTERY_126S_FOUR_BAR))
681         {
682             level = 80;
683         }
684         else // if ((current == IFujiXBatteryMode.BATTERY_FULL) || (current == IFujiXBatteryMode.BATTERY_126S_FULL))
685         {
686             level = 100;
687         }
688         notifier.updateRemainBattery(level);
689     }
690
691
692     /**
693      *   認識したカメラのステータス名称のリストを応答する
694      *
695      */
696     private List<String> getAvailableStatusNameList()
697     {
698         ArrayList<String> selection = new ArrayList<>();
699         try
700         {
701             for (int index = 0; index < statusHolder.size(); index++)
702             {
703                 int key = statusHolder.keyAt(index);
704                 selection.add(statusNameArray.get(key, String.format(Locale.US, "0x%04x", key)));
705             }
706         }
707         catch (Exception e)
708         {
709             e.printStackTrace();
710         }
711         return (selection);
712
713     }
714
715     List<String> getAvailableItemList(String listKey)
716     {
717         if ((listKey == null)||(listKey.isEmpty()))
718         {
719             // アイテム名の一覧を応答する
720             return (getAvailableStatusNameList());
721         }
722         if (listKey.matches(ICameraStatus.EFFECT))
723         {
724             return (getAvailableEffectItemList());
725         }
726         if (listKey.matches(ICameraStatus.AE))
727         {
728             return (new ArrayList<>());
729         }
730         if (listKey.matches(ICameraStatus.WHITE_BALANCE))
731         {
732             return (getAvailableWhiteBalanceItemList());
733         }
734         if (listKey.matches(ICameraStatus.ISO_SENSITIVITY))
735         {
736             return (getAvailableIsoSensitivityItemList());
737         }
738
739
740         /////  選択可能なステータスの一覧を取得する : でも以下はアイテム名の一覧... /////
741         /*
742         ArrayList<String> selection = new ArrayList<>();
743         try
744         {
745             for (int index = 0; index < statusHolder.size(); index++)
746             {
747                 int key = statusHolder.keyAt(index);
748                 selection.add(statusNameArray.get(key));
749             }
750         }
751         catch (Exception e)
752         {
753             e.printStackTrace();
754         }
755         */
756         return (new ArrayList<>());
757     }
758
759     private List<String> getAvailableEffectItemList()
760     {
761         // EFFECTの選択肢をリストにして返す  : Film Simulation にした。
762         ArrayList<String> selection = new ArrayList<>();
763         selection.add(IFujiXFilmSimulation.FILM_SIMULATION_PROVIA_STR);
764         selection.add(IFujiXFilmSimulation.FILM_SIMULATION_VELVIA_STR);
765         selection.add(IFujiXFilmSimulation.FILM_SIMULATION_ASTIA_STR);
766         selection.add(IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_STR);
767         selection.add(IFujiXFilmSimulation.FILM_SIMULATION_SEPIA_STR);
768         selection.add(IFujiXFilmSimulation.FILM_SIMULATION_PRO_NEG_HI_STR);
769         selection.add(IFujiXFilmSimulation.FILM_SIMULATION_PRO_NEG_STD_STR);
770         selection.add(IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_Y_FILTER_STR);
771         selection.add(IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_R_FILTER_STR);
772         selection.add(IFujiXFilmSimulation.FILM_SIMULATION_MONOCHROME_G_FILTER_STR);
773         selection.add(IFujiXFilmSimulation.FILM_SIMULATION_CLASSIC_CHROME_STR);
774         selection.add(IFujiXFilmSimulation.FILM_SIMULATION_ACROS_STR);
775         selection.add(IFujiXFilmSimulation.FILM_SIMULATION_ACROS_Y_STR);
776         selection.add(IFujiXFilmSimulation.FILM_SIMULATION_ACROS_R_STR);
777         selection.add(IFujiXFilmSimulation.FILM_SIMULATION_ACROS_G_STR);
778         selection.add(IFujiXFilmSimulation.FILM_SIMULATION_ETERNA_STR);
779         selection.add(IFujiXFilmSimulation.FILM_SIMULATION_CLASSIC_NEGATIVE_STR);
780         return(selection);
781     }
782
783     private List<String> getAvailableWhiteBalanceItemList()
784     {
785         // WHITE BALANCEの選択肢をリストにして返す
786         ArrayList<String> selection = new ArrayList<>();
787
788         String[] items = activity.getResources().getStringArray(R.array.fuji_x_white_balance);
789         for (String item : items)
790         {
791             selection.add(item);
792         }
793         return (selection);
794     }
795
796     private List<String> getAvailableIsoSensitivityItemList()
797     {
798         // ISO感度設定の選択肢をリストにして返す
799         ArrayList<String> selection = new ArrayList<>();
800         return (selection);
801     }
802
803
804     private String getCurrentEffectStatus()
805     {
806         // EFFECTの現在状態を応答する : FILM Simulationにした
807         try
808         {
809             int value = statusHolder.get(IFujiXCameraProperties.FILM_SIMULATION);
810             List<String> itemList = getAvailableEffectItemList();
811             if ((value >= IFujiXFilmSimulation.FILM_SIMULATION_MIN)&&(value < itemList.size()))
812             {
813                 return (itemList.get(value - 1));
814             }
815         }
816         catch (Exception e)
817         {
818             e.printStackTrace();
819         }
820         return ("");
821     }
822
823     private String getCurrentWhiteBalanceStatus()
824     {
825         // White Balanceの現在状態を取得する
826         try
827         {
828             int value = statusHolder.get(IFujiXCameraProperties.WHITE_BALANCE);
829             String[] items = activity.getResources().getStringArray(R.array.fuji_x_white_balance);
830             String[] itemValues = activity.getResources().getStringArray(R.array.fuji_x_white_balance_value);
831             int index = 0;
832             for (String itemValue : itemValues)
833             {
834                 int itemValueInt = Integer.parseInt(itemValue);
835                 if (itemValueInt == value)
836                 {
837                     return (items[index]);
838                 }
839                 index++;
840             }
841         }
842         catch (Exception e)
843         {
844             e.printStackTrace();
845         }
846         return ("");
847     }
848
849     private String getCurrentIsoSensitivityStatus()
850     {
851         // ISO感度設定の現在状態を取得する
852         String isoValue = "";
853         try
854         {
855             int value = statusHolder.get(IFujiXCameraProperties.ISO);
856             int iso = ((0x0000ffff & value));
857             int auto = ((0xffff0000 & value));
858             if (auto != 0)
859             {
860                 isoValue = "A (" + iso + ")";
861             }
862             else
863             {
864                 isoValue = "" + iso;
865             }
866         }
867         catch (Exception e)
868         {
869             e.printStackTrace();
870         }
871         return (isoValue);
872     }
873
874     private void setEffectItem(String value)
875     {
876         try
877         {
878             int index = 1;
879             List<String> itemList = getAvailableEffectItemList();
880             for (String item : itemList)
881             {
882                 if (item.matches(value))
883                 {
884                     //  見つかった! この値に設定する
885                     publisher.enqueueCommand(new SetPropertyValue(new FujiXReplyMessageReceiver(" Set Film Simulation", true), IFujiXCameraProperties.FILM_SIMULATION, 4, index));
886                     return;
887                 }
888                 index++;
889             }
890         }
891         catch (Exception e)
892         {
893             e.printStackTrace();
894         }
895     }
896
897     private void setCurrentWhiteBalanceStatus(String value)
898     {
899         try
900         {
901             String[] items = activity.getResources().getStringArray(R.array.fuji_x_white_balance);
902             String[] itemValues = activity.getResources().getStringArray(R.array.fuji_x_white_balance_value);
903             int index = 0;
904             for (String item : items)
905             {
906                 if (item.matches(value))
907                 {
908                     // 見つかった! この値を設定する
909                     String itemValue = itemValues[index];
910                     int itemValueInt = Integer.parseInt(itemValue);
911                     publisher.enqueueCommand(new SetPropertyValue(new FujiXReplyMessageReceiver(" Set White Balance", true), IFujiXCameraProperties.WHITE_BALANCE, 4, itemValueInt));
912                     return;
913                 }
914                 index++;
915             }
916         }
917         catch (Exception e)
918         {
919             e.printStackTrace();
920         }
921     }
922
923     private void setCurrentIsoSensitivityStatus(String value)
924     {
925         // ISO感度を設定する
926
927
928     }
929
930     String getItemStatus(String key)
931     {
932         if (key.matches(ICameraStatus.EFFECT))
933         {
934             return (getCurrentEffectStatus());
935         }
936         if (key.matches(ICameraStatus.WHITE_BALANCE))
937         {
938             return (getCurrentWhiteBalanceStatus());
939         }
940         if (key.matches(ICameraStatus.ISO_SENSITIVITY))
941         {
942             return (getCurrentIsoSensitivityStatus());
943         }
944         if (key.matches(ICameraStatus.TAKE_MODE))
945         {
946             return ("");
947         }
948         try
949         {
950             int strIndex = key.indexOf("x");
951             Log.v(TAG, "getItemStatus() : " + key + " [" + strIndex + "]");
952             if (strIndex >= 1)
953             {
954                 key = key.substring(strIndex + 1);
955                 try
956                 {
957                     int id = Integer.parseInt(key, 16);
958                     int value = statusHolder.get(id);
959                     logcat("getItemStatus() value : " + value + " key : " + key + " [" + id + "]");
960                     // dumpStatus();
961                     return (value + "");
962                 }
963                 catch (Exception e)
964                 {
965                     e.printStackTrace();
966                 }
967             }
968
969             for (int index = 0; index < statusNameArray.size(); index++)
970             {
971                 int id = statusNameArray.keyAt(index);
972                 String strKey = statusNameArray.valueAt(index);
973                 if (key.contentEquals(strKey))
974                 {
975                     int value = statusHolder.get(id);
976                     return (value + "");
977                 }
978             }
979         }
980         catch (Exception e)
981         {
982             e.printStackTrace();
983         }
984         return ("? [" + key + "]");
985     }
986
987     void setItemStatus(@NonNull String key, @NonNull String value)
988     {
989         try
990         {
991             if (logcat)
992             {
993                 Log.v(TAG, "setStatus(" + key + ", " + value + ")");
994             }
995             if (key.matches(ICameraStatus.EFFECT))
996             {
997                 setEffectItem(value);
998                 return;
999             }
1000             if (key.matches(ICameraStatus.WHITE_BALANCE))
1001             {
1002                 setCurrentWhiteBalanceStatus(value);
1003                 return;
1004             }
1005             if (key.matches(ICameraStatus.ISO_SENSITIVITY))
1006             {
1007                 setCurrentIsoSensitivityStatus(value);
1008                 // return;
1009             }
1010
1011             // ここで設定を行う。
1012         }
1013         catch (Exception e)
1014         {
1015             e.printStackTrace();
1016         }
1017     }
1018
1019
1020     private void dumpStatus()
1021     {
1022         try
1023         {
1024             Log.v(TAG, " - - - status - - - ");
1025             for (int index = 0; index < statusHolder.size(); index++)
1026             {
1027                 int key = statusHolder.keyAt(index);
1028                 int value = statusHolder.get(key);
1029                 Log.v(TAG, String.format("id : 0x%x value : %d (0x%x) ", key, value, value));
1030             }
1031             Log.v(TAG, " - - - status - - - ");
1032         }
1033         catch (Exception e)
1034         {
1035             e.printStackTrace();
1036         }
1037     }
1038
1039     private void logcat(String message)
1040     {
1041         if (logcat)
1042         {
1043             Log.v(TAG, message);
1044         }
1045     }
1046 }