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