Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Stefan Zabka
Companion App Android
Commits
f7215a13
Commit
f7215a13
authored
Aug 22, 2019
by
Anon
Browse files
Share common connection.
parent
a4ae7683
Changes
5
Hide whitespace changes
Inline
Side-by-side
app/src/main/java/de/ccc/events/badge/card10/filetransfer/BatchTransferFragment.kt
View file @
f7215a13
...
...
@@ -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
)
...
...
app/src/main/java/de/ccc/events/badge/card10/filetransfer/FileTransferFragment.kt
View file @
f7215a13
...
...
@@ -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
?)
{
...
...
app/src/main/java/de/ccc/events/badge/card10/mood/MoodFragment.kt
View file @
f7215a13
...
...
@@ -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
())
})
}
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
();
}
override
fun
onDestroy
()
{
gatt
.
close
();
super
.
onDestroy
()
mood_good
.
setOnClickListener
{
card10Service
?.
setRocketValue
(
ubyteArrayOf
(
0xffu
,
0x00u
,
0x00u
).
toByteArray
())
}
mood_neutral
.
setOnClickListener
{
card10Service
?.
setRocketValue
(
ubyteArrayOf
(
0x00u
,
0xffu
,
0x00u
).
toByteArray
())
}
mood_bad
.
setOnClickListener
{
card10Service
?.
setRocketValue
(
ubyteArrayOf
(
0x00u
,
0x00u
,
0xffu
).
toByteArray
())
}
}
}
app/src/main/java/de/ccc/events/badge/card10/sparkle/BeautifulFragment.kt
View file @
f7215a13
...
...
@@ -22,65 +22,27 @@
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
)
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
)
card10Service
=
ConnectionService
.
card10Service
handler
.
post
(
this
@BeautifulFragment
)
}
override
fun
onCreateView
(
inflater
:
LayoutInflater
,
container
:
ViewGroup
?,
savedInstanceState
:
Bundle
?):
View
?
{
...
...
@@ -88,18 +50,12 @@ class BeautifulFragment : Fragment(), Runnable {
}
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
()
}
}
app/src/main/java/de/ccc/events/badge/card10/time/Card10Service.kt
View file @
f7215a13
...
...
@@ -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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment