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 updateStatus(currentStatus : MyApplicationStatus.Status)
139 when (currentStatus) {
140 MyApplicationStatus.Status.Initialized -> {
141 Log.v(TAG, " INITIALIZED")
142 thetaHardwareControl.controlLED(LedTarget.LED3, 1500, LedColor.GREEN) // WIFIランプ
143 thetaHardwareControl.controlLED(LedTarget.LED6, -1, LedColor.BLUE) // Liveランプ (OFF)
144 thetaHardwareControl.controlLED(LedTarget.LED7, -1, LedColor.RED) // 赤ランプ
146 MyApplicationStatus.Status.Searching -> {
147 Log.v(TAG, " SEARCHING")
148 thetaHardwareControl.controlLED(LedTarget.LED3, 250, LedColor.GREEN) // WIFIランプ
149 thetaHardwareControl.controlLED(LedTarget.LED6, -1, LedColor.BLUE) // Liveランプ (OFF)
150 thetaHardwareControl.controlLED(LedTarget.LED7, -1, LedColor.RED) // 赤ランプ
152 MyApplicationStatus.Status.Connected -> {
153 Log.v(TAG, " CONNECTED")
154 thetaHardwareControl.controlLED(LedTarget.LED3, 0, LedColor.GREEN) // WIFIランプ
155 thetaHardwareControl.controlLED(LedTarget.LED6, -1, LedColor.BLUE) // Liveランプ (OFF)
156 thetaHardwareControl.controlLED(LedTarget.LED7, -1, LedColor.RED) // 赤ランプ
158 MyApplicationStatus.Status.Scanning -> {
159 Log.v(TAG, " SCANNING")
160 thetaHardwareControl.controlLED(LedTarget.LED3, 0, LedColor.GREEN) // WIFIランプ
161 thetaHardwareControl.controlLED(LedTarget.LED6, -1, LedColor.BLUE) // Liveランプ (OFF)
162 thetaHardwareControl.controlLED(LedTarget.LED7, 0, LedColor.RED) // 赤ランプ
164 MyApplicationStatus.Status.Syncing -> {
165 Log.v(TAG, " SYNCING")
166 thetaHardwareControl.controlLED(LedTarget.LED3, 0, LedColor.GREEN) // WIFIランプ
167 thetaHardwareControl.controlLED(LedTarget.LED6, 0, LedColor.BLUE) // Liveランプ (ON)
168 thetaHardwareControl.controlLED(LedTarget.LED7, 0, LedColor.RED) // 赤ランプ
170 MyApplicationStatus.Status.FailedInitialize -> {
171 Log.v(TAG, " FAILED INITIALIZE")
172 thetaHardwareControl.controlLED(LedTarget.LED3, 250, LedColor.GREEN) // WIFIランプ
173 thetaHardwareControl.controlLED(LedTarget.LED6, -1, LedColor.BLUE) // Liveランプ (OFF)
174 thetaHardwareControl.controlLED(LedTarget.LED7, 250, LedColor.RED) // 赤ランプ
177 Log.v(TAG, " UNDEFINED")
178 thetaHardwareControl.controlLED(LedTarget.LED3, -1, LedColor.GREEN) // WIFIランプ
179 thetaHardwareControl.controlLED(LedTarget.LED4, -1, LedColor.BLUE) // カメラランプ
180 thetaHardwareControl.controlLED(LedTarget.LED5, -1, LedColor.BLUE) // ムービーランプ
181 thetaHardwareControl.controlLED(LedTarget.LED6, 0, LedColor.BLUE) // Liveランプ (ON)
182 thetaHardwareControl.controlLED(LedTarget.LED7, -1, LedColor.RED) // 赤ランプ
186 catch (e : Exception)
192 override fun onResume()
197 Log.v(TAG , " isApConnected : $isApConnected")
199 initializeBluetooth()
202 private fun initializeBluetooth()
206 val thread = Thread {
209 val setupBluetooth = ThetaSetupBluetoothSPP("http://localhost:8080")
210 setupBluetooth.setupBluetoothSPP(object : IOperationCallback { override fun operationExecuted(result: Int, resultStr: String?)
212 Log.v(TAG, " optionSet.getOptions(Bluetooth) : $resultStr ($result)")
217 applicationStatus.status = MyApplicationStatus.Status.Initialized
218 updateStatus(applicationStatus.status)
235 override fun foundBluetoothDevice(device: BluetoothDevice)
239 // Bluetoothデバイスが見つかった!
240 applicationStatus.status = MyApplicationStatus.Status.Connected
241 updateStatus(applicationStatus.status)
243 catch (e : Exception)
249 override fun notFindBluetoothDevice()
253 // Bluetoothデバイスが見つからなかった...
254 applicationStatus.status = MyApplicationStatus.Status.Initialized
255 updateStatus(applicationStatus.status)
257 catch (e : Exception)
265 // -----------------------------------------------------
267 // LED2 : カメラステータス ランプ(レンズとマイクの間)
268 // LED3 : ワイヤレスマーク ランプ
269 // LED4 : キャプチャーモード (カメラ)
270 // LED5 : キャプチャーモード (ムービー)
271 // LED6 : キャプチャーモード (LIVEストリーミング)
279 // -----------------------------------------------------
282 // - LED3~LED8 : カラー : "blue", "green", "red", "cyan", "magenta", "yellow", "white"
283 // - ブリンク間隔 : 1~2000 msec
286 // - 27 : Shutter Button
287 // - 130 : Mode Button
288 // - 284 : Wireless Button
289 // - 119 : Fn Button (Z1 Only)
292 // http://localhost:8080/