Skip to content
Snippets Groups Projects
Commit f7215a13 authored by Anon's avatar Anon
Browse files

Share common connection.

parent a4ae7683
Branches
No related tags found
No related merge requests found
......@@ -57,7 +57,6 @@ class BatchTransferFragment : Fragment(), FileTransferListener, GattListener {
inflater.inflate(R.layout.batch_transfer_fragment, container, false)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
label_status.text = getString(R.string.batch_transfer_label_initializing)
progress.max = queue.size
button_cancel.setOnClickListener {
......@@ -72,13 +71,7 @@ class BatchTransferFragment : Fragment(), FileTransferListener, GattListener {
.commit()
}
initConnection()
}
private fun initConnection() {
val ctx = context ?: throw IllegalStateException()
ConnectionService.addGattListener("batchfiletransfer", this)
ConnectionService.connect(ctx)
startTransfer()
}
private fun startTransfer() {
......@@ -123,10 +116,6 @@ class BatchTransferFragment : Fragment(), FileTransferListener, GattListener {
}
}
override fun onConnectionReady() {
startTransfer()
}
override fun onError() {
activity?.runOnUiThread {
label_status.text = getString(R.string.batch_transfer_label_error)
......
......@@ -80,19 +80,12 @@ class FileTransferFragment : Fragment(), GattListener, FileTransferListener{
buttonStartStop = view.findViewById(R.id.button_start_stop_transfer)
try {
initConnection()
toggleControls()
} catch (e: ConnectionException) {
showError(e.message)
} catch (e: Exception) {
showError(getString(R.string.connection_error_generic))
}
}
private fun initConnection() {
val ctx = context ?: throw IllegalStateException()
ConnectionService.connect(ctx)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
......
......@@ -22,60 +22,23 @@
package de.ccc.events.badge.card10.mood
import android.bluetooth.BluetoothAdapter
import android.bluetooth.BluetoothGatt
import android.bluetooth.BluetoothGattCallback
import android.bluetooth.BluetoothGattCharacteristic
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import de.ccc.events.badge.card10.CARD10_BLUETOOTH_MAC_PREFIX
import de.ccc.events.badge.card10.CARD10_SERVICE_UUID
import de.ccc.events.badge.card10.R
import de.ccc.events.badge.card10.ROCKETS_CHARACTERISTIC_UUID
import de.ccc.events.badge.card10.common.ConnectionService
import de.ccc.events.badge.card10.time.Card10Service
import kotlinx.android.synthetic.main.mood_fragment.*
import java.util.concurrent.CountDownLatch
class MoodFragment : Fragment() {
private val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
private lateinit var gatt: BluetoothGatt
private var rocketsCharacteristic: BluetoothGattCharacteristic? = null
private var writeLatch: CountDownLatch? = null
private var card10Service: Card10Service? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val callback = object : BluetoothGattCallback() {
override fun onConnectionStateChange(gatt: BluetoothGatt, status: Int, newState: Int) {
System.out.println("===== onConnectionStateChange " + gatt + " / " + status + " / " + newState)
if (newState == BluetoothGatt.STATE_CONNECTED)
gatt.discoverServices()
}
override fun onServicesDiscovered(gatt: BluetoothGatt, status: Int) {
System.out.println("===== onServicesDiscovered " + gatt + " / " + status)
val card10Service = gatt.getService(CARD10_SERVICE_UUID)
rocketsCharacteristic = card10Service.getCharacteristic(ROCKETS_CHARACTERISTIC_UUID)
}
override fun onCharacteristicWrite(
gatt: BluetoothGatt,
characteristic: BluetoothGattCharacteristic,
status: Int
) {
System.out.println("===== onCharacteristicWrite " + characteristic.uuid.toString() + " / " + characteristic.value + " / " + status)
writeLatch?.countDown();
}
}
val remoteDevices =
bluetoothAdapter.bondedDevices.filter { it.address.startsWith(CARD10_BLUETOOTH_MAC_PREFIX, true) }
if (remoteDevices.isEmpty())
activity!!.finish()
gatt = remoteDevices.get(0).connectGatt(activity, false, callback)
card10Service = ConnectionService.card10Service
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
......@@ -83,28 +46,14 @@ class MoodFragment : Fragment() {
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
mood_good.setOnClickListener({
writeGatt(rocketsCharacteristic!!, ubyteArrayOf(0xffu, 0x00u, 0x00u).toByteArray())
})
mood_neutral.setOnClickListener({
writeGatt(rocketsCharacteristic!!, ubyteArrayOf(0x00u, 0xffu, 0x00u).toByteArray())
})
mood_bad.setOnClickListener({
writeGatt(rocketsCharacteristic!!, ubyteArrayOf(0x00u, 0x00u, 0xffu).toByteArray())
})
mood_good.setOnClickListener{
card10Service?.setRocketValue(ubyteArrayOf(0xffu, 0x00u, 0x00u).toByteArray())
}
fun writeGatt(characteristic: BluetoothGattCharacteristic, values: ByteArray) {
characteristic.value = values
val init = gatt.writeCharacteristic(rocketsCharacteristic)
if (!init)
System.out.println("Failed to initiate writing GATT attribute")
writeLatch = CountDownLatch(1)
writeLatch!!.await();
mood_neutral.setOnClickListener{
card10Service?.setRocketValue(ubyteArrayOf(0x00u, 0xffu, 0x00u).toByteArray())
}
mood_bad.setOnClickListener{
card10Service?.setRocketValue(ubyteArrayOf(0x00u, 0x00u, 0xffu).toByteArray())
}
override fun onDestroy() {
gatt.close();
super.onDestroy()
}
}
......@@ -22,84 +22,40 @@
package de.ccc.events.badge.card10.sparkle
import android.bluetooth.*
import android.os.Bundle
import android.os.Handler
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import de.ccc.events.badge.card10.CARD10_BLUETOOTH_MAC_PREFIX
import de.ccc.events.badge.card10.CARD10_SERVICE_UUID
import de.ccc.events.badge.card10.LEDS_ABOVE_CHARACTERISTIC_UUID
import de.ccc.events.badge.card10.R
import java.util.concurrent.CountDownLatch
import de.ccc.events.badge.card10.common.ConnectionService
import de.ccc.events.badge.card10.time.Card10Service
import kotlin.random.Random
class BeautifulFragment : Fragment(), Runnable {
private val bluetoothAdapter = BluetoothAdapter.getDefaultAdapter()
private lateinit var gatt: BluetoothGatt
private var ledsAboveCharacteristic: BluetoothGattCharacteristic? = null
private @Volatile var writeLatch: CountDownLatch? = null
private val handler = Handler()
private var card10Service: Card10Service? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val callback = object : BluetoothGattCallback() {
override fun onConnectionStateChange(gatt: BluetoothGatt, status: Int, newState: Int) {
println("===== onConnectionStateChange ${gatt} ${if (status == BluetoothGatt.GATT_SUCCESS) "SUCCESS" else status} ${if (newState == BluetoothProfile.STATE_CONNECTED) "CONNECTED" else if (newState == BluetoothProfile.STATE_DISCONNECTED) "DISCONNECTED" else newState}")
if (newState == BluetoothGatt.STATE_CONNECTED)
gatt.requestMtu(64)
}
override fun onMtuChanged(gatt: BluetoothGatt, mtu: Int, status: Int) {
println("===== onMtuChanged ${gatt} ${if (status == BluetoothGatt.GATT_SUCCESS) "SUCCESS" else status} ${mtu}")
gatt.discoverServices()
}
override fun onServicesDiscovered(gatt: BluetoothGatt, status: Int) {
println("===== onServicesDiscovered ${gatt} ${if (status == BluetoothGatt.GATT_SUCCESS) "SUCCESS" else status}")
val card10Service = gatt.getService(CARD10_SERVICE_UUID)
ledsAboveCharacteristic = card10Service.getCharacteristic(LEDS_ABOVE_CHARACTERISTIC_UUID)
card10Service = ConnectionService.card10Service
handler.post(this@BeautifulFragment)
}
override fun onCharacteristicWrite(
gatt: BluetoothGatt,
characteristic: BluetoothGattCharacteristic,
status: Int
) {
println("=== onCharacteristicWrite ${gatt} ${if (status == BluetoothGatt.GATT_SUCCESS) "SUCCESS" else status} ${characteristic.uuid} ${characteristic.value}")
writeLatch?.countDown();
}
}
val remoteDevices =
bluetoothAdapter.bondedDevices.filter { it.address.startsWith(CARD10_BLUETOOTH_MAC_PREFIX, true) }
if (remoteDevices.isEmpty())
activity!!.finish()
gatt = remoteDevices.get(0).connectGatt(activity, false, callback)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.beautiful_fragment, container, false)
}
override fun run() {
ledsAboveCharacteristic!!.value = Random.nextBytes(33);
writeLatch = CountDownLatch(1)
val init = gatt.writeCharacteristic(ledsAboveCharacteristic)
if (!init)
println("=== Failed to initiate writing GATT attribute")
writeLatch!!.await();
card10Service?.setLeds(Random.nextBytes(33))
handler.postDelayed(this, 100)
}
override fun onDestroy() {
handler.removeCallbacksAndMessages(null)
gatt.close();
super.onDestroy()
}
}
......@@ -24,6 +24,8 @@ package de.ccc.events.badge.card10.time
import android.bluetooth.BluetoothGattCharacteristic
import android.bluetooth.BluetoothGattService
import de.ccc.events.badge.card10.LEDS_ABOVE_CHARACTERISTIC_UUID
import de.ccc.events.badge.card10.ROCKETS_CHARACTERISTIC_UUID
import de.ccc.events.badge.card10.TIME_CHARACTERISTIC_UUID
import de.ccc.events.badge.card10.common.ConnectionService
import java.nio.ByteBuffer
......@@ -31,11 +33,14 @@ import java.nio.ByteBuffer
class Card10Service(
service: BluetoothGattService
) {
private val timeCharacteristic: BluetoothGattCharacteristic
private val timeCharacteristic = service.getCharacteristic(TIME_CHARACTERISTIC_UUID)
private val rocketsCharacteristic = service.getCharacteristic(ROCKETS_CHARACTERISTIC_UUID)
private var ledsAboveCharacteristic = service.getCharacteristic(LEDS_ABOVE_CHARACTERISTIC_UUID)
init {
timeCharacteristic = service.getCharacteristic(TIME_CHARACTERISTIC_UUID)
timeCharacteristic.writeType = BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE
rocketsCharacteristic.writeType = BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE
ledsAboveCharacteristic.writeType = BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE
}
fun setTime() {
......@@ -44,4 +49,14 @@ class Card10Service(
timeCharacteristic.value = buffer.array()
ConnectionService.writeCharacteristic(timeCharacteristic)
}
fun setRocketValue(value: ByteArray) {
rocketsCharacteristic.value = value
ConnectionService.writeCharacteristic(rocketsCharacteristic)
}
fun setLeds(value: ByteArray) {
ledsAboveCharacteristic.value = value
ConnectionService.writeCharacteristic(ledsAboveCharacteristic)
}
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment