1 package jp.osdn.gokigen.thetathoughtshutter
3 import android.bluetooth.BluetoothDevice
4 import android.os.Bundle
5 import android.util.Log
6 import android.view.KeyEvent
7 import com.theta360.pluginlibrary.activity.PluginActivity
8 import com.theta360.pluginlibrary.callback.KeyCallback
9 import com.theta360.pluginlibrary.receiver.KeyReceiver
10 import com.theta360.pluginlibrary.values.LedColor
11 import com.theta360.pluginlibrary.values.LedTarget
12 import jp.osdn.gokigen.thetathoughtshutter.R.layout
13 import jp.osdn.gokigen.thetathoughtshutter.bluetooth.connection.IBluetoothScanResult
14 import jp.osdn.gokigen.thetathoughtshutter.bluetooth.connection.eeg.MindWaveConnection
15 import jp.osdn.gokigen.thetathoughtshutter.brainwave.BrainwaveDataHolder
16 import jp.osdn.gokigen.thetathoughtshutter.theta.ThetaHardwareControl
17 import jp.osdn.gokigen.thetathoughtshutter.theta.ThetaSetupBluetoothSPP
18 import jp.osdn.gokigen.thetathoughtshutter.theta.operation.IOperationCallback
19 import java.lang.Exception
21 class MainActivity : PluginActivity(), IBluetoothScanResult
23 private val thetaHardwareControl = ThetaHardwareControl(this)
24 private val applicationStatus : MyApplicationStatus = MyApplicationStatus()
25 private val bluetoothConnection = MindWaveConnection(this, BrainwaveDataHolder(), this)
29 private val TAG = MainActivity::class.java.simpleName
32 override fun onCreate(savedInstanceState: Bundle?)
34 super.onCreate(savedInstanceState)
35 setContentView(layout.activity_main)
39 setKeyCallback(object : KeyCallback {
40 override fun onKeyDown(keyCode: Int, event: KeyEvent?)
45 override fun onKeyUp(keyCode: Int, event: KeyEvent?)
47 if (keyCode == KeyReceiver.KEYCODE_CAMERA) // Shutterボタン
49 when (applicationStatus.status)
51 MyApplicationStatus.Status.Connected -> {
53 applicationStatus.status = MyApplicationStatus.Status.Scanning
55 MyApplicationStatus.Status.Scanning -> {
57 applicationStatus.status = MyApplicationStatus.Status.Connected
60 // ダミー処理 (仮にEEG接続失敗のステータスにする)
61 applicationStatus.status = MyApplicationStatus.Status.FailedInitialize
65 if (keyCode == KeyReceiver.KEYCODE_WLAN_ON_OFF) // Wirelessボタン
67 if (applicationStatus.status == MyApplicationStatus.Status.Initialized)
69 // Bluetooth SPPで EEGに接続する
73 if (keyCode == KeyReceiver.KEYCODE_MEDIA_RECORD) // Modeボタン
75 when (applicationStatus.status) {
76 MyApplicationStatus.Status.Searching -> {
78 applicationStatus.status = MyApplicationStatus.Status.Connected
80 MyApplicationStatus.Status.Scanning -> {
82 applicationStatus.status = MyApplicationStatus.Status.Syncing
84 MyApplicationStatus.Status.Syncing -> {
85 // ダミー処理 (高まるのを待っている状態)
86 applicationStatus.status = MyApplicationStatus.Status.Scanning
90 applicationStatus.status = MyApplicationStatus.Status.Initialized
95 if (keyCode == KeyReceiver.KEYCODE_FUNCTION) // Fnボタン (Z1のみ)
100 updateStatus(applicationStatus.status)
103 override fun onKeyLongPress(keyCode: Int, event: KeyEvent?)
108 updateStatus(applicationStatus.status)
111 // Bluetooth SPPで EEGに接続する
112 private fun connectToEEG()
116 val thread = Thread {
119 bluetoothConnection.connect("MindWave Mobile")
132 applicationStatus.status = MyApplicationStatus.Status.Searching
135 private fun disconnectToEEG()
139 val thread = Thread {
142 bluetoothConnection.disconnect()
155 applicationStatus.status = MyApplicationStatus.Status.Initialized
159 private fun updateStatus(currentStatus : MyApplicationStatus.Status)
163 when (currentStatus) {
164 MyApplicationStatus.Status.Initialized -> {
165 Log.v(TAG, " INITIALIZED")
166 thetaHardwareControl.controlLED(LedTarget.LED3, 1500, LedColor.GREEN) // WIFIランプ
167 thetaHardwareControl.controlLED(LedTarget.LED6, -1, LedColor.BLUE) // Liveランプ (OFF)
168 thetaHardwareControl.controlLED(LedTarget.LED7, -1, LedColor.RED) // 赤ランプ
170 MyApplicationStatus.Status.Searching -> {
171 Log.v(TAG, " SEARCHING")
172 thetaHardwareControl.controlLED(LedTarget.LED3, 250, LedColor.GREEN) // WIFIランプ
173 thetaHardwareControl.controlLED(LedTarget.LED6, -1, LedColor.BLUE) // Liveランプ (OFF)
174 thetaHardwareControl.controlLED(LedTarget.LED7, -1, LedColor.RED) // 赤ランプ
176 MyApplicationStatus.Status.Connected -> {
177 Log.v(TAG, " CONNECTED")
178 thetaHardwareControl.controlLED(LedTarget.LED3, 0, LedColor.GREEN) // WIFIランプ
179 thetaHardwareControl.controlLED(LedTarget.LED6, -1, LedColor.BLUE) // Liveランプ (OFF)
180 thetaHardwareControl.controlLED(LedTarget.LED7, -1, LedColor.RED) // 赤ランプ
182 MyApplicationStatus.Status.Scanning -> {
183 Log.v(TAG, " SCANNING")
184 thetaHardwareControl.controlLED(LedTarget.LED3, 0, LedColor.GREEN) // WIFIランプ
185 thetaHardwareControl.controlLED(LedTarget.LED6, -1, LedColor.BLUE) // Liveランプ (OFF)
186 thetaHardwareControl.controlLED(LedTarget.LED7, 0, LedColor.RED) // 赤ランプ
188 MyApplicationStatus.Status.Syncing -> {
189 Log.v(TAG, " SYNCING")
190 thetaHardwareControl.controlLED(LedTarget.LED3, 0, LedColor.GREEN) // WIFIランプ
191 thetaHardwareControl.controlLED(LedTarget.LED6, 0, LedColor.BLUE) // Liveランプ (ON)
192 thetaHardwareControl.controlLED(LedTarget.LED7, 0, LedColor.RED) // 赤ランプ
194 MyApplicationStatus.Status.FailedInitialize -> {
195 Log.v(TAG, " FAILED INITIALIZE")
196 thetaHardwareControl.controlLED(LedTarget.LED3, 250, LedColor.GREEN) // WIFIランプ
197 thetaHardwareControl.controlLED(LedTarget.LED6, -1, LedColor.BLUE) // Liveランプ (OFF)
198 thetaHardwareControl.controlLED(LedTarget.LED7, 250, LedColor.RED) // 赤ランプ
201 Log.v(TAG, " UNDEFINED")
202 thetaHardwareControl.controlLED(LedTarget.LED3, -1, LedColor.GREEN) // WIFIランプ
203 thetaHardwareControl.controlLED(LedTarget.LED4, -1, LedColor.BLUE) // カメラランプ
204 thetaHardwareControl.controlLED(LedTarget.LED5, -1, LedColor.BLUE) // ムービーランプ
205 thetaHardwareControl.controlLED(LedTarget.LED6, 0, LedColor.BLUE) // Liveランプ (ON)
206 thetaHardwareControl.controlLED(LedTarget.LED7, -1, LedColor.RED) // 赤ランプ
210 catch (e : Exception)
216 override fun onResume()
221 Log.v(TAG , " isApConnected : $isApConnected")
223 initializeBluetooth()
226 override fun onPause()
233 catch (e : Exception)
240 private fun initializeBluetooth()
244 val thread = Thread {
247 val setupBluetooth = ThetaSetupBluetoothSPP("http://localhost:8080")
248 setupBluetooth.setupBluetoothSPP(object : IOperationCallback { override fun operationExecuted(result: Int, resultStr: String?)
250 Log.v(TAG, " optionSet.getOptions(Bluetooth) : $resultStr ($result)")
255 applicationStatus.status = MyApplicationStatus.Status.Initialized
256 updateStatus(applicationStatus.status)
273 override fun foundBluetoothDevice(device: BluetoothDevice)
277 // Bluetoothデバイスが見つかった!
278 applicationStatus.status = MyApplicationStatus.Status.Connected
279 updateStatus(applicationStatus.status)
281 catch (e : Exception)
287 override fun notFindBluetoothDevice()
291 // Bluetoothデバイスが見つからなかった...
292 applicationStatus.status = MyApplicationStatus.Status.Initialized
293 updateStatus(applicationStatus.status)
295 catch (e : Exception)
303 // -----------------------------------------------------
305 // LED2 : カメラステータス ランプ(レンズとマイクの間)
306 // LED3 : ワイヤレスマーク ランプ
307 // LED4 : キャプチャーモード (カメラ)
308 // LED5 : キャプチャーモード (ムービー)
309 // LED6 : キャプチャーモード (LIVEストリーミング)
317 // -----------------------------------------------------
320 // - LED3~LED8 : カラー : "blue", "green", "red", "cyan", "magenta", "yellow", "white"
321 // - ブリンク間隔 : 1~2000 msec
324 // - 27 : Shutter Button
325 // - 130 : Mode Button
326 // - 284 : Wireless Button
327 // - 119 : Fn Button (Z1 Only)
330 // http://localhost:8080/