OSDN Git Service

Panasonic機の機種拡大で一部変更。
[gokigen/mangle.git] / app / src / main / java / jp / osdn / gokigen / gokigenassets / camera / vendor / panasonic / status / CameraStatusConvert.kt
1 package jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.status
2
3 import android.graphics.Color
4 import android.util.Log
5 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraStatus
6 import jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.IPanasonicCamera
7 import jp.osdn.gokigen.gokigenassets.utils.communication.SimpleLogDumper
8 import java.util.ArrayList
9 import kotlin.math.pow
10
11 class CameraStatusConvert(private val statusHolder: CameraStatusHolder, remote: IPanasonicCamera) : ICameraStatus, ICameraEventObserver
12 {
13     //  現物合わせのクラス...
14     private val statusListHolder = CameraStatusListHolder(remote)
15     private var eventData: ByteArray? = null
16     private var currentBattery : Int = 0
17
18     override fun getStatusList(key: String): List<String>
19     {
20         try
21         {
22             return statusListHolder.getAvailableItemList(key)
23         }
24         catch (e: Exception)
25         {
26             e.printStackTrace()
27         }
28         return ArrayList()
29     }
30
31     override fun setStatus(key: String, value: String)
32     {
33         try
34         {
35             statusListHolder.setStatus(key, value)
36         }
37         catch (e : Exception)
38         {
39             e.printStackTrace()
40         }
41     }
42     override fun getStatus(key: String): String
43     {
44         return (when (key) {
45             ICameraStatus.TAKE_MODE -> getTakeMode()
46             ICameraStatus.SHUTTER_SPEED -> getShutterSpeed()
47             ICameraStatus.APERTURE -> getAperture()
48             ICameraStatus.EXPREV -> getExpRev()
49             ICameraStatus.CAPTURE_MODE -> getCaptureMode()
50             ICameraStatus.ISO_SENSITIVITY -> getIsoSensitivity()
51             ICameraStatus.WHITE_BALANCE -> getWhiteBalance()
52             ICameraStatus.AE -> getMeteringMode()
53             ICameraStatus.EFFECT -> getPictureEffect()
54             ICameraStatus.BATTERY -> getRemainBattery()
55             ICameraStatus.TORCH_MODE -> getTorchMode()
56             else -> ""
57         })
58     }
59
60     override fun getStatusColor(key: String): Int
61     {
62         return (when (key) {
63             ICameraStatus.BATTERY -> getRemainBatteryColor()
64             else -> Color.WHITE
65         })
66     }
67
68     private fun getTakeMode() : String
69     {
70         // 撮影モード
71         var takeMode = ""
72         try
73         {
74             val index = 16 * 6 + 12
75             if ((eventData != null)&&((eventData?.size ?: 0) > (index + 3)))
76             {
77                 val value = (eventData?.get(index) ?: 0).toInt()
78                 val value2 = (eventData?.get(index + 3) ?: 0).toInt()
79                 takeMode = when (value)
80                 {
81                     1 -> "P"
82                     2 -> "A"
83                     3 -> "S"
84                     4 -> "M"
85                     9 -> "iA"
86                     86 -> "Panorama"
87                     29 -> "SOFT"
88                     27 -> "DIOR"
89                     103 -> "BLEA"
90                     104 -> "TOYP"
91                     28 -> "TOY"
92                     32 -> "XPRO"
93                     26 -> "HDYN"
94                     31 -> "IART"
95                     110 -> "S.MONO"
96                     111 -> "R.MONO"
97                     112 -> "D.MONO"
98                     30 -> "D.MONO"
99                     114 -> "MONO"
100                     25 -> "SEPI"
101                     24 -> "LKEY"
102                     23 -> "HKEY"
103                     101 -> "OLD"
104                     22 -> "RETR"
105                     21 -> "POP"
106                     102 -> "SUN"
107                     33 -> "1CLR"
108                     34 -> "STAR"
109                     105 -> "FAN"
110                     60 -> "Movie"
111                     0 -> "iA"
112                     else -> "$value($value2)"
113                 }
114             }
115         }
116         catch (e : Exception)
117         {
118             e.printStackTrace()
119         }
120         return (takeMode)
121     }
122
123
124     private fun getShutterSpeed() : String
125     {
126         try
127         {
128             val index = 16 * 5 + 4
129             if ((eventData != null)&&((eventData?.size ?: 0) > (index + 1)))
130             {
131                 val value = (eventData?.get(index) ?: 0).toInt()
132                 val value2 = (eventData?.get(index + 1) ?: 0).toInt()
133                 val value3 = value * 10 + if (value2 > 0) { 3 } else if (value2 == 0) { 0 } else { 6 }
134
135                 // シャッタースピード : ベタで応答する...
136                 return (when (value3) {
137                     0 -> "1s"
138                     3 -> "1.3"
139                     6 -> "1.6"
140                     10 -> "2"
141                     13 -> "2.5"
142                     16 -> "3.2"
143                     20 -> "4"
144                     23 -> "5"
145                     26 -> "6"
146                     30 -> "8"
147                     33 -> "10"
148                     36 -> "13"
149                     40 -> "15"
150                     43 -> "20"
151                     46 -> "25"
152                     50 -> "30"
153                     53 -> "40"
154                     56 -> "50"
155                     60 -> "60"
156                     63 -> "80"
157                     66 -> "100"
158                     70 -> "125"
159                     73 -> "160"
160                     76 -> "200"
161                     80 -> "250"
162                     83 -> "320"
163                     86 -> "400"
164                     90 -> "500"
165                     93 -> "640"
166                     96 -> "800"
167                     100 -> "1000"
168                     103 -> "1300"
169                     106 -> "1600"
170                     110 -> "2000"
171                     113 -> "2500"
172                     116 -> "3200"
173                     120 -> "4000"
174                     123 -> "5000"
175                     126 -> "6400"
176                     130 -> "8000"
177                     133 -> "10000"
178                     136 -> "13000"
179                     140 -> "16000"
180                     640 -> "T"
181                     -4 -> "1.3s"
182                     -7 -> "1.6s"
183                     -10 -> "2s"
184                     -14 -> "2.5s"
185                     -17 -> "3.2s"
186                     -20 -> "4s"
187                     -24 -> "5s"
188                     -27 -> "6s"
189                     -30 -> "8s"
190                     -34 -> "10s"
191                     -37 -> "13s"
192                     -40 -> "15s"
193                     -44 -> "20s"
194                     -47 -> "25s"
195                     -50 -> "30s"
196                     -54 -> "40s"
197                     -57 -> "50s"
198                     -60 -> "60s"
199                     else -> getShutterSpeedAlternate(value, value2) // 別のロジックで決定する
200                 })
201             }
202         }
203         catch (e : Exception)
204         {
205             e.printStackTrace()
206         }
207         return ("")
208     }
209
210
211     private fun getShutterSpeedAlternate(value : Int, value2 : Int) : String
212     {
213         // シャッタースピード (別の計算方法...)
214         try
215         {
216             if (value == 0)
217             {
218                 if (value2 == 0)
219                 {
220                     return ("1s")
221                 }
222                 return if (value2 > 0) { ("1.3") } else { ("1.6") }
223             }
224             if ((value == 0x40)&&(value2 == 0))
225             {
226                 return ("T")
227             }
228             if (value > 0)
229             {
230                 if (value2 == 0)
231                 {
232                     return (String.format("%2.0f", 2.0.pow(value)))
233                 }
234                 val value3 =  if (value2 > 0)
235                 {
236                     2.0.pow(value) + ((2.0.pow(value + 1) - 2.0.pow(value)) / 3.0f)
237                 } else {
238                     2.0.pow(value) + (((2.0.pow(value + 1) - 2.0.pow(value)) * 2.0f) / 3.0f)
239                 }
240                 return if (value3 < 5.0f) { (String.format("%2.1f", value3)) } else { (String.format("%2.0f", value3)) }
241             }
242             else
243             {
244                 val value3 = value * (-1)
245                 if (value2 == 0)
246                 {
247                     return (String.format("%2.0fs", 2.0.pow(value3)))
248                 }
249                 val value4 = if (value2 < 0) {
250                     2.0.pow(value3) - (2.0.pow(value3) - 2.0.pow(value3 - 1)) / 3.0f * 2.0f
251                 } else {
252                     2.0.pow(value3) - (2.0.pow(value3) - 2.0.pow(value3 - 1)) / 3.0f
253                 }
254                 return if (value4 < 5.0f) { (String.format("%2.1fs", value4)) } else { (String.format("%2.0fs", value4)) }
255             }
256         }
257         catch (e : Exception)
258         {
259             e.printStackTrace()
260         }
261         return (" $value:$value2 ")
262     }
263
264     private fun getAperture() : String
265     {
266         // 絞り値
267         var aperture = ""
268         try
269         {
270             val index = 16 * 4 + 8
271             if ((eventData != null)&&((eventData?.size ?: 0) > (index + 1)))
272             {
273                 val value = (eventData?.get(index) ?: 0).toInt()
274                 val value2 = (eventData?.get(index + 1) ?: 0).toInt()
275                 val value3 = value * 10 + if (value2 > 0) { 3 } else if (value2 == 0) { 0 } else if (value2 < -100) { 5 }  else { 6 }
276
277                 //return (getApertureAlternate(value, value2))
278                 aperture = when (value3) {
279                     0 -> "F0.9"
280                     3 -> "F1.0"
281                     6 -> "F1.1"
282                     10 -> "F1.2"
283                     13 -> "F1.4"
284                     15 -> "F1.7"
285                     16 -> "F1.8"
286                     20 -> "F2.0"
287                     23 -> "F2.2"
288                     25 -> "F2.4"
289                     26 -> "F2.5"
290                     30 -> "F2.8"
291                     33 -> "F3.2"
292                     36 -> "F3.5"
293                     40 -> "F4.0"
294                     43 -> "F4.5"
295                     46 -> "F5.0"
296                     50 -> "F5.6"
297                     53 -> "F6.3"
298                     56 -> "F7.1"
299                     60 -> "F8.0"
300                     63 -> "F9.0"
301                     66 -> "F10"
302                     70 -> "F11"
303                     73 -> "F13"
304                     76 -> "F14"
305                     80 -> "F16"
306                     83 -> "F18"
307                     86 -> "F20"
308                     90 -> "F22"
309                     93 -> "F25"
310                     96 -> "F29"
311                     100 -> "F32"
312                     103 -> "F36"
313                     106 -> "F40"
314                     110 -> "F45"
315                     113 -> "F51"
316                     116 -> "F57"
317                     120 -> "F64"
318                     123 -> "F72"
319                     126 -> "F81"
320                     130 -> "F91"
321                     else -> getApertureAlternate(value, value2)
322                 }
323             }
324         }
325         catch (e : Exception)
326         {
327             e.printStackTrace()
328         }
329         return (aperture)
330     }
331
332     private fun getApertureAlternate(value : Int, value2 : Int) : String
333     {
334         try
335         {
336             // val value3 = if (value2 < 0) { value2 * (-1) } else { value2 }
337         }
338         catch (e : Exception)
339         {
340             e.printStackTrace()
341         }
342         return ("F($value:$value2)")
343     }
344
345     private fun getExpRev() : String
346     {
347         // 露出補正値
348         var expRev = ""
349         try
350         {
351             val index = 16 * 6 + 4
352             if ((eventData != null)&&((eventData?.size ?: 0) > (index)))
353             {
354                 val value = (eventData?.get(index) ?: 0).toInt()
355                 if (value != 0)
356                 {
357                     val rev = if (value < 128) {
358                         (value / 3).toFloat() + ((value % 3).toFloat() * 0.33f)
359                     } else {
360                         val invValue = 256 - value
361                         ((invValue / 3) + ((invValue % 3).toFloat() * 0.33f)) * (-1.0f)
362                     }
363                     expRev = String.format("%1.1f", rev)
364                 }
365             }
366         }
367         catch (e : Exception)
368         {
369             e.printStackTrace()
370         }
371         return (expRev)
372     }
373
374     private fun getCaptureMode() : String
375     {
376         // フォトスタイル設定
377         var photoStyle = ""
378         try
379         {
380             val index = 16 * 7 - 1
381             if ((eventData != null)&&((eventData?.size ?: 0) > (index)))
382             {
383                 val value = (eventData?.get(index) ?: 0).toInt()
384                 if (value != 0)
385                 {
386                     photoStyle = when (value) {
387                         1 -> "STANDARD"
388                         2 -> "VIVID"
389                         3 -> "NATURAL"
390                         4 -> "MONO"
391                         5 -> "SCENERY"
392                         6 -> "PORTRAIT"
393                         7 -> "CUSTOM"
394                         9 -> "CINELIKE D"
395                         10 -> "CINELIKE V"
396                         12 -> "L.MONO"
397                         13 -> "709L"
398                         14 -> "CUSTOM1"
399                         15 -> "CUSTOM2"
400                         16 -> "CUSTOM3"
401                         17 -> "CUSTOM4"
402                         19 -> "L.MONO D"
403                         20 -> "FLAT"
404                         21 -> "MY1"
405                         22 -> "MY2"
406                         23 -> "MY3"
407                         24 -> "MY4"
408                         37 -> "L.CLAS N"
409                         38 -> "L.MONO S"
410                         else -> "($value)"
411                     }
412                 }
413             }
414         }
415         catch (e : Exception)
416         {
417             e.printStackTrace()
418         }
419         return (photoStyle)
420     }
421
422     private fun getIsoSensitivity() : String
423     {
424         // ISO感度
425         var iso = ""
426         try
427         {
428             val index = 16 * 8 + 15
429             if ((eventData != null)&&((eventData?.size ?: 0) > (index)))
430             {
431                 val value = (eventData?.get(index) ?: 0).toInt()
432                 iso = when (value) {
433                     0 -> "ISO:auto"
434                     1 -> "ISO:100"
435                     35 -> "iso:100"
436                     2 -> "ISO:125"
437                     3 -> "ISO:160"
438                     4 -> "ISO:200"
439                     5 -> "ISO:250"
440                     6 -> "ISO:320"
441                     7 -> "ISO:400"
442                     8 -> "ISO:500"
443                     9 -> "ISO:640"
444                     10 -> "ISO:800"
445                     11 -> "ISO:1000"
446                     12 -> "ISO:1250"
447                     13 -> "ISO:1600"
448                     14 -> "ISO:2000"
449                     15 -> "ISO:2500"
450                     16 -> "ISO:3200"
451                     17 -> "ISO:4000"
452                     18 -> "ISO:5000"
453                     19 -> "ISO:6400"
454                     20 -> "ISO:8000"
455                     22 -> "ISO:10000"
456                     24 -> "ISO:12800"
457                     32 -> "ISO:16000"
458                     33 -> "ISO:20000"
459                     34 -> "ISO:25600"
460                     29 -> "ISO-i"
461                     else -> "ISO:($value)"
462                 }
463             }
464         }
465         catch (e : Exception)
466         {
467             e.printStackTrace()
468         }
469         return (iso)
470     }
471
472     private fun getWhiteBalance() : String
473     {
474         // ホワイトバランス
475         var wb = ""
476         try
477         {
478             val index = 16 * 9 + 0
479             if ((eventData != null)&&((eventData?.size ?: 0) > (index)))
480             {
481                 val value = (eventData?.get(index) ?: 0).toInt()
482                 wb = when (value) {
483                     0 -> "AWB"
484                     1 -> "Bracket"
485                     2 -> "Daylight"
486                     3 -> "Cloudy"
487                     4 -> "Shade"
488                     5 -> "Incandescent"
489                     6 -> "Flash"
490                     7 -> "Custom1"
491                     8 -> "Custom2"
492                     9 -> "Custom3"
493                     10 -> "Custom4"
494                     11 -> "Color Temp."
495                     14 -> "K1"
496                     15 -> "K2"
497                     16 -> "K3"
498                     17 -> "K4"
499                     18 -> "AWBc"
500                     20 -> "AWBw"
501                     else -> "($value)"
502                 }
503             }
504         }
505         catch (e : Exception)
506         {
507             e.printStackTrace()
508         }
509         return (wb)
510     }
511
512     private fun getMeteringMode() : String
513     {
514         return ("")
515     }
516
517     private fun getPictureEffect() : String
518     {
519         // フィルター設定
520         var pictureEffect = ""
521         try
522         {
523             val index = 16 * 10 + 10
524             if ((eventData != null)&&((eventData?.size ?: 0) > (index)))
525             {
526                 val value = (eventData?.get(index) ?: 0).toInt()
527                 if (value != 0)
528                 {
529                     pictureEffect = when (value) {
530                         1 -> "POP"
531                         2 -> "RETR"
532                         15 -> "OLD"
533                         3 -> "HKEY"
534                         4 -> "LKEY"
535                         5 -> "SEPI"
536                         22 -> "MONO"
537                         10 -> "D.MONO"
538                         21 -> "R.MONO"
539                         20 -> "S.MONO"
540                         11 -> "IART"
541                         6 -> "HDYN"
542                         12 -> "XPRO"
543                         8 -> "TOY"
544                         18 -> "TOYP"
545                         17 -> "BLEA"
546                         7 -> "DIOR"
547                         9 -> "SOFT"
548                         19 -> "FAN"
549                         14 -> "STAR"
550                         13 -> "1CLR"
551                         16 -> "SUN"
552                         else -> "($value)"
553                     }
554                 }
555             }
556         }
557         catch (e : Exception)
558         {
559             e.printStackTrace()
560         }
561         return (pictureEffect)
562     }
563
564     private fun getTorchMode() : String
565     {
566         // ブラケット状態を示す
567         var bracketStatus = ""
568         try
569         {
570             val wbBracketIndex = 16 * 9 +1
571             val focusBracketIndex = 16 * 11 + 3
572             val focalBracketIndex = 16 * 11 + 4
573             val exposureBracketIndex = 16 * 11 + 5
574             if ((eventData != null)&&((eventData?.size ?: 0) > (exposureBracketIndex)))
575             {
576                 val wbBracketValue = (eventData?.get(wbBracketIndex) ?: 0).toInt()
577                 val focusBracketValue = (eventData?.get(focusBracketIndex) ?: 0).toInt()
578                 val focalBracketValue = (eventData?.get(focalBracketIndex) ?: 0).toInt()
579                 val exposureBracketValue = (eventData?.get(exposureBracketIndex) ?: 0).toInt()
580                 if (wbBracketValue != 0) {
581                     bracketStatus += "WB BKT "
582                 }
583                 if (focusBracketValue != 0) {
584                     bracketStatus += "FOCUS BKT "
585                 }
586                 if (focalBracketValue != 0) {
587                     bracketStatus += "FOCAL BKT "
588                 }
589                 if (exposureBracketValue != 0) {
590                     bracketStatus += "EXP BKT "
591                 }
592             }
593         }
594         catch (e : Exception)
595         {
596             e.printStackTrace()
597         }
598         return (bracketStatus)
599     }
600
601     private fun getRemainBattery() : String
602     {
603         try
604         {
605             currentBattery = statusHolder.getCurrentStatus(ICameraStatus.BATTERY).toInt()
606             return ("Batt.:$currentBattery%")
607         }
608         catch (e: Exception)
609         {
610             e.printStackTrace()
611         }
612         return ("")
613     }
614
615     private fun getRemainBatteryColor() : Int
616     {
617         var color = Color.WHITE
618         try
619         {
620             if (currentBattery < 30)
621             {
622                 color = Color.RED
623             }
624             else if (currentBattery < 50)
625             {
626                 color = Color.YELLOW
627             }
628         }
629         catch (e : Exception)
630         {
631             e.printStackTrace()
632         }
633         return (color)
634     }
635
636     override fun receivedEvent(eventData: ByteArray?)
637     {
638         try
639         {
640             this.eventData = eventData
641             if (isDumpData)
642             {
643                 val size = this.eventData?.size ?: 0
644                 Log.v(TAG, "  ----- RECEIVED STATUS $size bytes. ----- ")
645                 SimpleLogDumper.dumpBytes("LV DATA [$size]", this.eventData?.copyOfRange(0, size))
646             }
647         }
648         catch (e: Exception)
649         {
650             e.printStackTrace()
651         }
652     }
653
654     companion object
655     {
656         private val TAG = CameraStatusConvert::class.java.simpleName
657         private const val isDumpData = false
658     }
659 }