1 package jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.status
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
11 class CameraStatusConvert(private val statusHolder: CameraStatusHolder, remote: IPanasonicCamera) : ICameraStatus, ICameraEventObserver
14 private val statusListHolder = CameraStatusListHolder(remote)
15 private var eventData: ByteArray? = null
16 private var currentBattery : Int = 0
18 override fun getStatusList(key: String): List<String>
22 return statusListHolder.getAvailableItemList(key)
31 override fun setStatus(key: String, value: String)
35 statusListHolder.setStatus(key, value)
42 override fun getStatus(key: String): String
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()
60 override fun getStatusColor(key: String): Int
63 ICameraStatus.BATTERY -> getRemainBatteryColor()
68 private fun getTakeMode() : String
74 val index = 16 * 6 + 12
75 if ((eventData != null)&&((eventData?.size ?: 0) > (index + 3)))
77 val value = (eventData?.get(index) ?: 0).toInt()
78 val value2 = (eventData?.get(index + 3) ?: 0).toInt()
79 takeMode = when (value)
112 else -> "$value($value2)"
116 catch (e : Exception)
124 private fun getShutterSpeed() : String
128 val index = 16 * 5 + 4
129 if ((eventData != null)&&((eventData?.size ?: 0) > (index + 1)))
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 }
135 // シャッタースピード : ベタで応答する...
136 return (when (value3) {
199 else -> getShutterSpeedAlternate(value, value2) // 別のロジックで決定する
203 catch (e : Exception)
211 private fun getShutterSpeedAlternate(value : Int, value2 : Int) : String
213 // シャッタースピード (別の計算方法...)
222 return if (value2 > 0) { ("1.3") } else { ("1.6") }
224 if ((value == 0x40)&&(value2 == 0))
232 return (String.format("%2.0f", 2.0.pow(value)))
234 val value3 = if (value2 > 0)
236 2.0.pow(value) + ((2.0.pow(value + 1) - 2.0.pow(value)) / 3.0f)
238 2.0.pow(value) + (((2.0.pow(value + 1) - 2.0.pow(value)) * 2.0f) / 3.0f)
240 return if (value3 < 5.0f) { (String.format("%2.1f", value3)) } else { (String.format("%2.0f", value3)) }
244 val value3 = value * (-1)
247 return (String.format("%2.0fs", 2.0.pow(value3)))
249 val value4 = if (value2 < 0) {
250 2.0.pow(value3) - (2.0.pow(value3) - 2.0.pow(value3 - 1)) / 3.0f * 2.0f
252 2.0.pow(value3) - (2.0.pow(value3) - 2.0.pow(value3 - 1)) / 3.0f
254 return if (value4 < 5.0f) { (String.format("%2.1fs", value4)) } else { (String.format("%2.0fs", value4)) }
257 catch (e : Exception)
261 return (" $value:$value2 ")
264 private fun getAperture() : String
270 val index = 16 * 4 + 8
271 if ((eventData != null)&&((eventData?.size ?: 0) > (index + 1)))
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 }
277 //return (getApertureAlternate(value, value2))
278 aperture = when (value3) {
321 else -> getApertureAlternate(value, value2)
325 catch (e : Exception)
332 private fun getApertureAlternate(value : Int, value2 : Int) : String
336 // val value3 = if (value2 < 0) { value2 * (-1) } else { value2 }
338 catch (e : Exception)
342 return ("F($value:$value2)")
345 private fun getExpRev() : String
351 val index = 16 * 6 + 4
352 if ((eventData != null)&&((eventData?.size ?: 0) > (index)))
354 val value = (eventData?.get(index) ?: 0).toInt()
357 val rev = if (value < 128) {
358 (value / 3).toFloat() + ((value % 3).toFloat() * 0.33f)
360 val invValue = 256 - value
361 ((invValue / 3) + ((invValue % 3).toFloat() * 0.33f)) * (-1.0f)
363 expRev = String.format("%1.1f", rev)
367 catch (e : Exception)
374 private fun getCaptureMode() : String
380 val index = 16 * 7 - 1
381 if ((eventData != null)&&((eventData?.size ?: 0) > (index)))
383 val value = (eventData?.get(index) ?: 0).toInt()
386 photoStyle = when (value) {
415 catch (e : Exception)
422 private fun getIsoSensitivity() : String
428 val index = 16 * 8 + 15
429 if ((eventData != null)&&((eventData?.size ?: 0) > (index)))
431 val value = (eventData?.get(index) ?: 0).toInt()
461 else -> "ISO:($value)"
465 catch (e : Exception)
472 private fun getWhiteBalance() : String
478 val index = 16 * 9 + 0
479 if ((eventData != null)&&((eventData?.size ?: 0) > (index)))
481 val value = (eventData?.get(index) ?: 0).toInt()
505 catch (e : Exception)
512 private fun getMeteringMode() : String
517 private fun getPictureEffect() : String
520 var pictureEffect = ""
523 val index = 16 * 10 + 10
524 if ((eventData != null)&&((eventData?.size ?: 0) > (index)))
526 val value = (eventData?.get(index) ?: 0).toInt()
529 pictureEffect = when (value) {
557 catch (e : Exception)
561 return (pictureEffect)
564 private fun getTorchMode() : String
567 var bracketStatus = ""
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)))
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 "
583 if (focusBracketValue != 0) {
584 bracketStatus += "FOCUS BKT "
586 if (focalBracketValue != 0) {
587 bracketStatus += "FOCAL BKT "
589 if (exposureBracketValue != 0) {
590 bracketStatus += "EXP BKT "
594 catch (e : Exception)
598 return (bracketStatus)
601 private fun getRemainBattery() : String
605 currentBattery = statusHolder.getCurrentStatus(ICameraStatus.BATTERY).toInt()
606 return ("Batt.:$currentBattery%")
615 private fun getRemainBatteryColor() : Int
617 var color = Color.WHITE
620 if (currentBattery < 30)
624 else if (currentBattery < 50)
629 catch (e : Exception)
636 override fun receivedEvent(eventData: ByteArray?)
640 this.eventData = eventData
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))
656 private val TAG = CameraStatusConvert::class.java.simpleName
657 private const val isDumpData = false