OSDN Git Service

3a8eeb8c9a6cd6c0fd13c7ce85bda75094155395
[gokigen/mangle.git] / app / src / main / java / jp / osdn / gokigen / gokigenassets / camera / vendor / panasonic / wrapper / PanasonicCameraControl.kt
1 package jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.wrapper
2
3 import android.util.Log
4 import android.view.KeyEvent
5 import android.view.View
6 import androidx.appcompat.app.AppCompatActivity
7 import jp.osdn.gokigen.gokigenassets.camera.preference.ICameraPreferenceProvider
8 import jp.osdn.gokigen.gokigenassets.camera.interfaces.*
9 import jp.osdn.gokigen.gokigenassets.camera.interfaces.ICameraChangeListener
10 import jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.IPanasonicCamera
11 import jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.IPanasonicCameraHolder
12 import jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.connection.PanasonicCameraConnection
13 import jp.osdn.gokigen.gokigenassets.camera.vendor.ICameraControlCoordinator
14 import jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.liveview.PanasonicLiveViewControl
15 import jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.operation.PanasonicCameraCaptureControl
16 import jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.operation.PanasonicCameraFocusControl
17 import jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.operation.PanasonicCameraZoomLensControl
18 import jp.osdn.gokigen.gokigenassets.camera.vendor.panasonic.status.CameraEventObserver
19 import jp.osdn.gokigen.gokigenassets.constants.IApplicationConstantConvert
20 import jp.osdn.gokigen.gokigenassets.liveview.ICachePositionProvider
21 import jp.osdn.gokigen.gokigenassets.liveview.IIndicatorControl
22 import jp.osdn.gokigen.gokigenassets.liveview.ILiveView
23 import jp.osdn.gokigen.gokigenassets.liveview.ILiveViewRefresher
24 import jp.osdn.gokigen.gokigenassets.liveview.focusframe.IAutoFocusFrameDisplay
25 import jp.osdn.gokigen.gokigenassets.liveview.image.CameraLiveViewListenerImpl
26 import jp.osdn.gokigen.gokigenassets.liveview.storeimage.StoreImage
27 import jp.osdn.gokigen.gokigenassets.preference.PreferenceAccessWrapper
28 import jp.osdn.gokigen.gokigenassets.scene.IInformationReceiver
29 import jp.osdn.gokigen.gokigenassets.scene.IVibrator
30 import jp.osdn.gokigen.gokigenassets.utils.communication.SimpleHttpClient
31
32 class PanasonicCameraControl(private val context: AppCompatActivity, private val vibrator : IVibrator, informationNotify: IInformationReceiver, private val preference: ICameraPreferenceProvider, provider: ICameraStatusReceiver, private val cameraCoordinator: ICameraControlCoordinator, private val number: Int) : IPanasonicCameraHolder, IDisplayInjector,ILiveViewController, ICameraControl, View.OnClickListener, View.OnLongClickListener, ICameraShutter, IKeyDown
33 {
34     private val cardSlotSelector = PanasonicCardSlotSelector()
35     private val liveViewListener = CameraLiveViewListenerImpl(context, informationNotify)
36     private val cameraConnection: PanasonicCameraConnection = PanasonicCameraConnection(context, provider, this, this, cardSlotSelector, cameraCoordinator, number)
37     private val storeImage = StoreImage(context, liveViewListener)
38
39     private lateinit var cachePositionProvider : ICachePositionProvider
40     private lateinit var panasonicCamera: IPanasonicCamera
41     private lateinit var statusChecker: CameraEventObserver
42     private var liveViewControl: PanasonicLiveViewControl? = null
43     private var focusControl: PanasonicCameraFocusControl? = null
44     private var captureControl: PanasonicCameraCaptureControl? = null
45     private val zoomControl = PanasonicCameraZoomLensControl()
46     private var isStatusWatch = false
47     private var cameraPositionId = 0
48
49     companion object
50     {
51         private val TAG = PanasonicCameraControl::class.java.simpleName
52         private const val TIMEOUT_MS = 3000
53         private const val CONNECT_DELAY_MS : Long = 150
54     }
55
56     override fun prepare()
57     {
58         if (::panasonicCamera.isInitialized)
59         {
60             Log.v(TAG, " prepare : " + panasonicCamera.getFriendlyName() + " " + panasonicCamera.getModelName())
61             try
62             {
63                 if (!::statusChecker.isInitialized)
64                 {
65                     statusChecker = CameraEventObserver(context, panasonicCamera, cardSlotSelector)
66                 }
67                 if (liveViewControl == null)
68                 {
69                     liveViewControl = PanasonicLiveViewControl(liveViewListener, panasonicCamera, statusChecker.getCameraStatusEventObserver(), number)
70                 }
71                 focusControl?.setCamera(panasonicCamera)
72                 captureControl?.setCamera(panasonicCamera)
73                 zoomControl.setCamera(panasonicCamera)
74             }
75             catch (e: Exception)
76             {
77                 e.printStackTrace()
78             }
79         }
80         else
81         {
82             Log.v(TAG, " panasonicCamera is not initialized...")
83         }
84     }
85
86     override fun startRecMode()
87     {
88         try
89         {
90             val http = SimpleHttpClient()
91
92             // 撮影モード(RecMode)に切り替え
93             var reply: String = http.httpGet(panasonicCamera.getCmdUrl() + "cam.cgi?mode=camcmd&value=recmode", TIMEOUT_MS)
94             if (!reply.contains("ok"))
95             {
96                 Log.v(TAG, "CAMERA REPLIED ERROR : CHANGE RECMODE.")
97             }
98
99             //  フォーカスに関しては、1点に切り替える(仮)
100             reply = http.httpGet(panasonicCamera.getCmdUrl() + "cam.cgi?mode=setsetting&type=afmode&value=1area", TIMEOUT_MS)
101             if (!reply.contains("ok"))
102             {
103                 Log.v(TAG, "CAMERA REPLIED ERROR : CHANGE AF MODE 1area.")
104             }
105
106             //  測光モードに関しては、画面全体の測光に切り替える(仮)
107             reply = http.httpGet(panasonicCamera.getCmdUrl() + "cam.cgi?mode=setsetting&type=lightmetering&value=multi", TIMEOUT_MS)
108             if (!reply.contains("ok"))
109             {
110                 Log.v(TAG, "CAMERA REPLIED ERROR : CHANGE AF MODE 1area.")
111             }
112
113         }
114         catch (e: Exception)
115         {
116             e.printStackTrace()
117         }
118     }
119
120     override fun startEventWatch(listener: ICameraChangeListener?)
121     {
122         try
123         {
124             if (::statusChecker.isInitialized)
125             {
126                 if (listener != null)
127                 {
128                     statusChecker.setEventListener(listener)
129                 }
130                 statusChecker.startStatusWatch(null, null)
131             }
132         }
133         catch (e: Exception)
134         {
135             e.printStackTrace()
136         }
137     }
138
139     override fun detectedCamera(camera: IPanasonicCamera)
140     {
141         Log.v(TAG, "detectedCamera()")
142         panasonicCamera = camera
143     }
144
145     override fun getConnectionMethod(): String
146     {
147         return ("PANASONIC")
148     }
149
150     override fun initialize()
151     {
152         // TODO("Not yet implemented")
153     }
154
155     override fun connectToCamera()
156     {
157         Log.v(TAG, " connectToCamera() : PANASONIC ")
158         try
159         {
160             while (!cameraCoordinator.startConnectToCamera(number))
161             {
162                 try
163                 {
164                     Thread.sleep(CONNECT_DELAY_MS)
165                 }
166                 catch (e: Exception)
167                 {
168                     e.printStackTrace()
169                 }
170             }
171             cameraConnection.connect()
172         }
173         catch (e : Exception)
174         {
175             e.printStackTrace()
176         }
177     }
178
179     override fun startCamera(isPreviewView: Boolean, cameraSequence: Int)
180     {
181         try
182         {
183             if (cameraConnection.getConnectionStatus() != ICameraConnectionStatus.CameraConnectionStatus.CONNECTED)
184             {
185                 cameraConnection.startWatchWifiStatus(context)
186             }
187             else
188             {
189                 cameraConnection.connect()
190             }
191         }
192         catch (e : Exception)
193         {
194             e.printStackTrace()
195         }
196     }
197
198     override fun finishCamera()
199     {
200         try
201         {
202             if (isStatusWatch)
203             {
204                 if (::statusChecker.isInitialized)
205                 {
206                     statusChecker.stopStatusWatch()
207                 }
208                 isStatusWatch = false
209             }
210             cameraConnection.disconnect(false)
211             cameraConnection.stopWatchWifiStatus(context)
212             stopLiveView()
213         }
214         catch (e : Exception)
215         {
216             e.printStackTrace()
217         }
218     }
219
220     override fun changeCaptureMode(mode: String)
221     {
222         // TODO("Not yet implemented")
223     }
224
225     override fun needRotateImage(): Boolean
226     {
227         return (false)
228     }
229
230     override fun setRefresher(id: Int, refresher: ILiveViewRefresher, imageView: ILiveView, cachePosition : ICachePositionProvider)
231     {
232         try
233         {
234             liveViewListener.setRefresher(refresher)
235             imageView.setImageProvider(liveViewListener)
236             cachePositionProvider = cachePosition
237         }
238         catch (e : Exception)
239         {
240             e.printStackTrace()
241         }
242     }
243
244     override fun captureButtonReceiver(id: Int): View.OnClickListener
245     {
246         cameraPositionId = id
247         return (this)
248     }
249
250     override fun onLongClickReceiver(id: Int): View.OnLongClickListener
251     {
252         cameraPositionId = id
253         return (this)
254     }
255
256     override fun keyDownReceiver(id: Int): IKeyDown
257     {
258         cameraPositionId = id
259         return (this)
260     }
261
262     override fun getFocusingControl(id: Int): IFocusingControl?
263     {
264         cameraPositionId = id
265         return (focusControl)
266     }
267
268     override fun getDisplayInjector(): IDisplayInjector
269     {
270         return (this)
271     }
272
273     override fun injectDisplay(frameDisplayer: IAutoFocusFrameDisplay, indicator: IIndicatorControl, focusingModeNotify: IFocusingModeNotify)
274     {
275         Log.v(TAG, "injectDisplay()")
276         focusControl = PanasonicCameraFocusControl(frameDisplayer, indicator)
277         captureControl = PanasonicCameraCaptureControl(frameDisplayer, indicator)
278     }
279
280     override fun startLiveView(isCameraScreen: Boolean)
281     {
282         Log.v(TAG, " startLiveView($isCameraScreen) ")
283         try
284         {
285             if (!isStatusWatch)
286             {
287                 if (::statusChecker.isInitialized)
288                 {
289                     statusChecker.startStatusWatch(null, null)
290                     isStatusWatch = true
291                 }
292             }
293             liveViewControl?.startLiveView()
294         }
295         catch (e : Exception)
296         {
297             e.printStackTrace()
298         }
299     }
300
301     override fun stopLiveView()
302     {
303         Log.v(TAG, " stopLiveView() ")
304         try
305         {
306             liveViewControl?.stopLiveView()
307             if (isStatusWatch)
308             {
309                 if (::statusChecker.isInitialized)
310                 {
311                     statusChecker.stopStatusWatch()
312                     isStatusWatch = false
313                 }
314             }
315         }
316         catch (e : Exception)
317         {
318             e.printStackTrace()
319         }
320     }
321
322     override fun onClick(v: View?)
323     {
324         if (v == null)
325         {
326             return
327         }
328         when (v.id)
329         {
330             IApplicationConstantConvert.ID_BUTTON_SHUTTER -> { doShutter() }
331             else -> { }
332         }
333     }
334
335     override fun doShutter()
336     {
337         try
338         {
339             Log.v(TAG, " doShutter()")
340             val isNotDriveShutter = captureImageLiveView()
341             if (isNotDriveShutter)
342             {
343                 //  シャッターを駆動させない(けど、バイブレーションで通知する)
344                 vibrator.vibrate(IVibrator.VibratePattern.SIMPLE_SHORT)
345                 return
346             }
347             if (captureControl == null)
348             {
349                 Log.v(TAG, " captureControl is NULL.")
350             }
351             captureControl?.doCapture(0)
352         }
353         catch (e : Exception)
354         {
355             e.printStackTrace()
356         }
357     }
358
359     override fun doShutterOff()
360     {
361         try
362         {
363             Log.v(TAG, " doShutterOff()")
364             captureControl?.doCapture(0)
365         }
366         catch (e : Exception)
367         {
368             e.printStackTrace()
369         }
370     }
371
372     override fun handleKeyDown(keyCode: Int, event: KeyEvent): Boolean
373     {
374         if ((event.action == KeyEvent.ACTION_DOWN)&&((keyCode == KeyEvent.KEYCODE_VOLUME_UP)||(keyCode == KeyEvent.KEYCODE_CAMERA)))
375         {
376             doShutter()
377             return (true)
378         }
379         return (false)
380     }
381
382     private fun captureImageLiveView() : Boolean
383     {
384         try
385         {
386             //  preferenceから設定を取得する
387             val captureBothCamera = PreferenceAccessWrapper(context).getBoolean(IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW, IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW_DEFAULT_VALUE)
388             val notUseShutter = PreferenceAccessWrapper(context).getBoolean(IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_ONLY_LIVEVIEW_IMAGE, IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_ONLY_LIVEVIEW_IMAGE_DEFAULT_VALUE)
389             if ((captureBothCamera)&&(liveViewListener.isImageReceived()))
390             {
391                 // ライブビュー画像を保管する場合...
392                 val thread = Thread { storeImage.doStore(cameraPositionId, false, cachePositionProvider.getCachePosition()) }
393                 try
394                 {
395                     thread.start()
396                 }
397                 catch (e: Exception)
398                 {
399                     e.printStackTrace()
400                 }
401             }
402             return (notUseShutter)
403         }
404         catch (e : Exception)
405         {
406             e.printStackTrace()
407         }
408         return (false)
409     }
410
411     override fun onLongClick(v: View?): Boolean
412     {
413         return (false)
414     }
415
416     override fun setNeighborCameraControl(index: Int, camera0: ICameraControl?, camera1: ICameraControl?, camera2: ICameraControl?, camera3: ICameraControl?) { }
417     override fun setNeighborCameraControlFinished() { }
418
419     override fun getCameraStatus(): ICameraStatus?
420     {
421         if (!::statusChecker.isInitialized)
422         {
423             return (null)
424         }
425         return (statusChecker.getCameraStatusConvert())
426     }
427
428     override fun getCameraNumber(): Int
429     {
430         return (number)
431     }
432 }