1 package jp.osdn.gokigen.gokigenassets.camera.panasonic.status
3 import android.content.Context
4 import android.util.Log
5 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraStatus
6 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICardSlotSelectionReceiver
7 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICardSlotSelector
8 import jp.osdn.gokigen.gokigenassets.camera.panasonic.ICameraChangeListener
9 import jp.osdn.gokigen.gokigenassets.camera.panasonic.IPanasonicCamera
10 import jp.osdn.gokigen.gokigenassets.utils.communication.SimpleHttpClient
11 import java.util.ArrayList
13 class CameraStatusHolder(private val context: Context, private val remote: IPanasonicCamera, private val cardSlotSelector: ICardSlotSelector) : ICardSlotSelectionReceiver, ICameraStatusHolder
15 private var listener: ICameraChangeListener? = null
16 private var currentSd = "sd1"
17 private var isInitialized = false
18 private var isDualSlot = false
19 private var remainBattery : Int = 0
21 fun parse(reply: String)
25 parseReceivedStatus(reply)
26 var isEnableDualSlot = false
27 if (reply.contains("<sd_memory>set</sd_memory>") && reply.contains("<sd2_memory>set</sd2_memory>")) {
29 isEnableDualSlot = true
31 if (!isInitialized || isDualSlot != isEnableDualSlot)
37 cardSlotSelector.setupSlotSelector(true, this)
41 // カードが1つしか刺さっていない場合...
42 cardSlotSelector.setupSlotSelector(false, null)
45 isDualSlot = isEnableDualSlot
47 checkCurrentSlot(reply)
55 private fun checkCurrentSlot(reply: String)
59 val header = "<current_sd>"
60 val indexStart = reply.indexOf(header)
61 val indexEnd = reply.indexOf("</current_sd>")
62 if (indexStart > 0 && indexEnd > 0 && indexStart < indexEnd)
64 val currentSlot = reply.substring(indexStart + header.length, indexEnd)
65 if (currentSd != currentSlot)
67 currentSd = currentSlot
68 cardSlotSelector.changedCardSlot(currentSd)
78 fun setEventChangeListener(listener: ICameraChangeListener)
80 this.listener = listener
83 fun clearEventChangeListener()
88 override fun getCameraStatus(): String? {
92 override fun getLiveviewStatus(): Boolean {
96 override fun getShootMode(): String?
101 override fun getAvailableShootModes(): List<String?>? {
105 override fun getZoomPosition(): Int {
109 override fun getStorageId(): String {
113 override fun slotSelected(slotId: String)
115 Log.v(TAG, " slotSelected : $slotId")
116 if (currentSd != slotId)
119 requestToChangeSlot(slotId)
126 fun getAvailableItemList(key: String): List<String>
128 val itemList: MutableList<String> = ArrayList()
132 val array = latestResultObject!!.getJSONArray(key) ?: return itemList
133 val nofItems = array.length()
134 for (index in 0 until nofItems) {
136 itemList.add(array.getString(index))
137 } catch (e: Exception) {
150 fun getItemStatus(key: String): String
155 return latestResultObject!!.getString(key)
165 private fun requestToChangeSlot(slotId: String)
169 val thread = Thread {
173 val http = SimpleHttpClient()
176 val reply: String = http.httpGet(remote.getCmdUrl() + "cam.cgi?mode=setsetting&type=current_sd&value=" + slotId, TIMEOUT_MS)
177 if (reply.indexOf("<result>ok</result>") > 0)
180 cardSlotSelector.selectSlot(slotId)
184 Thread.sleep(1000) // 1秒待つ
201 private fun parseReceivedStatus(eventData : String)
205 //Log.v(TAG, " parseReceivedStatus : $eventData")
206 parseBatteryInfo(eventData)
208 catch (e : Exception)
214 private fun parseBatteryInfo(eventData : String)
218 val header = "<batt>"
219 val indexStart = eventData.indexOf(header)
220 val indexEnd = eventData.indexOf("</batt>")
221 if (indexStart > 0 && indexEnd > 0 && indexStart < indexEnd)
223 val batteryInfo = eventData.substring(indexStart + header.length, indexEnd)
224 val indexMiddle = batteryInfo.indexOf("/")
225 val numerator = batteryInfo.substring(0, indexMiddle).toFloat()
226 val denominator = batteryInfo.substring(indexMiddle + 1, batteryInfo.length).toFloat()
227 remainBattery = ((numerator/denominator) * 100.0f).toInt()
228 // Log.v(TAG, " ====== BATTERY INFORMATION : $numerator / $denominator ($remainBattery%) ====== ")
237 fun getCurrentStatus(key: String) : String
240 ICameraStatus.BATTERY -> "$remainBattery"
247 private val TAG = CameraStatusHolder::class.java.simpleName
248 private const val TIMEOUT_MS = 3000