OSDN Git Service

WPZ2で動画撮影ができるようにする。
[gokigen/mangle.git] / app / src / main / java / jp / osdn / gokigen / gokigenassets / camera / vendor / pixpro / PixproCameraControl.kt
1 package jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro
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.interfaces.*
8 import jp.osdn.gokigen.gokigenassets.camera.preference.ICameraPreferenceProvider
9 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.operation.FocusControl
10 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.operation.MovieShotControl
11 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.operation.SingleShotControl
12 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.IPixproCamera
13 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.IPixproCameraInitializer
14 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.PixproCamera
15 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.IPixproCommandPublisher
16 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.IPixproCommunication
17 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.IPixproCommunicationNotify
18 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.command.PixproCommandCommunicator
19 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.connection.PixproCameraConnection
20 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.liveview.PixproLiveViewControl
21 import jp.osdn.gokigen.gokigenassets.camera.vendor.pixpro.wrapper.status.PixproStatusChecker
22 import jp.osdn.gokigen.gokigenassets.constants.IApplicationConstantConvert
23 import jp.osdn.gokigen.gokigenassets.constants.ICameraConstantConvert.Companion.ID_STRING_COMMAND_LINE_DISCONNECTED
24 import jp.osdn.gokigen.gokigenassets.liveview.ICachePositionProvider
25 import jp.osdn.gokigen.gokigenassets.liveview.IIndicatorControl
26 import jp.osdn.gokigen.gokigenassets.liveview.ILiveView
27 import jp.osdn.gokigen.gokigenassets.liveview.ILiveViewRefresher
28 import jp.osdn.gokigen.gokigenassets.liveview.focusframe.IAutoFocusFrameDisplay
29 import jp.osdn.gokigen.gokigenassets.liveview.image.CameraLiveViewListenerImpl
30 import jp.osdn.gokigen.gokigenassets.liveview.storeimage.StoreImage
31 import jp.osdn.gokigen.gokigenassets.preference.PreferenceAccessWrapper
32 import jp.osdn.gokigen.gokigenassets.scene.IInformationReceiver
33 import jp.osdn.gokigen.gokigenassets.scene.IVibrator
34
35 class PixproCameraControl(private val context: AppCompatActivity, private val vibrator: IVibrator, private val informationNotify : IInformationReceiver, private val preference: ICameraPreferenceProvider, provider: ICameraStatusReceiver) : ICameraControl, View.OnClickListener, View.OnLongClickListener, ICameraShutter, IKeyDown, IPixproInternalInterfaces, IPixproCommunicationNotify, IDisplayInjector
36 {
37     private val statusChecker = PixproStatusChecker()
38     private val liveViewListener = CameraLiveViewListenerImpl(context, informationNotify)
39     private val cameraConnection = PixproCameraConnection(context, provider, this, statusChecker)
40     private val pixproCameraParameter = PixproCamera()
41     private val commandCommunicator = PixproCommandCommunicator(pixproCameraParameter, this, statusChecker)
42     private val storeImage = StoreImage(context, liveViewListener)
43
44     private lateinit var liveViewControl : PixproLiveViewControl
45     private lateinit var cachePositionProvider : ICachePositionProvider
46     private lateinit var focusControl: FocusControl
47     private lateinit var stillControl: SingleShotControl
48     private lateinit var movieControl: MovieShotControl
49
50
51     private var cameraPositionId = 0
52
53     companion object
54     {
55         private val TAG = PixproCameraControl::class.java.simpleName
56     }
57
58     override fun getConnectionMethod(): String
59     {
60         return ("PIXPRO")
61     }
62
63     override fun initialize()
64     {
65         Log.v(TAG, " --- initialize() : SEQ : ${preference.getConnectionSequence()}")
66         statusChecker.setCommandPublisher(commandCommunicator)
67     }
68
69     override fun connectToCamera()
70     {
71         Log.v(TAG, " connectToCamera() : PIXPRO ")
72         try
73         {
74             cameraConnection.connect()
75         }
76         catch (e : Exception)
77         {
78             e.printStackTrace()
79         }
80     }
81
82     override fun startCamera(isPreviewView: Boolean, cameraSequence : Int)
83     {
84         try
85         {
86             if (cameraConnection.getConnectionStatus() != ICameraConnectionStatus.CameraConnectionStatus.CONNECTED)
87             {
88                 cameraConnection.startWatchWifiStatus(context)
89             }
90             else
91             {
92                 cameraConnection.connect()
93             }
94         }
95         catch (e : Exception)
96         {
97             e.printStackTrace()
98         }
99     }
100
101     override fun finishCamera()
102     {
103         try
104         {
105             if (::liveViewControl.isInitialized)
106             {
107                 liveViewControl.stopLiveView()
108             }
109             statusChecker.stopStatusWatch()
110             cameraConnection.disconnect(false)
111             cameraConnection.stopWatchWifiStatus(context)
112         }
113         catch (e: Exception)
114         {
115             e.printStackTrace()
116         }
117     }
118
119     override fun changeCaptureMode(mode: String) { }
120     override fun needRotateImage(): Boolean { return (false) }
121     override fun setRefresher(id : Int, refresher: ILiveViewRefresher, imageView: ILiveView, cachePosition : ICachePositionProvider)
122     {
123         try
124         {
125             liveViewListener.setRefresher(refresher)
126             imageView.setImageProvider(liveViewListener)
127             cachePositionProvider = cachePosition
128         }
129         catch (e : Exception)
130         {
131             e.printStackTrace()
132         }
133     }
134
135     override fun captureButtonReceiver(id: Int): View.OnClickListener
136     {
137         cameraPositionId = id
138         return (this)
139     }
140
141     override fun onLongClickReceiver(id: Int): View.OnLongClickListener
142     {
143         cameraPositionId = id
144         return (this)
145     }
146
147     override fun keyDownReceiver(id: Int): IKeyDown
148     {
149         cameraPositionId = id
150         return (this)
151     }
152
153     override fun getFocusingControl(id: Int): IFocusingControl
154     {
155         cameraPositionId = id
156         return (focusControl)
157     }
158
159     override fun getDisplayInjector(): IDisplayInjector
160     {
161         return (this)
162     }
163
164     override fun injectDisplay(frameDisplayer: IAutoFocusFrameDisplay, indicator: IIndicatorControl, focusingModeNotify: IFocusingModeNotify)
165     {
166         Log.v(TAG, "injectDisplay()")
167         focusControl = FocusControl(commandCommunicator, frameDisplayer)
168         stillControl = SingleShotControl(commandCommunicator, frameDisplayer)
169         movieControl = MovieShotControl(commandCommunicator, frameDisplayer)
170     }
171
172     override fun setNeighborCameraControl(camera0: ICameraControl?, camera1: ICameraControl?, camera2: ICameraControl?, camera3: ICameraControl?) { }
173     override fun getCameraStatus(): ICameraStatus { return (statusChecker) }
174
175     override fun onClick(v: View?)
176     {
177         if (v == null)
178         {
179             return
180         }
181         when (v.id)
182         {
183             IApplicationConstantConvert.ID_BUTTON_SHUTTER -> { doShutter() }
184             else -> { }
185         }
186     }
187
188     override fun handleKeyDown(keyCode: Int, event: KeyEvent): Boolean
189     {
190         if ((event.action == KeyEvent.ACTION_DOWN)&&((keyCode == KeyEvent.KEYCODE_VOLUME_UP)||(keyCode == KeyEvent.KEYCODE_CAMERA)))
191         {
192             doShutter()
193             return (true)
194         }
195         return (false)
196     }
197
198     override fun onLongClick(v: View?): Boolean
199     {
200         return (false)
201     }
202
203     override fun getIPixproCommunication(): IPixproCommunication { return (commandCommunicator) }
204     override fun getIPixproCommandPublisher(): IPixproCommandPublisher { return (commandCommunicator) }
205     override fun getInformationReceiver(): IInformationReceiver { return (informationNotify) }
206     override fun getIPixproCameraInitializer(): IPixproCameraInitializer { return (pixproCameraParameter) }
207     override fun getIPixproCamera(): IPixproCamera { return (pixproCameraParameter) }
208     override fun getIPixproCommunicationNotify(): IPixproCommunicationNotify { return (this) }
209
210     override fun readyToCommunicate()
211     {
212         Log.v(TAG, " ----- readyToCommunicate() ")
213         try
214         {
215             if (!::liveViewControl.isInitialized)
216             {
217                 liveViewControl = PixproLiveViewControl(liveViewListener, pixproCameraParameter)
218             }
219             liveViewControl.startLiveView()
220             statusChecker.startStatusWatch(null, null)
221         }
222         catch (e: Exception)
223         {
224             e.printStackTrace()
225         }
226     }
227
228     override fun detectDisconnect()
229     {
230         Log.v(TAG, " ----- detectDisconnect() ")
231         cameraConnection.forceUpdateConnectionStatus(ICameraConnectionStatus.CameraConnectionStatus.DISCONNECTED)
232         cameraConnection.alertConnectingFailed(context.getString(ID_STRING_COMMAND_LINE_DISCONNECTED))
233     }
234
235     override fun doShutter()
236     {
237         try
238         {
239             Log.v(TAG, " doShutter()")
240             val isNotDriveShutter = captureImageLiveView()
241             if (isNotDriveShutter)
242             {
243                 //  シャッターを駆動させない(けど、バイブレーションで通知する)
244                 vibrator.vibrate(IVibrator.VibratePattern.SIMPLE_SHORT)
245                 return
246             }
247             when (statusChecker.getStatus(ICameraStatus.TAKE_MODE))
248             {
249                 "Video" -> {
250                     if (::movieControl.isInitialized)
251                     {
252                         movieControl.doCapture(0)
253                         vibrator.vibrate(IVibrator.VibratePattern.SIMPLE_SHORT)
254                     }
255                 }
256                 else -> {
257                     if (::stillControl.isInitialized)
258                     {
259                         stillControl.doCapture(0)
260                     }
261                 }
262             }
263         }
264         catch (e : Exception)
265         {
266             e.printStackTrace()
267         }
268     }
269
270     override fun doShutterOff()
271     {
272         try
273         {
274             Log.v(TAG, " doShutterOff()")
275             when (statusChecker.getStatus(ICameraStatus.TAKE_MODE))
276             {
277                 "Video" -> {
278                     if (::movieControl.isInitialized)
279                     {
280                         movieControl.doCapture(-1)
281                         vibrator.vibrate(IVibrator.VibratePattern.SIMPLE_MIDDLE)
282                     }
283                 }
284                 else -> {
285                     if (::stillControl.isInitialized)
286                     {
287                         stillControl.doCapture(-1)
288                     }
289                 }
290             }
291         }
292         catch (e : Exception)
293         {
294             e.printStackTrace()
295         }
296     }
297
298     private fun captureImageLiveView() : Boolean
299     {
300         try
301         {
302             //  preferenceから設定を取得する
303             val captureBothCamera = PreferenceAccessWrapper(context).getBoolean(
304                 IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW, IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_BOTH_CAMERA_AND_LIVE_VIEW_DEFAULT_VALUE)
305             val notUseShutter = PreferenceAccessWrapper(context).getBoolean(
306                 IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_ONLY_LIVEVIEW_IMAGE, IApplicationConstantConvert.ID_PREFERENCE_CAPTURE_ONLY_LIVEVIEW_IMAGE_DEFAULT_VALUE)
307             if ((captureBothCamera)&&(liveViewListener.isImageReceived()))
308             {
309                 // ライブビュー画像を保管する場合...
310                 val thread = Thread { storeImage.doStore(cameraPositionId, false, cachePositionProvider.getCachePosition()) }
311                 try
312                 {
313                     thread.start()
314                 }
315                 catch (e: Exception)
316                 {
317                     e.printStackTrace()
318                 }
319             }
320             return (notUseShutter)
321         }
322         catch (e : Exception)
323         {
324             e.printStackTrace()
325         }
326         return (false)
327     }
328 }